kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

OpenSSLを使った暗号化 (v1.1.1d)

2015-10-24にOpenSSLでの暗号化の記事を書いたけど、 最近になって試したところコンパイルできなくなっていたので、その修正版。

昔の記事、バージョン書いてなかったから差がわかんね。

環境

  • OpenSSL v1.1.1d (ソースからビルド)
  • macOS 10.15.3
  • Xcode 11.3.1

EVP_CIPHER_CTXの作成方法がEVP_CIPHER_CTX_newを使用するようになった

違いと言ってもEVP_CIPHER_CTXの作成方法が異なるだけ。 通常の構造体として使えば良かったのがオペークポインタ形式になっているので、 専用関数で作成する。で、専用関数でリリースする。

// 昔の
EVP_CIPHER_CTX ctx = {}; // 関数定義が非公開になったので、作れなくなった

// 新しいの
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); // newで作って
...
EVP_CIPHER_CTX_free(ctx); // freeで開放

暗号化処理に関してざっくり書くと、以下。EVP_CIPHER_CTXの作成方法が変わっただけで、 それ以外の部分は古いバージョンとの違いは無い。

#include <openssl/evp.h>

EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);

// 暗号化の設定で、EVP_aes_128_ecb等いろいろ
const unsigned char iv[16] = {0};
EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);

// ブロックサイズで割り切れる部分の処理
int outl = 0;
EVP_EncryptUpdate(ctx, encrypted, &outl, data, data_size);

// 最後のブロックの処理で、PKCSパディングされる。
int pad = 0;
EVP_EncryptFinal_ex(ctx, encrypted + outl, &pad);

EVP_CIPHER_CTX_cleanup(ctx);
EVP_CIPHER_CTX_free(ctx);

ドキュメント

OpenSSLの公式ページの構成が変わっているので、古いURLはリンク切れになった。 以下は完全ソースコードとv1.1.1のドキュメントへのリンク。