Bonjour à tous,
je souhaite protéger un logiciel que je développe dans le cadre de mon taf et je souhaite le 'protéger' (tout est relatif) avec un numéro de série.
Je n'ai pas trouvé d'algo tout fait et personnalisable (en même temps j'ai pas cherché très loin) alors j'ai cherché un peu de mon côté et j'ai pensé à une méthode : utiliser la génération de clé MD5.
Bref résumé de ce qu'est une clé MD5 :
Une clé MD5 est une série de chiffre générée depuis un fichier et une table de nombres connue. La longueur de cette série reste constante (32) et indépendante de la taille de ce fichier (comme un numéro de série!). Cette méthode permet par exemple de télécharger un fichier volumineux et sa clé md5 et d'appliquer cette méthode au fichier et de comparer les 2 clé md5 (celle fournie et celle recalculée) pour vérifier qu'elles sont identiques et donc s'assurer que fichier téléchargé est complet et sans erreur (un simple bit inversé et la clé MD5 devient complètement différente)
Maintenant, comment appliquer cette méthode pour la génération de numéro de série? Exemple :
Remplacer dans l'algo de génération de clé MD5 (publique) la table initiale (donc inconnue du publique) et remplacer le fichier à coder par une série de chiffre de taille constante. Ensuite le numéro de série se compose ainsi :
XXXXXX YYYYYYYYYY
avec X : les chiffres qui vont servir à générer la clé MD5
avec Y : les n premiers chiffres de la clé MD5 (une clé de plus de 32 chiffres, ça va être lourd à saisir)
Le principe d'utilisation :
- Le programmeur saisie une série aléatoire de 5 chiffres, genre 12345 (complètement aléatoire :)
- Le programmeur applique l'algo modifié à cette série et obtient 35a47d68f435c48764f653e454b6876a
- Il décide que le numéro de série comprendra les 10 premiers chiffres de la clé, soit : 35a47d68f4
- Sa clé devient alors 12345 35a47d68f4, soit 1234535a47d68f4 pour avoir une série unique sans coupure (pour ne pas que la longueur de la première série soit connue)
Du côté de l'utilisateur final :
- L'acquéreur (légalement hein ;) du logiciel devra saisir au premier lancement du logiciel cette série : 1234535a47d68f4 (qu'il aura choppé sur la mule si le logiciel était trop cher ;)
- Le logiciel récupère la première série de chiffres de longueur connue (5) et obtient : 12345 (comme de par hasard!)
- Avec le même algo, il en déduit la clé MD5 (avec la même table personnalisée) et obtient 35a47d68f435c48764f653e454b6876a
- Il compare les chiffres restants de la série saisie par l'utilisateur (35a47d68f4) au 10 premiers caractères de la clé MD5 recalculé (35a47d68f435c48764f653e454b6876a)
- Le résultat étant identique, il accepte la clé et poursuit le chargement du logiciel et sauvant le numéro de série dans un fichier texte qu'il re-vérifiera à chaque lancement (donc pas moyen de caroter au second lancement)
La grande question de cette algo est : qu'en est-il de sa robustesse notamment face au reverse-engineering?
Si je l'applique, et si j'ai l'accord du boss, je diffuserai peut-être l'algo pondu (avec une table différente de la notre bien entendu ;)
Après, pour ce rapprocher des standards avec un modèle du style :
CCCC LLLL CCCC LLLL CCCC
avec C un chiffre et L un lettre (oui, avant on avait des a, b, c, d, e et f car c'était en hexa), on peut simplement décider que les lettres se transformeront en chiffres et inversement pour homogénéiser la série. A partir du moment ou l'algo est appliqué dans les deux sens (création, vérification), ça devrait fonctionner.