对称加密算法
OpenSSL 一共提供了8 种对称加密算法,其中7 种是分组加密算法,仅有的一种流加密算法是RC4。这7 种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES 使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128 位,其它算法使用的则是64 位。事实上,DES 算法里面不仅仅是常用的DES 算法,还支持三个密钥和两个密钥3DES 算法。
虽然每种加密算法都定义了自己的接口函数,但是OpenSSL 还使用EVP 封装了所有的对称加密算法,使得各种对成加密算法能够使用统一的API 接口EVP_Encrypt 和EVP_Decrypt 进行数据的加密和解密,大大提供了代码的可重用性能。
非对称加密算法
OpenSSL 一共实现了4 种非对称加密算法,包括DH 算法、RSA 算法、DSA 算法和椭圆曲线算法(EC)。DH 算法一般用户密钥交换。RSA 算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA 算法则一般只用于数字签名。
跟对称加密算法相似,OpenSSL 也使用EVP 技术对不同功能的非对称加密算法进行封装,提供了统一的API 接口。如果使用非对称加密算法进行密钥交换或者密钥加密,则使用EVP_Seal 和EVP_Open 进行加密和解密;如果使用非对称加密算法进行数字签名,则使用EVP_Sign 和EVP_Verify 进行签名和验证。
信息摘要算法
OpenSSL 实现了5 种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA 算法事实上包括了SHA 和SHA1 两种信息摘要算法,此外,OpenSSL 还实现了DSS 标准中规定的两种信息摘要算法DSS 和DSS1。
OpenSSL 采用EVP_Digest 接口作为信息摘要算法统一的EVP 接口,对所有信息摘要算法进行了封装,提供了代码的重用性。
密钥和证书管理
密钥和证书管理是PKI 的一个重要组成部分,OpenSSL 为之提供了丰富的功能,支持多种标准。
首先,OpenSSL 实现了ASN.1 的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL 等数据对象的DER、PEM 和BASE64 的编解码功能。OpenSSL 提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12 和PKCS#8 的编解码功能。OpenSSL 在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。
在此基础上,OpenSSL 实现了对证书的X.509 标准编解码、PKCS#12 格式的编解码以及PKCS#7 的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。
事实上,OpenSSL 提供的CA 应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。
Engine 机制
Engine 机制的出现是在OpenSSL 的0.9.6 版的事情,开始的时候是将普通版本跟支持Engine 的版本分开的,到了OpenSSL 的0.9.7 版,Engine 机制集成到了OpenSSL 的内核中,成为了OpenSSL 不可缺少的一部分。
Engine 机制目的是为了使OpenSSL 能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。OpenSSL 的Engine 机制成功地达到了这个目的,这使得OpenSSL 已经不仅仅使一个加密库,而是提供了一个通用地加密接口,能够与绝大部分加密库或者加密设备协调工作。当然,要使特定加密库或加密设备更OpenSSL 协调工作,需要写少量的接口代码,但是这样的工作量并不大,虽然还是需要一点密码学的知识。Engine 机制的功能跟Windows 提供的CSP 功能目标是基本相同的。
BIO 机制
BIO 机制是OpenSSL 提供的一种高层
IO 接口,该接口封装了几乎所有类型的IO 接口,如内存访问、文件访问以及Socket 等。这使得代码的重用性大幅度提高,OpenSSL 提供API 的复杂性也降低了很多。
OpenSSL 目录及功能描述
目录名 | 功能描述 |
Crypto | 存放OpenSSL 所有加密算法源码文件和相关标注如X.509 源码文件,是OpenSSL 中最重要的目录,包含了OpenSSL 密码算法库的所有内容。 |
SSL | 存放OpenSSL 中SSL 协议各个版本和TLS 1.0 协议源码文件,包含了OpenSSL 协议库的所有内容。 |
Apps | 存放OpenSSL 中所有应用程序源码文件,如CA、X509 等应用程序的源文件就存放在这里。 |
Doc | 存放了OpenSSL 中所有的使用说明文档,包含三个部分:应用程序说明文档、加密算法库API说明文档以及SSL 协议API 说明文档。 |
Demos | 存放了一些基于OpenSSL 的应用程序例子,这些例子一般都很简单,演示怎么使用OpenSSL其中的一个功能。 |
Include | 存放了使用OpenSSL 的库时需要的头文件。 |
Test | 存放了OpenSSL 自身功能测试程序的源码文件 |
OpenSSL 算法目录
openSSL 的算法目录Crypto 目录包含了OpenSSL 密码算法库的所有源代码文件,是OpenSSL 中最重要的目录之一。OpenSSL 的密码算法库包含了OpenSSL 中所有密码算法、密钥管理和证书管理相关标准的实现,在Windows 下编译后的库文件名为libeay32.lib,在Linux 下编译后生产的库文件名为libcrypto.a。Crypto 目录下包含了众多的子目录,这些目录大多数以相关的算法或标准名称的简写命名。当然,并非所有这些目录存放的源文件都是密码算法和标准,有些是OpenSSL 本身的一些相关功能文件,如BIO、DSO 和EVP 等。
Crypto 子目录列表
Aes | 对称算法,美国新的对称加密算法标准AES 算法源码。 |
Bf | 对称算法,Blowfish 对称加密算法源码。 |
Cast | 对称算法,CAST 对称加密算法源码。 |
Des | 对称算法,包括了DES 和3DES 对称加密算法源码。 |
Idea | 对称算法,IDEA 对称加密算法源码。 |
Rc2 | 对称算法,RC2 对称加密算法源码。 |
Rc4 | 对称算法,RC4 对称加密算法源码 |
Rc5 | 对称算法,RC5 对称加密算法源码。 |
Dh | 非对称算法,DH 非对称密钥交换算法源码。 |
Dsa | 非对称算法,DSA 非对称算法源码,用于数字签名。 |
Ec | 非对称算法,EC 椭圆曲线算法源码。 |
Rsa | 非对称算法,RSA 非对称加密算法源码,既可以用于密钥交换,也可以用于数字签名。 |
Md2 | 信息摘要算法,MD2 信息摘要算法源码。 |
Md5 | 信息摘要算法,MD5 信息摘要算法源码。 |
Mdc2 | 信息摘要算法,MDC2 信息摘要算法源码。 |
Sha | 信息摘要算法,SHA 信息摘要算法源码,包括了SHA1 算法。 |
Ripemd | 信息摘要算法,RIPEMD-160 信息摘要算法源码。 |
Comp | 数据压缩算法数据压缩算法的函数接口,目前没有压缩算法,只是定义了一些空的接口函数 |
Asn1 | PKI 相关标准ASN.1 标准实现源码,只实现了PKI 相关的部分,不是完全实现。包括DER 编解码等功能。 |
Ocsp | PKI 相关标准OCSP(在线证书服务协议)实现源码。 |
Pem | PKI 相关标准PEM 标准实现源码,包括了PEM 的编解码功能。 |
Pkcs7 | PKI 相关标准PKCS#7 标准实现源码。PKCS#7 是实现加密信息封装的标准,包括了证书封装的标准和加密数据的封装标准。 |
Pkcs12 | PKI 相关标准PKCS#12 标准实现源码。包括了PKCS#12 文件的编解码功能。PKCS#12是一种常用的证书和密钥封装格式。 |
X509 | PKI 相关标准X.509 标准的实现源码。包括了X.509 的编解码功能,证书管理功能等。X509v3 PKI 相关标准X.509 第三版扩展功能的实现源码。 |
Krb5 | 其它标准支持支持Kerberos 协议的一些接口函数和结构定义 |
Hmac | 其它标准支持HMAC 标准的支持结构和函数源源代码。 |
Lhash | 其它标准支持动态HASH 表结构和函数源代码 |
Bio | 自定义OpenSSL 自身定义的一种抽象IO 接口,封装了各种平台的几乎所有IO 接口,如文件、内存、缓存、标准输入输出以及Socket 等等。 |
Bn | 自定义OpenSSL 实现大数管理的结构及其函数。 |
Buffer | 自定义OpenSSL 自定义的缓冲区结构体。 |
Conf | 自定义OpenSSL 自定义的管理配置结构和函数。 |
Dso | 自定义OpenSSL 自定义的加载动态库的管理函数接口。如使用Engine 机制就用到了这些函数提供的功能。 |
Engine | 自定义OpenSSL 自定义的Engine 机制源代码。Engine 机制运行OpenSSL 使用第三方提供的软件密码算法库或者硬件加密设备进行数据加密等运算。相当于Windows 平台的CSP 机制。 |
Err 自定义OpenSSL 自定义的错误信息处理机制。
Evp | 自定义OpenSSL 定义的一组高层算法封装函数,包括了对称加密算法封装、非对称加密算法封装、签名验证算法封装以及信息摘要算法封装,类似 |
PKCS#11 提供的接口标准。
Objects | 自定义OpenSSL 管理各种数据对象的定义和函数。事实上,Objects 的OID 是根据ASN.1 的标准进行命名的,不完全是OpenSSL 自定义的结构。 |
Rand 自定义OpenSSL 的安全随机数产生函数和管理函数。
Stack | 自定义定义了OpenSSL 中STACK 结构和相关管理函数。 |
Threads | 自定义OpenSSL 处理线程的一些机制。 |
Txt_db | 自定义OpenSSL 提供的文本证书库的管理机制。 |
Ui | 自定义OpenSSL 定义的一下用户接口交换函数。 |
Perlasm | 自定义编译的时候需要用到的一些Perl 辅助配置文件。 |