openssl结构

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* // 读信

此文源自:
OpenSSL中文手册之BIO库详解
OpenSSL中文手册之EVP库详解

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值