在python中使用rsa加密时处理零

时间:2013-12-13 05:33:04

标签: python encryption rsa

我已经给了一个单词“NETLAB”并且被告知通过给每个字母一个两位数的位置代码以下面的方式加密它,所以这就变成了14,15,20,12,01,02。下一步是在4个数字的3个块中处理这些,所以它们变成1405,2012和0102,我可以加密和解密前两个罚款,但是,我遇到了试图用'0102'加密和解密的问题,我很确定这是由于数字从0开始,并且它是一个int,0被忽略,这对加密/解密数据没有帮助。所以我的问题是如何阻止0被忽视?我已经尝试将所有数字放入一个数组然后连接它们但我在使用列表和计算能力时遇到了问题。我的代码如下:

from __future__ import division
import fractions
import itertools
import urllib2

ml = []
p = 47
q = 59
x = 2
d = 0
e = 0


z = (p-1)*(q-1)
print z
n = p*q
print n

for x in range(z):
    if (fractions.gcd(x, z) == 1):
        ml.append(x)
    ##print ml

s = 2
for s,x in itertools.product(range(65),ml):
    t = s * x 
    if t == z + 1:
        ##print s
        ##print x
        break
d = x
e = s
print d
print e

med = []
message = "NETLAB"
for c in message:
    m = ord(c) - 64
    m = ("%02d" % m)
    med.append(m)
    print m

print "m^e(mod n)"

A = med.join(0, 1)
##B = 
##C = 


Ea = A ** e % n
##Eb = B ** e % n
##Ec = C ** e % n 

print Ea
##print Eb
##print Ec


print "Ea^d(mod n)"
Da = Ea ** d % n
##Db = Eb ** d % n
##Dc = Ec ** d % n

print Da
##print Db
##print Dc

1 个答案:

答案 0 :(得分:0)

我认为这一切都取决于领先的0被“忽视”的意思。当您应用以下表达式时,您暗示A是一个整数:

Ea = A ** e % n

在位置符号中,前导零没有任何价值,但这并不意味着它们被忽视。整数0102的值始终为102,而对于任何其他x,x102的值不会为102.

至于输出(假设您将其写入文件,或其他前导0很重要的编码),那么它只是格式化问题。例如,您可以尝试以下功能:

def encrypt_decrypt(m,d,e,n):
    print "m           %4s" % m

    Ea = (int(m) ** e) % n
    print "Ea          %d" % Ea

    Da = (Ea ** d) % n
    print "Ea^d(mod n) %04d" % Da

使用

调用此函数
encrypt_decrypt(''.join(med[0:2]),d,e,n)
encrypt_decrypt(''.join(med[2:4]),d,e,n)
encrypt_decrypt(''.join(med[4:6]),d,e,n)

提供输出

m           1405
Ea          2641
Ea^d(mod n) 1405
m           2012
Ea          1453
Ea^d(mod n) 2012
m           0102
Ea          1395
Ea^d(mod n) 0102

(请注意,我使用了以下内容......

p = 47
q = 59
x = 2
d = 5
e = 0

...)