加密算法參考
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