我已经从这个site编译了一些AES实现代码,它应该是128位密钥加密。我测试了一起工作正常的加密/解密程序。
但是,如果我使用上面提到的代码对任何内容进行加密,然后尝试通过linux中内置的openssl工具对其进行解密,我就无法解密它,它甚至会记录坏幻数错误。同样,如果我使用openssl加密任何东西并尝试使用代码解密将无法正常工作。我试过用cbc ecb。
如果他们都在实施AES,那么它不应该以同样的方式工作吗?
答案 0 :(得分:1)
看起来C代码正在使用ECB并且没有填充。因此,尝试加密16字节的消息(一个倍数),然后加上16字节的值16(pkcs#7填充)。或者在openssl中使用16字节的消息(倍数)和--nopad(更有可能工作)。另外,使用aes-128-ecb或其他任何名称。
块密码用于文本的“块” - 在这种情况下,它长度为16个字符。因此,如果您不想担心填充,则需要提供确切数量的块。
另外,ecb模式(依次执行每个块而不进行额外处理)对于许多用途来说并不安全。请参阅维基百科文章(查看企鹅照片)。
[edit:] [编辑2:]
> echo -n "abcdabcdabcdabcd" > msg
> wc msg
0 1 16 msg
> openssl enc -aes-128-ecb -nopad -in msg -K 0 -S "" -iv ""
[noise]
> openssl enc -aes-128-ecb -nopad -in msg -K 0 -S "" -iv "" | wc
0 1 16
自己尝试以上,看看其他代码是否解密它(编辑2明确设置密钥,并删除IV和盐 - 在这种情况下不确定后两者是什么)。
[编辑3:]
据我所知,问题与密码转换为密钥的方式有关。除非我将一个键指定为十六进制(-K 0
),openssl似乎正在做一些我无法摆脱的额外事情。如果我这样做,其他程序不起作用(需要密码)。