我需要使用ECB(电子代码簿)作为学校作业来实施RSA算法。我知道ECB是坏的,我不应该在现实生活中使用这样的东西,但我在这里没有其他选择(我们最终将它转为CBC,然后转向AES,但目前我需要使用ECB)。
我偶然发现链接加密块的问题:假设我有一个256位大小的密钥,因此我将每个块大小设置为256位(块大小=密钥大小)。我还要确保填充最后一块,以防它的尺寸变小。问题是加密的块结果大小是变化的,所以我不知道如何链接结果,所以当我解密数据时,我会确切知道块何时开始以及何时块结束。在这种情况下,常见的事情是什么?我想在每个块之间放置一些分隔符,但我认为这是一个糟糕的解决方案。
答案 0 :(得分:2)
RSA使用内部填充,因此您无需填充输入。 RSA加密通常可以在两种不同的填充模式下执行:OAEP和PKCS#1.5填充。两者都为每个块添加了大量的填充 。这不同于例如AES填充,其中填充仅在最后一个块上执行 以进行加密。另外不同的是RSA的安全性很大程度上依赖于填充,因此必须才能执行。
现在,因为每个块都被填充,显然适合块的纯文本小于密钥大小(模数的大小)。换句话说,块大小小于密钥大小。在PKCS#1.5的情况下,它比密钥大小小11个字节(如果它至少在字节边界上)。保持稍高(例如最多19个字节)的块大小在安全性方面会更好,但填充的8个字节应该是(安全的)随机字节。
使用Java,您实际上可以从Cipher
对象询问块大小,对于RSA,它将正确地从密钥大小中减去开销。否则你将不得不自己计算。如上所述,您不需要填充最后一个块,块填充将填充最后一个块。
请注意,RSA PKCS#1规范是免费下载的。因此,您可以自己为(更强硬的)OAEP填充进行计算。对于你的特定任务,我会保持1.5填充。
答案 1 :(得分:0)
欧洲央行是block cipher mode of operation。 RSA是一种公钥加密方案,而不是block cipher,因此“ECB模式下的RSA”并没有真正意义。我怀疑在原来的作业与你对它的描述之间的某些地方肯定会混淆。
在任何情况下,实际块密码的输出长度始终是常量(并且等于输入块长度)。 可能让您感到困惑的一件事是加密输出偶尔会包含空字节,因此您不能将其视为以空字符结尾的字符串。只需将输出视为固定长度的二进制数据块,您就可以了。