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