Cryptage asymétrique simple

Soyez le premier à donner votre avis sur cette source.

Vue 11 225 fois - Téléchargée 749 fois

Description

Après avoir quelque peu critiqué les codes sur le cryptage, on m'a demandé de faire un exemple ... le voici

Un cryptage asymétrique utilise deux clés (ou plus, peu importe) : une privée et une publique

La clé privée est détenue par le receptionneur du message qui pourra ainsi décrypter le message que l'emmeteur à codé avec une autre clé, dite publique.

La clé publique est calculée a partir de la clé privée, et on ne peut pas retrouver la clé privée a partir de la clé publique. C'est le principe de RSA par exemple.

En dehors de la sécurité accrue par rapport a un cryptage "simple" ou symétrique, il y a, du fait meme de cet algorithme, et aussi a cause du VB, des limites a ce programme... Je les met de suite :
- chaque message crypté a environ 8× la taille du message d'origine
- j'ai mis une séparation claire (le petit ; ) entre les lettre cryptées, ce qui permettrais de faciliter une eventuelle tentative de décodage
- le programme est limité a de petits nombres (or plus les nombres sont grands, plus la sécurité augmente) a cause du type Long de VB (limité à 32 bits)

Tout ca pour dire...ce n'est pas RSA, ce n'est pas infaillible. Mais par rapport au XOR ou autres, y'a pas photo :)

Conclusion :


Le principe mathématique pour ceux que ca intéresse :

soit une suite b(b0, b1, b2, b3, ..., b6, b7) de nombres entiers tels que b(i) soit supérieur à la somme de ses prédécesseurs

P doit etre plus grand que la somme de tous les b. Q doit etre premier avec P.

P, Q et b constituent la partie privée du code.

soit a(a0, a1, a2, a3, ..., a6, a7) de nombres entiers tels que a(i) = kP +Qb(i) avec k un entier quelconque.

a consitue la clé privée.

On transmet donc uniquement la clé publique, qui permet de crypter, et on garde (précieusement :P) la clé privée et le couple P, Q

Pour crypter, on décompose un nombre K en binaire (ex "A" = 41 = 0101001) puis on crée le code R tel que R = K(0)a(0) + K(1)b(1) ....

R représente donc le chiffre (ou la lettre) K codé avec la clé publique.

Pour décrypter, il faut donc le message crypté R, la clé privée b et le couple P, Q

On calcule u et v tels que Pu + Qv = 1.
On calcule H, reste de la division Rv/P

On a alors H = K(0)b(0) + K(1)b(1) + ...
Et b(i)> a tous ses prédecesseurs

Si H - b(7) > 0 alors c(7) = 1
Si H - b(6) > 0 alors c(6) = 1 ...

On finit par obtenir c(c0, c1, c2, c3, ...) qui est la représentation binaire du message d'origine, dans notre exemple, 0101001 = "A"...

C'est assez simple, rapide, et relativement sûr :)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
285
Date d'inscription
mercredi 20 août 2003
Statut
Membre
Dernière intervention
13 février 2005

Tout premièrement, la représentation que j'ai faite de la sortie (xxxxxx; xxxxxx; xxxxxx ....) est une représentation hexadécimale, donc 255 serait FF, 65535 FFFFF ... si j'ai mis les <;> c'est pour séparer les différents "chiffres" du code. Dans une implémentation plus "professionelle", on aurait plutot tendance a encoder ce chiffre sous forme d'un entier binaire (65534 = chr$(255) & chr(254)) qui réduit de beaucoup la taille et a l'avantage de séparer plus discrètement (par exemple si tu utilises toujours 4 octets pour encoder un chiffre, plus besoin de mettre explicitement un <;>)

Donc pour répondre clairement à la question, avant de modifier le décrypteur, il faut déjà que je sache comment se présente la sortie de l'encrypteur. Si le nombres de caractères est fixe pour chaque chiffre, alors on pourra se passer des <;> dans le cas contraire je ne vois pas comment :)

Pour s'assurer de la validité du message, on peut placer un MD5 (crypté il assurerait une validité totale, décrypté il peut etre un risque si on connait la taille du message) je peux te donner des exemples.

Robuste, on peut le supposer, étant donné que l'on travaille avec des chiffres, des combinaisons de grands chiffres - la faillibilité du programme réside justement dans la taille des chiffres. Ici, bridé par le type Long de Visual Basic , j'ai du me contenter de "petits" entiers et il s'avère que, meme si le code ici est plus robuste (a coup sur) qu'un Vigenère, XOR (voire DES :P) il n'en reste pas moins discutable face à Rijndael, RSA ...

Dans la théorie, tu peux utiliser de très grands entiers. RSA multiplie des facteurs premiers, et la difficulté pour le casser tient dans la factorisation de grands nombres, forcément d'autant plus longue que le nombre est grand. Mon code additionne plusieurs grands entiers en combinaison. On ne peut pas retrouver directement le code comme avec RSA, mais mon code aurait peut etre, je le suppose, une faiblesse face aux attaques différencielles (cad si on connait un message et sa forme cryptée en ayant le crypteur en libre accès)

Une réponse un peu complexe mais la plus complète possible je l'espère.

Vlad
Messages postés
21
Date d'inscription
mardi 29 octobre 2002
Statut
Membre
Dernière intervention
15 mars 2007

Votre code est très intéressant et assez robuste à mon avis. Toutefois, J'aimerais savoir au cas où on éliminerais le caractère <;> lors du cryptage, comment faudrait-il modifier le code du décrypteur? et aussi quel traitement préalable peut-on appliquer au texte crypté afin de s'assurer de sa validité lors du décryptage?
En attendant je vous donnerais bien un 8/10.
Messages postés
285
Date d'inscription
mercredi 20 août 2003
Statut
Membre
Dernière intervention
13 février 2005

tbbuim1> C'est effectivement une simple démonstration technique, je ne cherches pas a te concurrencer, ni d'ailleurs à l'utiliser pour msn !

sunny>"A" 65 en ASCII 41 en hexadecimal = 00101001 en binaire
Alors R K(0)×a(0) ... (le dernier chiffre binaire)×a(0) +(l'avant dernier)×a(1) ...

Pu + Qv = 1 ... c'est le théorème de Bezout, utilisé dans mon programme :) donc il y a assez d'informations (c qd meme pas des maths de niveau sup c une simple equation du premier degré !)

Valà
Vlad
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
3 février 2011
8
Bien, mais tu n'as fait qu'appliquer un principe mathématique. Hors dans mon cas, j'avais fait ce programme exclusivement pour crypter mes messages sous msn. Ce que tu auras du mal à faire car ton programme augmente de trop la taille du message d'origine et tu seras donc limité par msn qui coupera ton message! >:( Et ce dernier sera donc perdu en partie ou en totalité :'( En revanche, tu y gagnes en sécurité, point très positif.
Pas mal, pas mal, tu as bien retenu tes courts de maths ^^ je te mets 8 car ce n'est pas parfait, mais c pas du kk non plus :p
Messages postés
6
Date d'inscription
vendredi 21 décembre 2001
Statut
Membre
Dernière intervention
7 octobre 2004

Pas mal, mais tout n'est pas clair, par ex :
Pour crypter, on décompose un nombre K en binaire (ex "A" 41 0101001) puis on crée le code R tel que R = K(0)a(0) + K(1)b(1) ....et la suite K(2)a(2) ou b(2)

Ensuite on a Pu + Qv = 1 , pas assez d'info pour résoudre l'équation à moins de choisir u ou v au hasard.
( si v=0 est-ce que cela marche ?)
u sert à quoi car il n'apparait pas dans la suite des explications

Je vais regarder le code pour voir !!

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.