2010-07-22 144 views
4

我想在我的課程中實現RSA(在python中是新的),我遇到的問題是我編寫的代碼不適用於超過4位數字的數字。任何想法爲什麼發生這種情況?請指教在python中實現RSA

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

你是說,你是*爲必填*重新實現它? – 2010-07-22 19:02:27

回答

4

你的問題是最有可能在你使用浮點運算的:

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

在這個算法,這將是重要的是使用任意精度整數算術貫穿始終。

pow()的三參數版本將在您的實施中的一些地方有用。 pow(x, y, z)針對任意精度整數計算(x ** y) mod z

+1

Minor nitpick:在引擎蓋下(即雙精度浮點運算),Python的'float'類型實際上是C'double'。 – 2010-07-22 19:53:39

+1

@Daniel Stutzbach:謝謝,修正了這個問題。 – 2010-07-22 20:07:08

3

c = long((message ** exponent) % modules)不是一個適當的實施,因爲它是非常緩慢。

您可以用平方乘法指數,滑動窗口指數或蒙哥馬利助力梯取代它。

一個很好的例子可以在這裏找到:http://code.activestate.com/recipes/572196-rsa/

0

您不能正常使用數字計算進行加密。 號碼通常有1000 使用Python庫如gmpy2可以用巨大的整數處理計算

進口gmpy2 然後,例如,改變指數:

結果=(計數* phyQP + 1)/浮動(pubKeyExpo)

到:

結果= gmpy2.f_divmod(計數* phyQP + 1,pubKeyExpo)

如果結果[0]> 0,並導致[1] == 0: