@goma_goma_goma

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

(OpenSSL)AES256-CBCで暗号化処理が出来ない

Q&A

Closed

解決したいこと

openssl 3.0.8を使用してAES256(cbc)で暗号化を行いたいのですが、
暗号化関数(EVP_EncryptUpdate)にて、空(レングス0)となります。

WS000001.JPG
EVP_EncryptInit_ex実行後、
暗号コンテキスト(ctx)にキー(key)、初期ベクトル(iv)が入っていないのが、原因でしょうか。

該当するソースコード

環境
 visual studio 2019 community
言語
 C++
ビルド
64bit

BYTE byData[8] = { 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31 }; // 暗号化したいデータ

unsigned char ckey[] = "12345678901234567890123456789012"; // キー
unsigned char civ[] = "hogehogehogehoge"; // 初期ベクトル

int len = 0;

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

// EVP_EncryptInit_ex は、暗号コンテキスト ctx を暗号関数EVP_aes_256_cbc、
// 暗号エンジン impl で暗号化用に初期化する
// impl が NULL の場合,デフォルトの実装が用いられる
EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, ckey, civ);

int c_len = 8 + EVP_MAX_BLOCK_LENGTH;
unsigned char* ciphertext = new unsigned char[c_len];
memset(ciphertext, 0x00, c_len);

// in から始まる inl バイトのデータを暗号化し,out に出力する
EVP_EncryptUpdate(ctx, ciphertext, &len, byData, datalen);

// 暗号コンテキスト ctx を解放する.暗号処理終了後
// 重要な情報がメモリ上に残らないようにこの関数を呼ばなければならない
EVP_CIPHER_CTX_cleanup(ctx);

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

0 likes

1Answer

恐らくですが、ブロックサイズ未満であるdatalen=8は、EVP_EncryptUpdate()では出力されません。当該データを出力するには、EVP_EncryptFinal_ex()を呼び出す必要があると思われます。

なお、上記ページのEXAMPLESには暗号化のサンプルコードもあります。

(google翻訳結果)

EVP_EncryptUpdate()
(略)
パディングが有効な場合 (デフォルト)、EVP_EncryptFinal_ex() は「最終」データ、つまり部分ブロックに残るデータを暗号化します。 以下の「注」セクションで説明されているように、標準のブロック パディング (別名 PKCS パディング) を使用します。
暗号化された最終データは、1 つの暗号ブロックに十分なスペースがあるはずの外部に書き込まれます。 書き込まれたバイト数は outl に配置されます。 この関数が呼び出された後、暗号化操作は終了し、EVP_EncryptUpdate() へのそれ以上の呼び出しは行われません。

もっと詳しい解説

1Like

Your answer might help someone💌