0

サーバーとクライアント間のデータ転送に OpenSSL を使用したいと考えています。CBC モードの AES で EVP を使用して実行したいと考えています。しかし、クライアントで 2 番目のメッセージをデコードしようとすると、EVP_EncryptFinal_ex は 0 を返します。私のスキームは画像に示されています。

近似スキーム

この動作は、1 つの EVP コンテキストに対して EVP_EncryptFinal_ex (および EVP_DecryptFinal_ex) を 2 回呼び出すためだと思います。正しく行う方法は?

4

1 に答える 1

1

EVP docsに従って呼び出しEVP_EncryptUpdate()た後に呼び出すことはできません。 EVP_EncryptFinal_ex()

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

代わりに、 を呼び出して、暗号化用の暗号 ctx を再度セットアップする必要がありますEVP_EncryptInit_ex()。とは異なりEVP_EncryptInit()EVP_EncryptInit_ex()呼び出しごとに既存のコンテキストを割り当てたり解放したりせずに、引き続き既存のコンテキストを再利用できることに注意してください。

于 2016-06-06T20:26:59.723 に答える