openSSLを用いたAES暗号化

・openSSL
⇒オープンソースで開発・提供されるソフトウェア。
 SSL(Secure Sockets Layer)はセキュリティ通信を行うプロトコル。

 

・AES暗号化(Advanced Encryption Standard)
⇒秘密鍵を用いた暗号方式。
 鍵長:128bit/192bit/256bit
 ブロック長:128bit/192bit/256bit

 

■暗号化処理
/* ①初期化 */
int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, ENGINE *impl,
                       unsigned char *key, unsigned char *iv);
⇒引数
・[ctx]  暗号コンテキスト
・[type] 暗号アルゴリズム(※)
・[impl] 暗号化用に初期化(NULLでデフォルト指定)
・[key]  共通鍵暗号の鍵
・[iv]  初期ベクトル

 

/* ②暗号化 */
int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
                     unsigned char *in, int inl);
⇒引数
・[ctx]  暗号コンテキスト
・[out]  暗号化後
・[outl] [out]のサイズ
・[in]   暗号化前(平文)
・[inl]  [in]のサイズ

 

/* ③最後のブロックの暗号化 */
int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigbed char *outm, int *outl);
⇒引数
・[ctx]  暗号コンテキスト
・[outm] 最終ブロックの暗号化
・[outl] [out]のサイズ

 

/* ④解放 */
void EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *ctx);
⇒引数
・[ctx] 暗号コンテキスト

 

■復号処理
/* ①初期化 */
int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, ENGINE *impl,
                       unsigned char *key, unsigned char *iv);
⇒引数
・[ctx]  復号用のコンテキスト
・[type] 暗号関数(EVP_aes_128_cbc)
・[impl] 暗号化用に初期化(NULLでデフォルト指定)
・[key]  共通鍵暗号の鍵
・[iv]  初期ベクトル

 

/* ②復号 */
int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
                     unsigned char *in, int inl);
⇒引数
・[ctx]  復号用のコンテキスト
・[out]  復号後(平文)
・[outl] [out]のサイズ
・[in]   復号化前(復号化)
・[inl]  [in]のサイズ

 

/* ③最後のブロックの復号 */
int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigbed char *outm, int *outl);
⇒引数
・[ctx]  復号用のコンテキスト
・[outm] 最終ブロックの復号
・[outl] [out]のサイズ

 

/* ④解放 */
void EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *ctx);
⇒引数
・[ctx] 復号用のコンテキスト


①初期化処理
(※)暗号アルゴリズム
・EVP_aes_128_cbc
⇒(aes)AES暗号化、(128)ビット、(cbc)CBCモード

・CBCモード(Cipher Block Chaining Mode)
⇒平文の各ブロックは前の暗号文のXOR(排他的論理和)を取る形式で
 最も広く用いられている暗号利用モード。

・その他の暗号利用モード
 ECPモード(Electronic Codebook)
 CFBモード(Cipher Codebook)
 OFBモード(Output Codebook)

 

②暗号化(復号)処理
[in]から始まる [inl]バイトのデータを暗号化 (復号)する。
[out]に出力する [out]に書き込まれたバイト長が [outl]に設定される。

連続するデータブロックを暗号化(復号)する際は当関数を複数回呼び出す。

 

③最終ブロックの暗号化(復号)処理
ブロック長に満たないデータをパディング処理し暗号化(復号)する。

 

④解放
暗号(復号用)コンテキストを解放する。

 

・補足
ヘッダファイル[openssl/evp.h]をインクルードする。
#include <openssl/evp.h>

以上