Ben en fait je n'ai pas compris quel résultat tu cherches. Tu veux l'int correspondant à la clef c'est ça?
Mais la clef ce n'est pas un int !!! C'est une combinaison de plein d'int !!!
Principe de base de RSA
- choisir P et Q premiers (exemple 89 et 97)
- calculer delta=(P-1) * (Q-1) => 8448
- calculer N=P*Q => 8633
- choisir e tel e premier avec delta => pgcd(e, delta)=1. Exemple e=7, pgcd(7, 8448) est bien égal à 1 => la clef publique sera le coupe (N, e) soit ici (8633, 7)
- choisir une valeur "d" telle que (d * e) modulo delta = 1. Exemple d=1207 => 1207 * 7 = 8449 et 8449 modulo 8448 est bien égal à 1. La clef privée sera le couple (N, d) soit ici (8633, 1207)
A partir de là, pour chiffrer une valeur (exemple) 555 sur la clef publique (N, e) on calcule (555^e) modulo N soit (555^7) % 8633 = 2928
Et pour déchiffrer 2928 avec la clef privée (N, d) on calcule (2928^d) modulo N soit (2928^1207) % 8633 = 555
Et pour signer c'est dans l'autre sens. Exemple on veut signer 667 via la clef privée (N, d) on calcule (667^d) modulo N soit (667^1207) % 8633 = 8625
Et on vérifie la signature avec la clef publique (N, e) via (8625^e) modulo N soit (8625^7)%8633 ce qui redonne 667.
Ci-joint un petit essai quand j'ai tenté du chiffrement en Python: Alice envoie un message vers Bob en utilisant la clef publique de Bob, et signe ce message en utilisant sa clef privée.
Et Bob déchiffre le message avec sa clef privée et vérifie qu'il vient bien de Alice en checkant sa signature via la clef publique de Alice.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #!/usr/bin/env python3
# coding: utf-8
from Cryptodome.PublicKey import RSA
from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_OAEP
from Cryptodome.Signature import PKCS1_PSS
from Cryptodome.Hash import SHA
message="Hello Woréld !!!"
print(message, type(message))
alice=RSA.generate(2048)
bob=RSA.generate(2048)
print(alice.publickey().exportKey())
print(bob.publickey().exportKey())
secret={
"chiffre" : PKCS1_OAEP.new(bob.publickey()).encrypt(message.encode("utf-8")),
"sign" : PKCS1_PSS.new(alice).sign(SHA.new(message.encode("utf-8"))),
}
final=PKCS1_OAEP.new(bob).decrypt(secret["chiffre"]).decode("utf-8")
print("ok déchiffrement" if message == final else "erreur chiffrement")
verify=PKCS1_PSS.new(alice.publickey()).verify(SHA.new(final.encode("utf-8")), secret["sign"])
print("%s signature (%s)" % ("ok" if verify else "erreur", verify)) |
Partager