处理C ++中分组密码的最佳方法? (加密++)

时间:2020-03-06 14:48:07  来源:igfitidea点击:

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

我将Crypto ++用于AES库。

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

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

解决方案

我们想要的是填充系统。

在Crypto ++上查看此CodeProject文章:

When a message is not a multiple of
  the cipher's block size, ECB or CBC
  mode messages must be padded. The
  method and values of padding are a
  source of problem with respect to
  interoperability between Cryptographic
  libraries and APIs. As Garth Lancaster
  points out, if you're not aware of the
  particulars of padding, use the
  StreamTransformationFilter. In this
  case, the Crypto++ filter will pad for
  you.

有一个称为"填充"的PKCS标准

请参阅Wikipedia页面,但这相当于使用以下其中一项进行填充:

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

这样一来,我们便知道在解密过程中原始消息在何处结束...

这不仅仅是填充,我们还需要一种操作模式。好的数学,不好的数学博客正在就它们是什么以及如何在这里使用它们撰写了一系列精彩的文章。另请参阅维基百科条目。确实非常重要的一件事:永远不要使用ECB(电子密码簿)模式来单独加密每个块。这是显而易见的方法,但是它提供的安全性极差。

不过,理想情况下,我们甚至不必自己执行此操作。密码库应该提供它。如果没有,我建议改成其他东西。像OpenSSL。