2010-07-22 55 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: