首页 > Note > 使用 openssl 进行 AES 加解密

使用 openssl 进行 AES 加解密

2019年1月8日 发表评论 阅读评论

在我之前的一篇博客里介绍了 对称加密的模式 . 这里主要聊一聊如何使用 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 ,表达如内存分配或者其他什么错误。官方指导代码如下:

二. 使用 EVP API 进行 AES 加解密

对于 AES 加解密,EVP API 分为两种,EVP_Encrypt / EVP_Decryp 系列 和 EVP_Cipher 系列。后者是对前者进一步的封装。它们具体使用的套路都是一样的:

  1. 创建加解密上下文 EVP_CIPHER_CTX
  2. 调用 xxxInit() 函数,使用 key(密钥)、iv(前置向量)cipher(算法) 对上下文初始化
  3. 调用 xxxUpdate() 函数进行加解密。该函数支持流式操作。即对于一段明文来说,分成多组按顺序进行加密,和一次性全部加密,不影响其生成的密文的正确性。
  4. 调用 xxxFinal() 函数获取上下文中遗留的信息
  5. 释放上下文, 完成加解密。

示例代码:

需要注意的地方有:

  1. key 和 iv 的长度。我们知道 AES 一个组的大小是 16Byte, 所以 iv 的长度为 16Byte 。key 的长度随着选择的 cipher 的不同而不同,如 AES_128_CFB 表达 key 长度为 128 位, AES_256_CFB 表示 key 长度为 256 位。如果 key 或 iv 的长度过长,超出的部分不会被使用,反之如果过短,则结果不可预测。 如果不清楚 key 和 iv 到底需要多长,可以使用 EVP_CIPHER_iv_length() / EVP_CIPHER_key_length() 来获取。
  2. 加解密上下文 EVP_CIPHER_CTX 要记得 释放,否则遗留在内存中的上下文信息可以会泄漏机密。

到这里,使用 OPENSSL 进行 AES 加解密已经基本讲完了。没错就是这么简单。如果想做更深一个层次的了解,可以看看以下部分。

三. 使用 Low Level API 进行 AES 加解密

我们知道,一个完整的 AES 分组加解密方法分为两个部分,一是 AES 部分, 二是分组模式部分。

  • 在 OPENSSL 中,AES 算法部分在 aes.h 中,为 AES_encrypt / AES_decrypt 。它是 AES 加解密的核心部分,每次处理 16 个字节(128位) 的数据加解密。
  • 分组与模式算法在 modes.h 中(具体实现在 openssl/crypto/modes 路径下) ,如 CRYPTO_cfb128_encrypt,它将数据分成每 16 字节一组,再将每一组/组与组之间进行不同的模式的计算

示例代码:

需要注意,在 AES_cfb128_encrypt() 函数中的参数 iv 是一个 non const 指针。这表示 iv 是会发生变化的。AES_cfb128_encrypt 同样支持流操作,在第二次及以后的操作中需要注意传入前一次操作之后的 iv(如果了解对称加密分组的原理,则不难理解这何要这样做)。

 

 

 

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.