书接上回。在《LDAP 密码加密方式初探》一文中,使用 OpenSSL 命令 AES 算法加密解密时,都用到了 Key 和 IV 参数,那么这两个参数是如何生成的呢?

仍然以 AES-256-CBC 开始探索。先准备好生成 Key 和 IV 的 passphrase:

$ echo -n “drjom(&)(&)MOJRD” > passphrase

上述回文形式的 passphrase 来自一个神秘的组织:)

将此 passphrase 传入 openssl 命令生成对应的 Key 和 IV:

$ openssl enc -aes-256-cbc -kfile passphrase -md md5 -P -salt

salt=51D9C4B24C759179

key=BBF4EA0E7A0EBD7C60CCE2024E218A53BBB69CCA65B4D0B705E37080676E5F5D

iv =8E5EC1AC2191167DF9B753BA93A1E7B8

其中的 salt 是随机生成的,因此每次执行的结果并不相同。而 Key 和 IV 的生成方法参考 SuperUser 的一个回答补充及验证如下(注意 md5sum 输出的结果与上述 openssl 命令的输出结果比较):

$ perl -e ‘print pack “H“, “51D9C4B24C759179″‘ > salt

$ cat passphrase salt > hash1_128.tmp

$ md5sum hash1_128.tmp

bbf4ea0e7a0ebd7c60cce2024e218a53 hash1_128.tmp

$ perl -e ‘print pack “H“, “bbf4ea0e7a0ebd7c60cce2024e218a53″‘ > hash1_128

$ cat hash1_128 passphrase salt > hash2_128.tmp

$ md5sum hash2_128.tmp

bbb69cca65b4d0b705e37080676e5f5d hash2_128.tmp

$ perl -e ‘print pack “H*”, “bbb69cca65b4d0b705e37080676e5f5d”‘ > hash2_128

$ cat hash2_128 passphrase salt > hash3_128.tmp

$ md5sum hash3_128.tmp

8e5ec1ac2191167df9b753ba93a1e7b8 hash3_128.tmp

可以看出,对于 AES-256-CBC 来说:

hash1_128 = MD5(Passphrase + Salt)

hash2_128 = MD5(hash1_128 + Passphrase + Salt)

hash3_128 = MD5(hash2_128 + Passphrase + Salt)

Key = hash1_128 + hash2_128

IV = hash3_128

Key 和 IV 分别就是 AES-256-CBC 的 Key 和 IV。

当没有 salt 时,上述过程仍然成立。先使用 openssl 命令带 -nosalt 选项生成 Key 和 IV:

$ openssl enc -aes-256-cbc -kfile passphrase -md md5 -P -nosalt

key=D5E483D8B90C02BD4D470BA8049E1FA61D64EB2BFA444CBF9853CDFB8B24DA7A

iv =304E9E87DB9C1C8101F605ED4DD0B9EB

分步验证如下(注意 md5sum 输出的结果与上述 openssl 命令的输出结果比较):

$ md5sum passphrase

d5e483d8b90c02bd4d470ba8049e1fa6 passphrase

$ perl -e ‘print pack “H“, “d5e483d8b90c02bd4d470ba8049e1fa6″‘ > hash1_128

$ cat hash1_128 passphrase > hash2_128.tmp

$ md5sum hash2_128.tmp

1d64eb2bfa444cbf9853cdfb8b24da7a hash2_128.tmp

$ perl -e ‘print pack “H“, “1d64eb2bfa444cbf9853cdfb8b24da7a”‘ > hash2_128

$ cat hash2_128 passphrase > hash3_128.tmp

$ md5sum hash3_128.tmp

304e9e87db9c1c8101f605ed4dd0b9eb hash3_128.tmp

也就是说:

hash1_128 = MD5(Passphrase)

hash2_128 = MD5(hash1_128 + Passphrase)

hash3_128 = MD5(hash2_128 + Passphrase)

Key = hash1_128 + hash2_128

IV = hash3_128

在此基础上,看看 AES-128-CBC 生成的 Key 和 IV 是什么样子的:

$ openssl enc -aes-128-cbc -kfile passphrase -md md5 -P -nosalt

key=D5E483D8B90C02BD4D470BA8049E1FA6

iv =1D64EB2BFA444CBF9853CDFB8B24DA7A

对比 AES-256-CBC 可以看出,AES-128-CBC 的 Key 和 IV 生成方法进一步简化(以下为没有 salt 时的情况):

hash1_128 = MD5(Passphrase)

hash2_128 = MD5(hash1_128 + Passphrase)

Key = hash1_128

IV = hash2_128

在上述验证过程中使用到 openssl 命令时,都用 -md 选项将生成 Key 和 IV 的 hash 函数指定为 md5。那么假如不指定的话,默认的 hash 函数是什么呢?

由此问答可知,从 1.1 版本开始,默认的 hash 函数由 MD5 变为 SHA256(可使用 openssl version 命令查看当前版本号),另外也可以通过修改 /etc/ssl/openssl.cnf 配置文件中的 default_md 字段指定默认的 hash 函数。

要知道,MD5 生成的 hash 是 128bit 的,而 SHA256 生成的 hash 是 256bit 的,上述 256bit Key 生成时的拼接操作是否有必要呢?

继续验证,仍然回到 AES-256-CBC 并使用 SHA256 作为 hash 函数:

$ openssl enc -aes-256-cbc -kfile passphrase -md sha256 -P -nosalt

key=53A8968B0F53CAA2D21F2694B19EDD0676AF034D4D570651B3689C7827EC84C2

iv =ED889267E14BA02167ED96E226153158

分步看看:

$ sha256sum passphrase

53a8968b0f53caa2d21f2694b19edd0676af034d4d570651b3689c7827ec84c2 passphrase

$ perl -e ‘print pack “H*”, “53a8968b0f53caa2d21f2694b19edd0676af034d4d570651b3689c7827ec84c2″‘ > hash1_256

$ cat hash1_256 passphrase > hash2_256.tmp

$ sha256sum hash2_256.tmp

ed889267e14ba02167ed96e226153158373dbeff2b1177c12906ab786dd1ebd8 hash2_256.tmp

可以看到,对 passphrase 做一次 SHA256 运算就已经是 256bit Key 了,对 Key 和 passphrase 拼接后再次做 SHA256 运算,截取前 128bit 作为 IV 的值。也就是说:

hash1_256 = SHA256(Passphrase)

hash2_256 = SHA256(hash1_256 + Passphrase)

Key = hash1_256

IV = First128bit(hash2_256)

再看看 AES-128-CBC 的情况:

$ openssl enc -aes-128-cbc -kfile passphrase -md sha256 -P -nosalt

key=53A8968B0F53CAA2D21F2694B19EDD06

iv =76AF034D4D570651B3689C7827EC84C2

对 passphrase 做一次 SHA256 运算之后,前 128bit 作为 AES-128-CBC 的 Key 值,后 128bit 作为其 IV 值。写成等式是:

hash1_256 = SHA256(Passphrase)

Key = First128bit(hash1_256)

IV = Second128bit(hash1_256)

至此,可以看出 AES 算法 Key 和 IV 的生成规律了:将 hash 结果(第一次 hash 运算时为空)、passphrase 和 salt(nosalt 时为空)拼接后循环做 hash 运算,再根据 AES 所需的 Key 和 IV 的 bit 数取值。

更进一步的,从上述生成过程可见,只要生成了足够 bit 位的值,hash 运算就停止了,这称为一个迭代,这正是 OpenSSL 为人所诟病的不足。而 GnuPG 使用了多次迭代。

小结

OpenSSL AES 算法使用的 Key 和 IV 生成规律:将 hash 结果(第一次 hash 运算时为空)、passphrase 和 salt(nosalt 时为空)拼接后循环做 hash 运算,再根据 AES 所需的 Key 和 IV 的 bit 数取值。

默认的 hash 函数,从 OpenSSL 1.1 开始由 MD5 变为 SHA256。

可以通过 /etc/ssl/openssl.cnf 的 default_md 字段修改默认的 hash 函数。

OpenSSL AES 生成 Key 和 IV 时只做一次迭代,GnuPG 使用多次迭代。

以上。

aes key iv从mysql_OpenSSL AES 算法中 Key 和 IV 是如何生成的?相关推荐

  1. php取key的value值,获取数组中key和value的值

    方法1: PHP 4 引入了 foreach 结构,和 Perl 以及其他语言很像.这只是一种遍历数组简便方法.foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错 ...

  2. 【原创】浅析密码学在互联网支付中的应用|RSA,Hash,AES,DES,3DES,SHA1,SHA256,MD5,SSL,Private Key,Public Key...

    一)概述 什么是互联网支付? 当支付遇到互联网,一场革命自然不可避免.成为现实的是传统的现金支付已经"退居二线",各种在线支付方式成为人们日常消费的主要支付方式.银行推出的网银以及 ...

  3. AES算法中S盒的FPGA实现

    AES算法中S盒的FPGA实现 I 语言 : verilog EDA 工具 : quartus AES算法中S盒的FPGA实现 I 一.S盒的简介 二.S盒的实现要求 三.S盒FPGA实现的具体方案 ...

  4. AES算法中S盒的FPGA实现 II

    AES算法中S盒的FPGA实现 II 语言 : verilog EDA 工具 : quartus 仿真 : Modelsim AES算法中S盒的FPGA实现 II 一.引言 二.S盒的FPGA实现 2 ...

  5. AES 128位CBC加密解密(不使用固定IV)

    安全检查时要求账号和密码加密后才能存到数据库中,要求加密算法如下: 1)分组密码算法:AES(密钥长度在128位及以上)(GCM或CBC模式) 2)流密码算法:AES(密钥长度在128位及以上)(OF ...

  6. aes key长度_Go 语言 map 解析之 key 的定位核心流程

    1 哈希表 哈希表属于编程中比较常见的数据结构之一,基本上所有的语言都会实现数组和哈希表这两种结构,Hash table 的历史是比较悠远的,我们在编程时也是离不开的,这种数据结构的作用其实很简单,就 ...

  7. 在虚拟DOM和Diff算法中为什么不建议使用index作为key值?

    key是什么 key是虚拟DOM的一个重要标识,在DIff算法中,key对我们的性能也有着至关重要到的作用,有key就可以优化Diff算法,提高渲染性能: key在页面更新的时候做了什么 1.首先,当 ...

  8. 26.Vue列表渲染中key的作用与原理(内含虚拟DOM的对比算法详解)

    目录 1.暴露问题,使用index作为key 2.使用唯一标识p.id作为key 3.不写key的配置 4.key的工作原理及虚拟DOM的对比算法 5.总结 25.Vue列表渲染_爱米酱的博客-CSD ...

  9. Diff算法中使用index作为key的弊端

    首先都知道diff算法是依赖生成虚拟DOM然后跟真实DOM进行比较差异化来实现按需更新. 我们现在又数组1:[{name:"柯南",title:"侦探"},{n ...

  10. java aes php_php和java的aes默认加密算法有点区别及解决方法。

    1.php和java的aes默认加密算法有点区别,php能解密java加密的密文,但java不能解密php加密的密文.原因在于: 1.Java中AES加密与解密默认使用AES/ECB/PKCS5Pad ...

最新文章

  1. 这些编程语言程序员工资最高!Java才第四
  2. 2019年清华自主招生部分试题
  3. Fragment 生命周期:
  4. salt远程执行python脚本_SaltStack远程执行Windows job程序(黑窗口)填坑经过
  5. CORS(跨域资源共享)
  6. 水晶报表中对某一栏位值进行处理_合并报表——非同一控制下的企业合并amp;同一控制下的企业合并...
  7. 计算机常发故障英语,vipkid英语常见问题解决办法
  8. security工作笔记007---spring security自定义AuthenticationProvider,验证规则
  9. Apache 优化配置10条建议
  10. 门门通还是精通一门(程序员)
  11. coreldraw梯形校正_CorelDRAW绘制等腰梯形的多种方法
  12. 清华同方的计算机硬件设置,清华同方台式计算机如何设置BIOS引导U盘教程
  13. Java线程池的四种创建方式
  14. 蒜头君的藏书(映射)
  15. JavaScript进阶教程(6)—硬核动图让你轻松弄懂递归与深浅拷贝
  16. HTML+CSS修改li前小圆点的样式or颜色
  17. Spring Cloud 教程
  18. mu修改连接服务器名,自己设置mu服务器自己玩
  19. 南方东英恒生科技指数每日杠杆(2x)产品(股票代码: 7226.hk)和南方东英恒生科技指数每日反向(-2x) 产品(股票代码: 7552.hk)将在港交所上市
  20. 大坝安全动态监管预警系统 大坝安全监测平台 遥测终端机 水位雨量监测站

热门文章

  1. 服务器linux搬家教程,搬迁linux服务器的流程
  2. 图片文字识别—OCR技术
  3. Visual Studio Code配置Salesforce Apex开发环境
  4. OpenWrt 无线桥接
  5. 八卦与十二地支方位图_[天干地支五行八卦图] 天干地支八卦方位图
  6. 流式数据传输 php,PHP录制实时流式传输到文件
  7. Tools:downloading and Building EDK II工具篇:安装/使用EDKII源代码获取/编译工具[2.3]...
  8. Docker安装ElasticSearch 版本7.6.2
  9. java求职面试指南
  10. 在html中如何缩小图片,如何减小网页中图片的尺寸?