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

 

 

你可能感兴趣的:(aes-cbc加密及password和key和iv的关系)