在我之前的一篇博客里介绍了 对称加密的模式 . 这里主要聊一聊如何使用 openssl
来进行 AES 加密
.
一. OPENSSL crypto API
openssl 加密 API 分两个部分: High Level
and Low Level
. 对于大部分人来说,使用 High Level 就够用了, 这些 API 被冠以 EVP
(Envelope) ,表示对 Low Level 的封装。High Level API 提供了包括 对称/非对称加解密
, 签名
, 验证
, 哈希
,MAC
等一系列组件,屏蔽了 Low Level API 的复杂逻辑,使用起来安全高效。对于除非有需要进行加密算法级别的改进,否则不建议使用 Low Level API.
大部分 EVP API 有一个 int 型返回值 ,用来表示操作是否成功:1 表示成功, 0 表示失败。但有些时候也会返回 -1 ,表达如内存分配或者其他什么错误。官方指导代码如下:
1 2 3 4 5 6 7 |
if(1 != EVP_xxx()) goto err; if(1 != EVP_yyy()) goto err; /* ... do some stuff ... */ err: ERR_print_errors_fp(stderr); |
二. 使用 EVP API 进行 AES 加解密
对于 AES 加解密,EVP API 分为两种,EVP_Encrypt / EVP_Decryp
系列 和 EVP_Cipher
系列。后者是对前者进一步的封装。它们具体使用的套路都是一样的:
- 创建加解密上下文
EVP_CIPHER_CTX
- 调用
xxxInit()
函数,使用key(密钥)、iv(前置向量)
和cipher(算法)
对上下文初始化 - 调用
xxxUpdate()
函数进行加解密。该函数支持流式操作。即对于一段明文来说,分成多组按顺序进行加密,和一次性全部加密,不影响其生成的密文的正确性。 - 调用
xxxFinal()
函数获取上下文中遗留的信息 - 释放上下文, 完成加解密。