Lynx : chiffrement à bloc/flux, exemple inclus

Description

Salut à tous,
voici un nouvel algorithme de chiffrement à bloc ou à flux, Lynx, qui vous permettra de chiffrer ("crypter") des données quelconques de façon sûre. Bon, d'abord, cet algorithme peut théoriquement chiffrer n'importe-quoi, c'est à la base un chiffrement à bloc, mais il peut en tant que tel être converti en chiffrement à flux, en une fonction de hachage, en un générateur pseudo-aléatoire, ... moyennant un peu de travail.

Mais dans cette source, j'inclus les fonctions de base de l'algorithme, c'est-à-dire le key schedule (création de la clef), le chiffrement d'un bloc et le déchiffrement d'un bloc. J'inclus également le mode de chiffrement CFB (qui transforme Lynx en un algorithme à flux, voir "Modes d'opération" sur Wikipédia), avec trois fonctions utiles. L'exemple permet de chiffrer/déchiffrer des fichiers.

Dans l'exemple, j'utilise MD5 pour générer des clefs à partir d'une chaîne de caractères, merci à F0xi pour sa source. MD5 génère des empreintes de 128 bits, ce qui nous donne une sécurité théorique de 128 bits pour Lynx, qui en accepte au maximum 2048. Evidemment, vous pouvez utiliser n'importe quelle fonction de hachage, j'ai pris MD5 pour sa simplicité et car c'est connu.

Lynx.pas contient les fonctions suivantes.
- KeySchedule : cette fonction permet de créer une clef qui sera utilisée pour le chiffrement, dans une structure TSubkeys. On peut donner à cette fonction n'importe quelle donnée, la fonction la transformera en clef très rapidement.
- EncryptBlock : cette fonction chiffre un bloc de 64 bits, tout simplement.
- DecryptBlock : l'inverse de la fonction EncryptBlock ...
- Encrypt : cette fonction prend en paramètre une donnée de longueur quelconque, une structure clef, un vecteur d'initialisation, un callback optionel (pour savoir où en est le chiffrement), et chiffre le tout en mode CFB.
- Decrypt : l'inverse de la fonction Encrypt !
- EncryptFile : pratiquement les mêmes paramètres que Encrypt, mais là vous chiffrez un fichier. Le paramètre "DoDecrypt" permet de dire à la fonction si on veut chiffrer (DoDecrypt = False), ou déchiffrer (DoDecrypt = True). Il est possible de fournir un callback.

Notes :
- un "vecteur d'initialisation" est comme une seconde clef, mais il peut être rendu publique sans soucis. En fait, vous pouvez garder la même clef pour chiffrer autant de messages que vous voulez, mais à chaque message vous devrez changer le vecteur d'initialisation (ne pas le faire réduira un petit peu la sécurité). Ici, il est sur 64 bits.
- le callback doit être une fonction qui prend deux paramètres cardinaux sur 32 bits, et retourne un booléen. Le premier paramètre indique l'avancement du (dé)chiffrement relatif au deuxième paramètre, et si la fonction renvoie True, le (dé)chiffrement s'arrête sans préavis.
- si vous arrêtez un chiffrement sans préavis, il risque d'être difficile d'obtenir le fichier correct à nouveau. Faites attention ...

>> ATTENTION <<

L'exemple va directement chiffrer le fichier sélectionné - il ne fera aucune sauvegarde. Faites des copies où proposez des fichiers de test, car si vous perdez le vecteur d'initialisation ou la clef, je peux sans trop de risques vous assurer que votre fichier est perdu à jamais. De par cet avertissement, je décline toute responsabilité en cas de pertes de données.

Quelques notes en plus :
- La sécurité de l'algorithme Lynx devrait être suffisante pour à peu près tous les besoins, sauf les secrets absolus (vaut mieux pas prendre de risques !), et son utilisation est libre, donc faites comme vous voulez :)
- Si vous avez des questions sur l'algorithme, ne pas hésiter à poser un commentaire ou à me MP.
- Si vous avez implémenté l'algorithme dans un autre langage/mode d'opération et voulez m'en faire part, n'hésitez pas !

Source / Exemple :


// In the zip

Conclusion :


Comme toujours, tous commentaires, critiques, remarques, conseils, ... sont les bienvenus !

Cordialement, Bacterius !

PS : codé sous Delphi 6 Personal Edition / Vista x64.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.