2010-07-22 4 views
4

J'essaie d'implémenter RSA en python (je suis nouveau sur python) pour mon cours, le problème que j'ai est que le code que j'ai écrit ne fonctionne pas pour les nombres de plus de 4 chiffres. une idée de pourquoi cela se passe? S'il vous plaît conseillerImplémentation de RSA en python

p =0 
q=0 
n=0#modules 
phyPQ = 0 
e = 0 #public key exponent 
d = 0#private key exponent 
c = '' 
m = '' 

def getPrimes(): 
    global p 
    global q 
    p = long(raw_input("Enter first prime p : ")) 
    q = long(raw_input("Enter second prime q : ")) 

def computeModules(prime1, prime2): 
    global n 
    n = prime1 * prime2 
    print "Modules is = "+ `n` 
    return n 

def computePhyPQ(prime1, prime2): 
    global phyPQ 
    phyPQ = (prime1 -1) * (prime2 -1) 
    print "The phyPQ is " + `phyPQ` 

def computePublickeyExponent(x): 
    pubKeyExponentList= [] 
    for i in range(1, x): 
     if x % i != 0: 
      pubKeyExponentList.append(i) 
    print pubKeyExponentList 
    global e 
    e = long(raw_input("Pick a public key exponent from the list above : ")) 

def computePrivateKeyExponent(phyQP, pubKeyExpo): 
    flag = 1 
    count = 0 
    while flag == 1: 
     count = count + 1 
     if (count * phyQP + 1) % phyQP == 1: 
      result = (count * phyQP + 1)/float(pubKeyExpo) 
      if result % 1 == 0: 
       global d 
       d = long(result) 
       print 'The private key exponent exponent is:' + `d` 
       flag = 0 

def encryptMessage(exponent, modules): 
    #c= m ^e mod n 
    global c 
    message= long(raw_input("Enter a value to be encrypted:")) 

    c = long((message ** exponent) % modules) 
    print'The encrypted message is :' + `c` 

def decryptMessage(modules, privateKeyExpo, cryptedMessage): 
    #m = c^d % n 
    global m 
    m = (cryptedMessage ** privateKeyExpo) % modules 
    print 'message after decrypting is :' + `m` 

def mainMethod(): 
    getPrimes() 
    computeModules(p, q) 
    computePhyPQ(p, q) 
    computePublickeyExponent(phyPQ) 
    computePrivateKeyExponent(phyPQ, e) 
    encryptMessage(e, n) 
    decryptMessage(n, d, c) 

mainMethod() 
+1

Voulez-vous dire que vous êtes * Obligatoire * pour le réimplémenter? –

Répondre

4

Votre problème est plus probable dans l'utilisation de l'arithmétique à virgule flottante:

 result = (count * phyQP + 1)/float(pubKeyExpo) 

Dans cet algorithme, il sera important d'utiliser des entiers de précision arbitraire arithmétique tout au long.

La version à trois arguments de pow() sera utile dans quelques endroits de votre implémentation. pow(x, y, z) calcule (x ** y) mod z pour les entiers de précision arbitraire.

+1

Nitpick mineur: le type 'float' de Python est réellement C' double' sous le capot (c'est-à-dire, l'arithmétique en virgule flottante en double précision). –

+1

@Daniel Stutzbach: Merci, corrigé. –

3

c = long((message ** exponent) % modules) n'est pas une implémentation appropriée, car elle est extrêmement lente.

Vous pouvez le remplacer par une exponentiation carrée et multipliée, une exponentiation de fenêtre glissante ou une échelle d'alimentation Montgomery.

Un bon exemple peut être trouvé ici: http://code.activestate.com/recipes/572196-rsa/

0

Vous ne pouvez pas utiliser des calculs numériques normaux pour le chiffrement. nombres a généralement un exposant de 1000. Utilisez une bibliothèque Python tels que de gmpy2 qui peut gérer des calculs avec d'énormes entiers

importation gmpy2 Ensuite, par exemple, le changement:

résultat = (nombre * phyQP + 1)/flotteur (pubKeyExpo)

à:

résultat = gmpy2.f_divmod (* compter phyQP + 1, pubKeyExpo)

si le résultat [0]> 0 et le résultat [1] == 0: