1. 组成
主要包括三个主要模块:
- 应用程序
主要包括密钥生成,证书管理,格式转换,数据加密,签名,SSL测试等。 - SSL协议库
通过BIO和EVP实现安全套接字的协议。 - 密码算法库
BIO主要是实现套接字的封装;EVP实现对内部算法的封装。
2. BIO
封装了许多类型I/O接口细节的一种应用接口,可以和SSL连接,非加密的网络连接,文件I/O进行透明的连接。
主要分为两种:
- source/sink 类型,如 socket BIO,file BIO。
- filter 类型,将数据从一个BIO转换到另一个BIO,如 hash,enc,dec等操作。
2.1 BIO方法类型
// source/sink 类型
BIO_METHOD* BIO_s_accept() // 封装类似TCP/IP socket Accept接口,并且使TCP/IP操作对于BIO接口透明。
BIO_METHOD* BIO_s_connect() // 封装类似TCP/IP socket Connect接口,并且使TCP/IP操作对于BIO接口透明
BIO_METHOD* BIO_s_socket() // 封装socket接口的BIO类型
BIO_METHOD* BIO_s_bio() // 封装一个BIO对,数据从一个BIO写入,从另外一个BIO读出
BIO_METHOD* BIO_s_fd() // 封装文件描述符的BIO接口,提供类似文件读写操作的功能
BIO_METHOD* BIO_s_file() // 封装标准文件接口的BIO,包括标准的输入输出设备如stdin等
BIO_METHOD* BIO_s_mem() // 封装内存操作的BIO接口,包括对内存的读写操作
BIO_METHOD* BIO_s_null() // 返回空的sink型BIO接口,写入这种接口的所有数据读被丢弃,读的时候总是返回EOF
// filter 类型
BIO_METHOD* BIO_f_base64() // 封装base64编码的BIO,写时编码,读时解码
BIO_METHOD* BIO_f_cipher() // 封装加解密的BIO,写时加密,读时解密
BIO_METHOD* BIO_f_md() // 封装信息摘要的BIO,读写经过摘要
BIO_METHOD* BIO_f_ssl() // 封装SSL协议的BIO,为SSL协议增加了一些BIO操作方法
BIO_METHOD* BIO_f_null() // 一个不作任何事情的BIO,简单传到下一个BIO。
BIO_METHOD* BIO_f_buffer() // 封装缓冲区的BIO,写入数据一般是准备传入下一个BIO
// 读出数据一般也是从另一个BIO传过来的。
3. EVP
提供了丰富的密码学中的各种函数。主要包括:摘要、对称算法
非对称算法的内核,filter BIO的实现。
EVP系列函数主要封装了加密、摘要、编码三大类型的算法,使用算法前需要调用OpenSSL_add_all_algorithms函数。
EVP 主要封装了如下功能函数:
- 实现了base64 编解码BIO;
- 实现了加解密BIO;
- 实现了摘要BIO;
- 实现了reliable BIO;
- 封装了摘要算法;
- 封装了对称加解密算法;
- 封装了非对称密钥的加密(公钥)、解密(私钥)、签名与验证以及辅助函数;
- 基于口令的加密(PBE);
- 对称密钥处理;
- 数字信封:数字信封用对方的公钥加密对称密钥,数据则用此对称密钥加密。发送给对方时,同时-发送对称密钥密文和数据密文。接收方首先用自己的私钥解密密钥密文,得到对称密钥,然后用它解密数据。
- 其他辅助函数。
3.1 全局函数
// 加载openssl支持的所有的对称算法和摘要算法,放入到哈希表中
#define OpenSSL_add_all_ciphers() \
OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS, NULL)
#define OpenSSL_add_all_digests() \
OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_DIGESTS, NULL)
// 也可以单独加载对称计算函数和摘要函数
int EVP_add_cipher(const EVP_CIPHER *cipher);
int EVP_add_digest(const EVP_MD *digest);
3.2 对称加密
NULL
EVP_enc_null()
DES
EVP_des_cbc(void)
3DES
EVP_des_ede_cbc(void) // 使用两个密钥
EVP_des_ede3_cbc(void) // 使用三个密钥
DESX
EVP_desx_cbc(void)
RC2
EVP_rc2_cbc(void)
EVP_rc2_40_cbc(void) // 40位CBC模式的RC2算法
EVP_rc2_64_cbc(void) // 64位CBC模式的RC2算法
RC4
EVP_rc4(void)
EVP_rc4_40(void) // 40位RC4算法
RC5
EVP_rc5_32_12_16_cbc(void)
IDEA
EVP_idea_cbc()
Blowfish
EVP_bf_cbc(void)
CAST
EVP_cast5_cbc(void)
AES
EVP_aes_128_ecb(void) // 128位AES算法
EVP_aes_192_ecb(void) // 192位AES算法
EVP_aes_256_ecb(void) // 256位AES算法
3.3 摘要
const EVP_MD *EVP_md_null(void);
const EVP_MD *EVP_md2(void);
const EVP_MD *EVP_md4(void);
const EVP_MD *EVP_md5(void);
const EVP_MD *EVP_md5_sha1(void);
const EVP_MD *EVP_blake2b512(void);
const EVP_MD *EVP_blake2s256(void);
const EVP_MD *EVP_sha1(void);
const EVP_MD *EVP_sha224(void);
const EVP_MD *EVP_sha256(void);
const EVP_MD *EVP_sha384(void);
const EVP_MD *EVP_sha512(void);
const EVP_MD *EVP_sha512_224(void);
const EVP_MD *EVP_sha512_256(void);
const EVP_MD *EVP_sha3_224(void);
const EVP_MD *EVP_sha3_256(void);
const EVP_MD *EVP_sha3_384(void);
const EVP_MD *EVP_sha3_512(void);
const EVP_MD *EVP_shake128(void);
const EVP_MD *EVP_shake256(void);
const EVP_MD *EVP_mdc2(void);
const EVP_MD *EVP_ripemd160(void);
const EVP_MD *EVP_whirlpool(void);
const EVP_MD *EVP_sm3(void);
3.4 非对称加密
EVP_PKEY_*() 函数
3.4 BASE64编/解码
将二进制数据转换为使用字符 A-Z,a-z,0-9,“+”和“/”表示。每3个字节的二进制数据,编码为上诉4个字符表示的4字节数据。如果输入数据长度不是3的倍数,则输出数据将使用“=”字符在最后填充。
EVP_Encode*
EVP_Decode*
3.5 消息验证码HMAC
HMAC_*
3.6 数字签名
EVP_Sign*
3.7 认证
EVP_Verify*
3.8 数字信封
EVP_Seal* // 写信
EVP_Open* // 读信