|
|
1
1
加密/解密过程在很大程度上是不相关的。毕竟,进来的应该和出来的一样。问题是,当写入文件时,表示字符串对象的字节是什么样子的。 快速测试确认当Java将字符串写入流时,字符串和流都不为空。请考虑以下代码:
对生成以下内容的文件执行十六进制转储。
因此,当您加密时,最终得到一个15字节的加密字符串和块大小-15字节的加密填充。当你解密它时,你不仅得到字符串,而且得到纯文本填充,除非你知道纯文本的长度或者有一个嵌入的纯文本终止符,否则没有办法知道纯文本的结尾。 使用nul(“\0”)作为终止符是有意义的,因为这也是C用来标记字符串结尾的终止符。唯一可能的问题是,如果nul已经在你的字符串中出现了。考虑到这可能会导致C/C++程序的其他问题,我有点怀疑,但是如果它是一个问题,你总是可以逃避它。
哦,我查了一下零钱
提供的十六进制转储
|
|
|
2
1
因为aes是块密码,所以应该将要加密的数据填充到16个字节。 由于C代码不处理填充,它可能会在加密时报告错误,或者添加“默认”填充。 最好自己加衬垫。 |
|
3
1
字符串问题和空填充会分散注意力,并且可能不相关。Java使用标准的填充方案(PKCSα5)。 明确地 允许解密程序知道需要丢弃最后一个块的字节数。C端也使用了一些方案。你需要知道那个计划是什么。在您知道C解密程序所期望的填充算法之前,我将避免使用'\0'进行填充之类的操作。
您还应该在
|