Bonjour à tous,
Durant mon temps libre, je bidouille en C et en crypto et je me demandais comment gérer directement (sans passer par des librairies telles GMP) des clés de 256 bits. J'entend par la générer ces clés, les stocker et les manipuler (faire des XOR avec un bloc de texte par exemple).
J'imagine que cela doit passer par des tableaux, mais n'étant pas expert dans le domaine, j'aurais voulu avoir un peu de doc sur le sujet.
Note : inutile de me renvoyer vers les codes sources d'openssl et gmp, j'y suis déjà allé mais ils sont trop complexes pour être compris rapidement.
Merci,
Julien
# Wikipédia, par exemple
Posté par Obsidian . Évalué à 2.
C'est très adapté à l'assembleur, également, si tes orientations sont la concision, l'indépendance et la performance du code.
http://fr.wikipedia.org/wiki/MD5
http://fr.wikipedia.org/wiki/Rivest_Shamir_Adleman
http://fr.wikipedia.org/wiki/Digital_Signature_Algorithm
http://fr.wikipedia.org/wiki/SHA-256
[^] # Re: Wikipédia, par exemple
Posté par jve (site web personnel) . Évalué à 2.
Je connais ces algorithmes et je les utilisent régulièrement via différentes API (le plus souvent, openssl).
La, ce que je souhaite étudier, c'est les calculs sur des clés de 1024 bits (par exemple) en C.
Comment on les stockent ? Comment on les calculent ?
[^] # Re: Wikipédia, par exemple
Posté par khivapia . Évalué à 2.
Par exemple, on peut les stocker comme un tableau d'entiers machine int, et faire les opérations comme à la main, avec les retenues, etc.
Puis améliorer les divers algorithmes, etc. etc. Wikipedia donne pas mal d'infos à ce sujet http://fr.wikipedia.org/wiki/Arithm%C3%A9tique_binaire
Pour la multiplication, il y a par exemple l'algorithme de Karatsuba http://fr.wikipedia.org/wiki/Algorithme_de_Karatsuba
[^] # Re: Wikipédia, par exemple
Posté par Obsidian . Évalué à 2.
Gérer une clé de 1024 bits se fait de la même manière que pour une clé de 128. Dès lors que l'on dépasse la taille d'un registre (ou des types prédéfinis), il faut vectoriser. Le plus simple est effectivement d'utiliser un tableau d'octets consécutifs.
La plupart du temps, il s'agit de décalage et d'opération bit à bits, et de quelques opérations arithmétiques (domaines dans lesquels le jeu d'instruction d'un CPU excelle, généralement).
Si ce qui te préoccupe en premier lieu est la manière de traiter de grands objets, cela se fait généralement comme à l'école, en arithmétique, avec une retenue du format des blocs que l'on traite. Cela peut être un bit, un octet, un long de 32 bits, etc. Par exemple, lorsque l'on calcule des CRC, on est amené à considérer tout un bloc de données comme un immense nombre qu'il faudrait diviser par une valeur fixe. Pour ce faire, le plus simple est d'utiliser l'approche habituelle : tu commences par le premier octet (ou plus précisément le premier bloc du format de ton diviseur), tu soustrais, tu décale, et tu "fais descendre" le bloc suivant simplement en allant le lire en mémoire.
En fait, il faut se souvenir que ce qui est applicable en base 10 l'est généralement dans les autres aussi. Tu peux travailler en base 2, s'il le faut, comme en base 256,
# xyssl
Posté par dowst . Évalué à 1.
j'ai eu à faire de la crypto en C et je me suis tourner vers xyssl. Le code est superbement bien écrit et facile à appréhender (beaucoup plus facile qu'openssl). Donc je te conseil vivement d'aller faire un tour sur xyssl.org
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.