0

我需要使用 ECB(电子密码本)作为学校作业来实现 RSA 算法。我知道 ECB 很糟糕,我不应该在现实生活中使用这样的东西,但我在这里别无选择(我们最终会将它转为 CBC,然后转向 AES,但目前我需要使用 ECB)。

我偶然发现了链接加密块的问题:假设我有一个大小为 256 位的密钥,因此我将每个块大小设置为 256 位(块大小 = 密钥大小)。我还确保填充最后一个块,以防它的大小更小。问题是加密的块结果大小不同,所以我不知道如何链接结果,这样当我解密数据时,我会确切地知道一个块何时开始以及何时结束。在这种情况下,常见的做法是什么?我想过在每个块之间放置某种分隔符,但我认为这是一个糟糕的解决方案。

4

2 回答 2

2

RSA 使用内部填充,因此您不需要填充输入。RSA 加密通常可以在两种不同的填充模式下执行:OAEP 和 PKCS#1.5 填充。两者都为每个块添加大量填充。这与例如 AES 填充不同,其中填充仅在要加密的最后一个块上执行。同样不同的是,RSA 的安全性严重依赖填充,因此必须执行。

现在,因为每个块都被填充,显然适合块的纯文本小于密钥大小(模数的大小)。换句话说,块大小小于密钥大小。在 PKCS#1.5 的情况下,它比密钥大小小 11 个字节(如果这至少在字节边界上)。尽管在安全性方面保持稍高(比如最多 19 个字节)的块大小会更好,但填充的 8 个字节应该是(安全的)随机字节。

使用 Java,您实际上可以从Cipher对象中询问块大小,而对于 RSA,它将正确地从密钥大小中减去开销。否则你将不得不自己计算。如前所述,您不需要填充最后一个块,块填充将为您填充最后一个块。

请注意,RSA PKCS#1 规范是免费下载的。因此,您可以自己计算(更严格的)OAEP 填充。不过,对于您的特定任务,我会保持 1.5 填充。

于 2012-12-24T22:11:14.567 回答
0

ECB 是一种分组密码操作模式RSA是一种公钥加密方案,而不是分组密码,因此“ECB 模式下的 RSA”实际上没有任何意义。我怀疑在您的原始作业和您在这里对它的描述之间一定有什么东西混淆了。

在任何情况下,实际分组密码的输出长度始终是恒定的(并且等于输入分组长度)。可能让您感到困惑的一件事是加密输出有时可能包含空字节,因此您不能将其视为以空字符结尾的字符串。只需将输出视为固定长度的二进制数据块,就可以了。

于 2012-12-24T21:37:18.343 回答