加密算法参考
https://blog.csdn.net/gulang03/article/details/81175854
https://baike.baidu.com/item/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86/468774?fromtitle=aes%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95&fromid=3233272&fr=aladdin
aes的几种加密模式
https://www.jianshu.com/p/79a225c2650e
https://www.cnblogs.com/eleven-elv/p/7289579.html
这里我要用到cbc所以只看cbc的。从过程看中间用到了iv和key这样一组数据进行加密。
因为我是先看怎么使用的,其实openssl里提供一个password。然而对于AES里面的password以及iv和key的关系一知半解。
从上面就可以看出iv和key对cbc加密的作用。
使用openssl命令
>openssl enc -aes-128-cbc -in test.txt -out out.txt -iv 01020304 -K aabbcc -p
salt=204474E4FE7F0000
key=AABBCC00000000000000000000000000
iv =01020304000000000000000000000000
可以对test.txt文件进行AES-128-cbc加密,后面指定iv和key的十六进制值。
>openssl enc -aes-128-cbc -in out.txt -d -out test1.txt -iv 01020304 -K aabbcc -p
salt=10D414E5FE7F0000
key=AABBCC00000000000000000000000000
iv =01020304000000000000000000000000
解密过程也类似,只要保证加密的key和iv值一致即可。对比解密后的文件结果和加密前的文件相同。
password和key和iv的关系
但实际上openssl实现aes-cbc加密的时候有一种提供password的方式,但它会随机生成key以及iv.
参考:https://www.cnblogs.com/gordon0918/p/5317701.html
这里使用openssl命令的password进行加密:
>openssl enc -aes-128-cbc -in test.txt -out out.txt -pass pass:ijkl -p
salt=B5A518AB74BDC373
key=0F471C56362408AF8DB929C38EDFD23C
iv =11BEE6E35B881A33CF1649607295D1A7
解密:
>openssl enc -aes-128-cbc -in out.txt -d -out test1.txt -pass pass:ijkl -p
salt=B5A518AB74BDC373
key=0F471C56362408AF8DB929C38EDFD23C
iv =11BEE6E35B881A33CF1649607295D1A7
这里使用pass参数的加密解密是一样的,但是salt,key以及iv是随机生成的。
所以这四者有什么关系?
关于pass参数可以看到man文档中,这么说明
-pass arg
The password source.
关于password和key,iv的关系,可以参考这篇文章:
https://www.jianshu.com/p/813e184b56bd
按上面的结论验证一下对不对:
- hash1_128 = MD5(Passphrase)
- hash2_128 = MD5(hash1_128 + Passphrase)
- Key = hash1_128
- IV = hash2_128
执行不使用salt, 获得key, iv
>openssl enc -aes-128-cbc -in test.txt -out out.txt -pass pass:ijkl -nosalt -p
key=09A0877D04ABF8759F99ADEC02BAF579
iv =5E93A1AB282394570BCE93CDEE9719F8
测试
>echo -n "ijkl" > passphrase
>md5 passphrase
MD5 (passphrase) = 09a0877d04abf8759f99adec02baf579
>echo -n -e "\x09\xA0\x87\x7D\x04\xAB\xF8\x75\x9F\x99\xAD\xEC\x02\xBA\xF5\x79ijkl" > tmp
>md5 tmp
MD5 (tmp) = 5e93a1ab282394570bce93cdee9719f8
可以看到得到的key和上述直接输出的key相同。最后的结果和iv相同。
其实这里用echo是因为那个链接中输入的prel命令数据结果是有问题的,所以这里用echo暴力输出试了,结果意外的对。所以证明公式是没有问题的。
emmmmm.如果加上salt估计应该是前面那个256的逻辑是一样的,不过我这里没做尝试
- hash1_128 = MD5(Passphrase + Salt)
- hash2_128 = MD5(hash1_128 + Passphrase + Salt)
- Key = hash1_128
- IV = hash2_128