Skip to Content
Nouvelle version 12 disponible 🎉
ObfuscatorChiffrement du codeProtéger un algorithme

Protéger un algorithme avec le chiffrement du code

Un algorithme propriétaire est souvent ce qu’un assembly contient de plus précieux, et ce qu’il est le plus facile d’extraire directement d’un décompilateur. Cet exemple utilise le package NuGet Babel Obfuscator pour appliquer le chiffrement du code MSIL à un moteur de calcul de score avec une seule propriété MSBuild. C’est la configuration de chiffrement du code la plus simple : pas de Babel Licensing ni de licence à l’exécution, car le chiffrement du code par défaut incorpore la clé dans le binaire et l’application protégée s’exécute de façon autonome.

Pour utiliser cet exemple, vous avez besoin d’une licence de site pour Babel Obfuscator (édition Ultimate, Server ou Data Center). Le code source est disponible sur GitHub :

git clone https://github.com/babelfornet/code-encryption-nuget-example.git

Le code protégé est un algorithme propriétaire de calcul de score (src/AlgorithmApp/ScoringEngine.cs), le genre de propriété intellectuelle que vous ne voulez pas voir un concurrent extraire d’un décompilateur :

internal static class ScoringEngine { public static int Score(int recency, int frequency, int monetary) { int r = Bucket(recency, 3, 12, 30); int f = Bucket(frequency, 2, 5, 12); int m = Bucket(monetary, 50, 250, 1000); return Normalize(r * 25 + f * 17 + m * 11); // vendor's secret weighting } // Bucket / Normalize … }

Après le chiffrement, les corps de Score, Bucket et Normalize ont disparu de l’IL et ne sont reconstruits que par la machine virtuelle Babel, à l’exécution. Le projet console AlgorithmApp chiffre le type sensible en Release :

<ItemGroup Condition="'$(Configuration)' == 'Release'"> <PackageReference Include="Babel.Obfuscator" Version="12.0.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> </ItemGroup> <PropertyGroup Condition="'$(Configuration)' == 'Release'"> <MsilEncryption>AlgorithmApp\.ScoringEngine::.*</MsilEncryption> <BabelWarningsAsErrors>W00000</BabelWarningsAsErrors> </PropertyGroup>

MsilEncryption est une expression régulière qui sélectionne les méthodes à chiffrer, ici toutes les méthodes du type ScoringEngine. Babel réécrit ces corps de méthode en instructions chiffrées personnalisées que seule la machine virtuelle Babel peut exécuter. Il s’agit du chiffrement du code par défaut (sans <Source>) : une licence Babel n’est donc requise qu’à la génération, et l’application protégée s’exécute de façon autonome.

Générer l’exemple en Release chiffre les trois méthodes de calcul de score sans modifier la sortie du programme, et l’IL de l’algorithme n’est plus présent dans l’assembly. Pour que le code chiffré ne se déverrouille qu’avec une licence valide, de sorte que supprimer le contrôle de licence ne suffise pas, voir les exemples consacrés aux licences ci-dessous.

Last updated on