aes-cbc加密及password和key和iv的關係

加密算法參考

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章