python Crypto包中的RSA加密/解密似乎有问题:
from Crypto.PublicKey import RSA
from os import urandom
def test(keylen, datalen, rand_len):
k = RSA.generate(keylen)
ok, fail = (0,0)
for i in range(1000):
a = urandom(datalen)
if a == k.decrypt(k.encrypt(a, urandom(rand_len))):
ok += 1
else:
fail += 1
return ok, fail无论我做什么keylen/datalen/rand_len的组合,我都不能100%地解密它。只是我安装了Crypto吗?
>>> test(1024,128,0)
(853, 147)
>>> test(1024,127,0)
(996, 4)
>>> test(2048,127,0)
(994, 6)发布于 2012-07-13 16:05:05
试试这个:
from Crypto.PublicKey import RSA
from os import urandom
def test(keylen, datalen, rand_len):
k = RSA.generate(keylen)
ok, fail = (0,0)
for i in range(1000):
a = urandom(datalen).lstrip(b'\x00')
if a == k.decrypt(k.encrypt(a, urandom(rand_len))):
ok += 1
else:
fail += 1
return ok, fail解释:
pycrypto对数字进行操作,而不是在内部对字节进行操作,这意味着不会考虑前导零。encrypt和decrypt是非常低级的。
对于签名,您应该使用Signature包(pycrypto2.5+),它负责正确填充您的消息。否则你必须自己填充你的信息。
发布于 2012-07-13 16:00:59
以NUL (\x00')开头的输入字符串每次解密都会失败。如果将原始字符串与解密版本进行比较,您会注意到原始字符串以'\x00'开头,而恢复的版本将删除第一个字节,例如
>>> a = '\x00\xa4\x8aE\xb5,\x1a\x95)Q'
>>> b = k.decrypt(k.encrypt(a, urandom(rand_len)))
>>> a == b
False
>>> len(a)
10
>>> len(b)
9
>>> a
'\x00\xa4\x8aE\xb5,\x1a\x95)Q'
>>> b
'\xa4\x8aE\xb5,\x1a\x95)Q'您将注意到,除了第一个字节之外,a和b是相同的。
显然,NUL对于C字符串的终止很重要,但我很惊讶它以这种方式失败了,而不是简单地将原始字符串视为空字符串。我猜这个库只是跳过任何前导NUL,并用字符串的其余部分进行加密。
https://stackoverflow.com/questions/11465936
复制相似问题