Lynx : chiffrement à bloc/flux, exemple inclus

Soyez le premier à donner votre avis sur cette source.

Vue 5 516 fois - Téléchargée 916 fois

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

Ajouter un commentaire

Commentaires

SNARPORY
Messages postés
8
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
10 août 2009
-
Salut
je maintiens ma remarque et l'explicite , ( même s'il ne s'agit que d'un détail mineur )
la valeur 0 n'étant pas prise en compte il n'y a bien que 255 possibilités de longueur de clef et donc sauf erreur de ma part de 8 à 2040 bits pour la clef selon que l'on passe une valeur de 1 à 255
d'autre part si cela interesse certaine personne et que je trouve comment poster un programme je peux fournir une version non normalisée ( il n'a pas de norme car les spécifications Sha_2 sont limitées à 512 Bits )permettant de calculer un hachage de 2048 bits à partir du moteur SHA512
Cirec
Messages postés
3810
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
9 décembre 2019
34 -
@SNARPORY:

juste pour infos:
de 1 à 255 == 255
le Type Byte va de 0 à 255 ce qui donne bien 256 Octets disponibles au bout du compte !!

voilà ... sinon pour la note tu peux la redonner. ;)
SNARPORY
Messages postés
8
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
10 août 2009
-
Mauvaise frappe lors de la notation il fallait lire 9/10 et non pas 5/10
désolé mais je ne sais pas comment la modifier !
SNARPORY
Messages postés
8
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
10 août 2009
-
Salut
désolé pour le délai vis à vis de la publication!
Pour être rigoureux il faut préciser que la taille maximale de la clef n'est pas de 256 Octets mais de "seulement" 255 Octets car la longueur passée en paramètre lors de la génération de la KEY est exprimée sur un byte.
Obtenir une clef de 2040 bit pour exploiter les possibilitées maximales du programme à partir d'un algorithme de hachage par exemple n'est pas très facile car les algorithmes standarts sont limités à 512 bit ( SHA_512 ).
dje_jay
Messages postés
58
Date d'inscription
mercredi 17 décembre 2003
Statut
Membre
Dernière intervention
16 février 2011
1 -
Une bonne note: une! Je n'ai pas fais tourner le source, mais il me parait clair... Ça manque juste un peu de commentaires...
Recommandations d'usage : NE PAS UTILISER POUR PROTEGER DES INFORMATIONS SENSIBLES!!!
(L'algorithme n'est pas éprouvé : Je maintiens ma position quant à la fiabilité face à Blowfish).
Bel effort!

Jérôme

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.