2016-07-18 8 views
1

は、私はEVPインターフェイスを介して暗号化のためのCTRモードでのOpenSSLのAESを使用し、それは私がこのようなものを持っている:入力データのCTRモードで出力バッファをAESブロックサイズの倍数にする必要がありますか?私のCコードで

ret = EVP_EncryptInit_ex(ctx, EVP_aes_256_ctr(), NULL, key, iv)) 
... 
ret = EVP_EncryptUpdate(ctx, out, &outlen, in, inlen); 

長は、AESブロックサイズの倍数ではありません、その場合たとえば、CBCモードを使用すると、出力バッファにパディングするために追加のバイトを割り当てる必要があります。

私はCTRモードで同じことをする必要がありますか?また、私はCFBとOFBモードについて興味があります。

EVP_EncryptUpdateのOpenSSL manは、「ストリーム様」モードに特化したものは何も言わず、パディングのために追加のバイトが必要であることを警告します。

+0

@otus私たちは、Stackoverflowへの移行を考慮する必要があります。私自身は十分な評判を持っていません。 – olegst

+0

通常、キーストリームを生成するために必要なブロックは、暗号実装によって内部的にバッファされます。 –

+0

あなたの仲間の注意のためにあなたのポストにフラグを立てて、あなたの希望を説明することができます... – SEJPM

答えて

2

TLDR:EVPしないパッドCTR(及び他のストリームモード/暗号)は、実際に

EVP_EncryptUpdate自体決してパッド、もののできるもの呼から次の「キャリー」部分ブロック。あなたのコード内...は以前EncryptUpdateが含まれていない場合ので、これは(最初の)EncryptUpdateは常にブロック整列され、その出力が長くなることはありません:

EVP_EncryptUpdate()内のバッファからINLバイトを暗号化し、暗号化されたバージョンを出力します。この関数は、連続したデータブロックを暗号化するために複数回呼び出すことができます。書き込まれるデータの量は、暗号化されたデータのブロックの配置に依存します。その結果、書き込まれるデータの量は0バイトから(inl + cipher_block_size - 1)までの範囲であるため、十分な容量が必要です。書き込まれた実際のバイト数はoutlに格納されます。また、inとoutが部分的に重複しているかどうかをチェックし、失敗した場合は0が返されます。

パディングが有効になっている場合(デフォルト)、その後EVP_EncryptFinal_ex():

これは、manページの次の段落で説明するように、必要なときにパディングので、「余分な」出力を追加しEVP_EncryptFinal[_ex]です部分的なブロックに残っているデータである「最終的な」データを暗号化します。これは、以下の「NOTES」セクションで説明されているように、標準ブロックパディング(別名PKCSパディング)を使用します。暗号化された最終データは、1つの暗号ブロックに十分なスペースを有するべきであると書き出される。書き込まれたバイト数はoutlに格納されます。この関数が呼び出された後、暗号化操作は終了し、それ以上EVP_EncryptUpdate()を呼び出す必要はありません。

パディングが無効の場合、EVP_EncryptFinal_ex()はそれ以上のデータを暗号化せず、データが部分ブロックに残っているとエラーを返します。つまり、データの合計長がブロックサイズの倍数でない場合です。暗号文は、実際にすべてのUpdateのコールの出力で構成されているので

しかし、プラスFinalコールの出力(またはコール一つだけあれば)、合計バッファは、(最大)をする必要がありませんパディングが適用される場合はよりも1ブロック大きくなります

マニュアルページでは、パディングはストリーム暗号(RC4など)やストリームモード(CTR OFB * CFB *など)には適用されません。各暗号/モードの組み合わせは、のtypedefであるタイプEVP_CIPHERのオブジェクトで記述されます。これはEVP_aes_256_ctr()と同様のルーチンがポインタを返すものです。とりわけ、この構造体にはブロックサイズ(バイト単位)を含むフィールドblock_sizeが含まれています。ストリームモードと暗号の場合、ダミー値1が特別に扱われます。EncryptFinal_exは有効にしても埋め込みを追加せず、DecryptFinal_exは有効にしても埋め込みを取り除きません。

1

CTRモードで出力バッファをAESブロックサイズの倍数にする必要がありますか?

いいえ、CTRモードには、この要件はありません。この点で、CTRモードはOFB anb CFBモードに似ています。対照的に、ECBとCBCモードではブロックサイズの倍数が必要です。

OpenSSLは、のInit/Update/Finalパターンを使用し、入力バイトと出力バイトの両方が必要になるまでバッファリングされます。必要に応じて、一度に1バイトずつ挿入することができます。

内部的には、EVPオブジェクトは暗号化を実行するのに十分なまで入力をバッファします。 CTRモードはストリーミング可能なので、1バイトの入力(暗号化されたカウンタとプレーンテキストの単純XOR)を処理した後、1バイトの出力が利用可能になります。 EVPオブジェクトは、Finalを呼び出すまで出力バイトをバッファします。

関連する問題