DH概述
- 用于密钥交换的公开算法,广泛应用于各种安全协议
- SSL协议同样支持DH算法
- DH算法使用之前需要预先共享两个参数,本原元g和模n,这两个参数影响到算法的安全性,因此需要预先生成并检测其安全性
- 生成这些必要参数和管理这些参数的指令dhparam、gendh和dh
- 注意事项:DH算法本身不定义加密和解密的操作,只是单纯的提供一个安全交换或者生成共同数据加密密钥(用于对称加密的会话密钥)的方法
- OpenSSL也没有提供利用DH进行加密和解密操作的指令和生成DH的指令,只提供了生成DH参数和对DH管理的指令
- 虽然OpenSSL目前的版本还保留了三个DH算法相关指令,但是dhparam指令已经集成了gendh和dh两个指令的所有功能,在后续的版本中,gendh和dh指令很可能被取消或者赋予新的功能定义
生成DH算法参数
- DH算法参数包括本原元g和模n,OpenSSL提供的指令gendh和dhparam都可以生成DH参数,并可以经过编码保存在文件中。gendh指令的功能目前已经集成在dhparam指令中,但是dhparam指令还集成了dh指令的所有功能,在这部分,我们只介绍gendh指令。
- 首先来看看gendh指令的格式:
- out选项指定了DH算法参数输出和保存的文件名,可以是标准输出设备,比如Windows下就是当前指令行界面。
- gendh指令没有输入选项。
- 使用gendh指令输出的DH算法参数都是PEM编码的
- DH算法参数指令的主要目的是产生公共模数n,而本原元g是指定的,目前常用的本原元有2和5,虽然3也偶尔被使用,但是OpenSSL并没有提供支持。默认情况下使用2作为本原元。
- 产生DH算法参数的时候engine选项的影响体现在两个方面,DH算法产生函数方面和随机数生成函数方面。如果engine指定的设备有效并且支持DH算法参数的产生,那么将会调用Engine设备提供的DH参数生成函数而不再使用OpenSSL函数库本身的DH参数产生函数。同时,如果Engine设备支持随机数生成函数,那么在产生DH算法参数需要的随机数的时候,调用的系列随机数函数将直接使用Engine设备提供的相应函数,这时候,rand选项指定的随机数种子文件是否有意义就依具体的Engine接口而定。
- 随机数文件选项randrand选项指定了产生随机数时使用的随机数种子文件,该文件一般来说可以为任意类型的文件。如果没有指定,指令会从其他途径获取必要的随机数种子。如果使用了engine选项并且该Engine接口支持随机数产生函数,那么该rand选项指定随机数文件的意义及是否被真正使用要根据具体的Engine接口而定。
- DH密钥长度依据DH算法参数的长度而定,所以,生成的DH算法参数的长度决定了DH密钥的长度。一般来说,现在512位的DH密钥是可以信任的,当然,如果你愿意,也可以采用更长的密钥。密钥越长,生成DH参数的时间越长,而安全性也越高。
例子
管理DH算法参数
dh指令格式
- 将生成的DH参数保存在某个文件里面,并不需要对其进行加密,因为这个参数原本就是公开的,但是为了使用这个参数需要进行一些管理操作
- 管理操作:格式转换、安全性测试、转换成C编码等操作
- dh指令的格式
- nform和outform选项指定DH参数编码输入和输出文件的格式,默认情况下是PEM编码。目前来说,支持的格式包括PEM编码和DER编码两种格式。如果输出信息不是编码的DH参数,比如-text和-C选项的输出,则不会受到out form格式选项的影响。
- (3)输入和输出文件选项in和out in选项指定了输入的DH参数文件,该文件应该保存了PEM编码或者DER编码格式的DH参数,如果你是使用gendh指令生成的DH参数文件,那么肯定就是PEM编码的。如果是DER编码的DH文件,则需要在inform中指定其格式。out选项指定了输出文件,包括输出格式转换后DH参数和text选项输出的明文解析信息。
- (4)DH参数检测选项check DH参数文件存放一段时间之后,你如果对该文件产生了怀疑,可以使用check选项对其中的DH参数进行检查。check选项提供的检查包含四个方面:模数是否正确,模数是否安全,本原元g是否正确及本原元是否合适。如果检查有问题,指令会输出提示信息。
- (5)输出C语言代码选项CDH算法参数在使用的时候,既可以从文件读入,也可以直接集成在代码里面。OpenSSL提供了从DH文件参数转换成相应的C语言代码的方法,就是使用C选项。使用该选项后,输出三部分信息:模数数组、本原元g数组及getdh函数。需要注意的是,C语言的输出代码只输出到标准输出设备,不会输出到out选项指定的文件中。
- 使用C选项后输出的一个512位DH算法参数C代码的例子
- 其他选项 engine选项指定了要使用的Engine设备,如果该Engine接口支持在使用dh指令中要使用到的某个函数或者操作,那么就会使用Engine设备而不是OpenSSL本身算法库的函数。text选项告诉指令输出DH算法参数的明文解析信息,这包括模数n和本原元g的十六进制编码数据。noout选项的使用会忽略输出选项out,不输出DH编码参数到out选项指定文件或标准输出设备。
更丰富和综合的 DH算法参数指令 dhparam
- 综合利用了gendh和dh指令的所有功能
- dsaparam选项是dhparam指令比gendh指令和dh指令唯一多出来的选项,该选项告诉指令生成一个DSA风格的DH参数,而不是使用典型的DH参数生成方式。所谓DSA风格的DH参数是利用DSA参数类型跟DH参数具有相似性的特点,先生成一个DSA参数,然后将其转换为DH参数。
- DSA参数生成相对于DH参数来说速度更快,而其达到相同安全性能需要的密钥长度更短一些,所以使用DH算法的时候效率就显得更高。但也是有代价的,使用DSA风格的DH算法参数,最好为每一个应用生成一个算法参数,否则容易受到一种称为“小群”(smal-subgroup)的方法的攻击。使用了dsaparam选项之后,如果使用了输入文件,那么输入文件格式都被视作DSA参数文件,dhparam指令将会把DSA参数转换成DH参数。输出则是一个DSA风格的DH参数文件。
- 输出格式可以由用户进行指定,可以选择是保存成PEM格式还是DER格式,而不再受到gendh指令限制只能保存成PEM格式,然后再使用dh指令才能转换成DER格式