我一直在研究一些使用Java中的AES / CBC加密和解密的代码。我必须在AES / CBC模式下实现我自己的位级填充,这很简单,通过在文件中使用0x80标记。所有人都在游泳,直到不愉快的第11个小时发现输出文件必须以十六进制编码。
例如,在此实现之前的示例输出文件主要是
中的垃圾'áÐ=.n^76s_‰ló¿àQÚ
更改后,输出文件更符合
41CC29F730895F9292FBEEB3ADA
现在的主要问题是解密例程找不到0x80标记并知道删除填充的位置。除此之外,加密和解密仍然可以完美地工作。在使用十六进制格式之前,下面的if子句总是找到填充字节。
我检查填充标记的代码是
if (decryptedPadded[i] == (byte) 0x80)
...lop off the padding from byte[i] to the end
由于文件是十六进制格式,现在不再有效了,因为0x80是十六进制,这实在令我感到困惑。解密现在将填充保留在文件的末尾,因为上面的if子句永远不会成立。
任何人都可以了解正在发生的事情,或者当文件采用这种格式时如何检查填充标记?