python加密rsa issu

2024-04-26 23:58:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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\u-len的组合是什么,我都无法让它100%地解密。只是我安装了密码吗?在

^{pr2}$

Tags: fromtestimportlenosdefokcrypto
2条回答

对于以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并用字符串的其余部分进行加密。在

试试这个:

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和{}是非常低级的。在

对于签名,您应该使用^{}包(pycrypto2.5+),它负责正确填充消息。否则你就得自己填你的信息。在

相关问题 更多 >