【问题标题】:How to add padding to BYTE array in C++?如何在 C++ 中向 BYTE 数组添加填充?
【发布时间】:2017-04-03 05:58:10
【问题描述】:

我正在 C++ 中试验 AES 加密,我在 GitHub 上找到了 AES 的实现,问题是输入字节数组的大小应该能被 16 整除,而我的数据在大多数情况下都不能满足这个要求。我想添加填充(0-s 到数组的末尾)直到大小可以被 16 整除。

我有一个计算最接近大小的函数,但我不知道如何向数组添加填充。

PBYTE AddPadding(PBYTE Array, int size)
{
    if (size % 16 != 0)
    {
        size += (16 - size % 16);
        size = ceil(size / 16) * 16;
    }

    BYTE* tmp = new BYTE[size];

    //the magic should happen here

    return tmp;
}

输入和调用是:

BYTE in[] = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10, 0x25 };

PBYTE tmp = AddPadding(in, sizeof(in));

【问题讨论】:

  • 你不能假设数组后面的字节是空闲的。所以,如果你这样做,你应该传递一个指向数组指针的指针,分配一个适当大小的新数组(+错误处理),将内容复制到新数组中,添加零,释放原始数组,然后返回新数组。显然,这是低效的并且可能会失败。最好按原样处理原始数组,并在最后一次迭代中添加虚拟零。
  • 使用处理在加密时添加填充并在解密时删除它的库,这很常见。通常有一个选项,而且很多时候它是默认选项。如果实现不支持,则查找另一个库。

标签: c++ arrays encryption aes padding


【解决方案1】:

大多数加密库都会为您添加填充。如果你想自己做,那么:

  1. 计算您需要多少填充。

  2. 由于 C 数组不可扩展,您需要创建一个新数组来保存明文和填充。

  3. PKCS#7 填充很常见,所以除非你有理由不这样做,否则选择它。

  4. 将明文和填充复制到新数组中。

  5. 将新数组传递给AES进行加密;它现在将被均匀地分成块。

  6. 在解密时检查填充是否存在且格式正确。格式错误的填充表示存在问题。

  7. 移除填充并返回解密后的文本。

【讨论】:

    猜你喜欢
    • 2013-12-13
    • 2013-07-12
    • 2015-01-31
    • 1970-01-01
    • 2012-12-24
    • 2012-02-06
    • 2012-04-07
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多