首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python crypto rsa问题

python crypto rsa问题
EN

Stack Overflow用户
提问于 2012-07-13 15:24:53
回答 2查看 1.3K关注 0票数 5

python Crypto包中的RSA加密/解密似乎有问题:

代码语言:javascript
复制
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吗?

代码语言:javascript
复制
>>> test(1024,128,0)
(853, 147)
>>> test(1024,127,0)
(996, 4)
>>> test(2048,127,0)
(994, 6)
EN

回答 2

Stack Overflow用户

发布于 2012-07-13 16:05:05

试试这个:

代码语言:javascript
复制
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对数字进行操作,而不是在内部对字节进行操作,这意味着不会考虑前导零。encryptdecrypt是非常低级的。

对于签名,您应该使用Signature包(pycrypto2.5+),它负责正确填充您的消息。否则你必须自己填充你的信息。

票数 3
EN

Stack Overflow用户

发布于 2012-07-13 16:00:59

以NUL (\x00')开头的输入字符串每次解密都会失败。如果将原始字符串与解密版本进行比较,您会注意到原始字符串以'\x00'开头,而恢复的版本将删除第一个字节,例如

代码语言:javascript
复制
>>> 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,并用字符串的其余部分进行加密。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11465936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档