背景:
我尝试在一个简短的明文(例如32字节)上应用一系列RSA加密和解密步骤。每个步骤都有一个专用的RSA密钥,例如2048字节。我使用的是cryptopython包。在
我的第一个问题是:
keyAlice = RSA.generate(2048)
print keyAlice.size()
这将打印2047
,而不是{2049
作为输入失败。在
有人能告诉我为什么size()
方法返回的大小与我输入的不同吗?在
这种奇怪的感觉不会困扰我,但它可能是关于我主要问题的线索:
对于我的目标,发信人(爱丽丝)应采取几个步骤,例如
(我假设所有钥匙的大小都一样。)
然后接收器(Bob)可以应用相反的方法:
任何加密/解密步骤的结果都会产生一个256字节(2048位)的str
。在
Note: Sometimes the result is shorter, e. g. 255 bytes; as I found out this means stripped zero-bytes at the beginning; padding them solves the issue.
如果我把它作为下一步的输入,这就行了
ValueError: Plaintext too large
。在我试图弄清楚在哪些情况下会发生这种情况,哪种类型的输入会导致这种情况发生,但这种情况很少发生(约3%的情况),因此我找不到简单的解释(因此没有解决办法)。在
我的问题是:
size()
方法为2048位密钥返回2047
?(见上文。)encrypt()
和decrypt()
方法有时对2048位的输入有问题(而它们大多没有处理问题的问题)?在encrypt(encrypt(x))
从不失败),为什么他们从不有任何问题?在下面是我使用的一些代码来说明问题:
^{pr2}$
RSA是一种代数密码体制。它只处理数字而不是字节。加密是通过
Enc(m,e,n) := me mod n = c
给出的,其中m
是消息,e
是公共指数,n
是模数,c
是密文。需要注意的是,m < n
必须严格为真。否则,它将无法解密。为了完整起见,解密是
Dec(c,d,n) := cd mod n = Enc(c,d,n)
完全相同的操作,其中d
是私有指数。在如果有两个不同的键,则操作如下所示:
现在,如果}之间的距离。在
n2 < n1
,那么它可能导致c1 > n2
,因此不可解密。并非所有情况下都会发生这种情况,这取决于n1
和{如果
^{pr2}$n2 > n1
,那么“sending”将“工作”,但是在接收端,您将颠倒模块的顺序,从而再次运行创建大于模数的恢复消息的可能性。它看起来像这样:不用说,你不应该设计依赖于机会的协议。在
研究方案应该是怎样的
您所追求的协议称为加密然后签名。下面的问题和答案提供了有关该问题的知识和链接的良好缓存:Should we sign-then-encrypt, or encrypt-then-sign?
不管您决定什么,您都需要使用加密和签名生成的填充版本。在pycrypto中,应该使用^{} for encryption 和{a3}。请记住,已签名的数据必须可用于接收方的验证。这意味着“用私钥加密”是不可能的,因为接收者无法根据任何东西来检查他们加密的数据。在
发件人:
接收人:
这看起来像一个bug,不应该发生在this code中。不过,这是一个相当小的错误。在
相关问题 更多 >
编程相关推荐