我对C ++和Block Cipher加密都很陌生,我目前正在为AES(16字节种子/ 16字节块)编写解密函数。一切顺利,但我的总数据大小并不总是我的块大小的倍数。我想知道在数据结束时处理剩余数据的最佳方法是什么。
我正在使用Crypto ++作为AES库。
ProcessBlock()
函数采用Input和Output char数组。我假设它期望它们至少足够大块作为块大小。
处理分组密码中所有16字节块的最佳方法是什么,然后还处理剩余数据?
答案 0 :(得分:1)
这不仅仅是填充 - 你需要一种操作模式。 Good Math,Bad Math博客正在撰写一篇关于它们是什么以及如何使用它们的优秀系列文章here。另请参阅wikipedia entry。有一件事真的非常重要:永远不要使用ECB(电子代码簿)模式 - 你可以独立加密每个块。这是明显的方法,但它提供了令人震惊的糟糕安全性。
理想情况下,你甚至不必自己这样做。你的加密库应该提供它。如果没有,我建议改为别的东西。比如OpenSSL。
答案 1 :(得分:0)
你想要的是一个填充系统。
Check out this CodeProject article on Crypto++:
当消息不是时的倍数 密码的块大小,ECB或CBC 模式消息必须填充。该 填充的方法和值是a 关于问题的根源 密码学之间的互操作性 库和API。正如Garth Lancaster 指出,如果你不知道的话 填充物的细节,使用 StreamTransformationFilter。在这 例如,Crypto ++过滤器将填充 你。
答案 2 :(得分:0)
对于所谓的“填充”有一个PKCS标准
请参阅wikipedia page,但它等于填充:
01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
这样您就可以在解密过程中知道原始邮件的结束...