我正在尝试在我的课程中在python中实现RSA(我是python的新手),我遇到的问题是我写的代码不适用于超过4位的数字。知道为什么会这样吗?请建议
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()
答案 0 :(得分:4)
您的问题很可能是您使用浮点运算:
result = (count * phyQP + 1) / float(pubKeyExpo)
在此算法中,始终使用任意精度整数算法非常重要。
pow()
的三参数版本将在您的实现中的一些地方有用。 pow(x, y, z)
为任意精度整数计算(x ** y) mod z
。
答案 1 :(得分:3)
c = long((message ** exponent) % modules)
不是一个正确的实现,因为它非常慢。
您可以使用square-and-multiply幂运算,滑动窗口取幂或Montgomery供电梯来替换它。
可以在这里找到一个很好的例子:http://code.activestate.com/recipes/572196-rsa/
答案 2 :(得分:0)
您无法使用常规数值计算进行加密。 数字通常具有1000的指数。 使用可以处理大整数计算的 gmpy2 等python库
导入gmpy2 然后,例如,更改:
result =(count * phyQP + 1)/ float(pubKeyExpo)
为:
result = gmpy2.f_divmod(count * phyQP + 1,pubKeyExpo)
如果result [0]> 0且result [1] == 0: