AES 填充歧义
AES padding ambiguity
我一直在用 C 实现 AES,现在我正在通过实现填充来完成程序。阅读许多关于填充主题的其他 SO 问题,我发现一种流行的方法是用剩余的位置数填充状态中的每个剩余位置。例如,如果我只有 12 个字节要加密,我会用 4 填充剩余的 4 个字节。我的问题是解密时如果我有一个已满但以 1 结尾的块,我怎么知道这是否是一个字节填充或只是值 1?
免责声明:我知道这个程序不应该在生产中使用,因为它可能有各种不同的不安全因素。我这样做是为了好玩,而不是为了加密绝密文件。
您描述的是 PKCS#7 padding。
为了消除歧义,你总是需要填充。此外,ECB 或 CBC 模式等模式的明文需要是块大小的倍数。
这两个约束放在一起导致了一个简单的解决方案:你总是添加填充到块大小的下一个倍数。如果明文已经是块大小的倍数,则添加一个完整的填充块,其中每个字节代表 16(对于 AES)。
我一直在用 C 实现 AES,现在我正在通过实现填充来完成程序。阅读许多关于填充主题的其他 SO 问题,我发现一种流行的方法是用剩余的位置数填充状态中的每个剩余位置。例如,如果我只有 12 个字节要加密,我会用 4 填充剩余的 4 个字节。我的问题是解密时如果我有一个已满但以 1 结尾的块,我怎么知道这是否是一个字节填充或只是值 1?
免责声明:我知道这个程序不应该在生产中使用,因为它可能有各种不同的不安全因素。我这样做是为了好玩,而不是为了加密绝密文件。
您描述的是 PKCS#7 padding。
为了消除歧义,你总是需要填充。此外,ECB 或 CBC 模式等模式的明文需要是块大小的倍数。
这两个约束放在一起导致了一个简单的解决方案:你总是添加填充到块大小的下一个倍数。如果明文已经是块大小的倍数,则添加一个完整的填充块,其中每个字节代表 16(对于 AES)。