2

我对 C++ 和 Block Cipher 加密都很陌生,我目前正在为 AES(16 字节种子/16 字节块)编写解密函数。一切进展顺利,但我的总数据大小并不总是我的块大小的倍数。我想知道在数据末尾处理剩余数据的最佳方法是什么。

我将 Crypto++ 用于 AES 库。

ProcessBlock()函数采用输入和输出字符数组。我假设它期望它们至少足够大作为块大小。

在分组密码中处理所有 16 字节块的最佳方法是什么,然后还处理剩余数据?

4

3 回答 3

1

它不仅仅是填充 - 您需要一种操作模式。好数学,坏数学博客正在写一个关于它们是什么以及如何在这里使用它们的优秀系列。另请参阅维基百科条目。非常非常重要的一件事:永远不要使用 ECB(电子密码本)模式 - 您可以独立加密每个块。这是显而易见的方法,但它提供的安全性非常差。

但是,理想情况下,您甚至不必自己执行此操作。你的加密库应该提供它。如果没有,我建议换成别的。像 OpenSSL。

于 2008-09-26T21:15:09.993 回答
0

你想要的是一个填充系统。

查看有关 Crypto++ 的 CodeProject 文章

当消息不是密码块大小的倍数时,必须填充 ECB 或 CBC 模式消息。填充的方法和值是密码库和 API 之间互操作性问题的根源。正如 Garth Lancaster 所指出的,如果您不了解填充的细节,请使用 StreamTransformationFilter。在这种情况下,Crypto++ 过滤器将为您填充。

于 2008-09-26T19:25:10.973 回答
0

有一个称为“填充”的 PKCS 标准

请参阅wikipedia page,但它相当于填充以下之一:

 01
 02 02
 03 03 03
 04 04 04 04
 05 05 05 05 05

这样你就知道在解密过程中原始消息在哪里结束......

于 2008-09-26T19:25:22.003 回答