2016-11-19 5 views
0

私はC++でAES暗号化を実験していますが、GitHubでAESの実装を見つけました。問題は、入力バイト配列のサイズを16で割り切れることで、大部分のデータがこの要件を満たしていないことです。私は、サイズが16で割り切れるまで、パディング(配列の最後に0-s)を追加したい。C++でBYTE配列にパディングを追加するには?

私は最も近いサイズを計算する関数を持っているが、パディングを配列に追加する方法は分からない。

PBYTE AddPadding(PBYTE Array, int size) 
{ 
    if (size % 16 != 0) 
    { 
     size += (16 - size % 16); 
     size = ceil(size/16) * 16; 
    } 

    BYTE* tmp = new BYTE[size]; 

    //the magic should happen here 

    return tmp; 
} 

入力と、呼び出しは以下のとおりです。

BYTE in[] = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 
     0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 
     0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 
     0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10, 0x25 }; 

PBYTE tmp = AddPadding(in, sizeof(in)); 
+0

配列の直後のバイトが空いていると仮定することはできません。 こうすれば、配列へのポインタへのポインタを渡し、適切なサイズの新しい配列を割り当て(+エラー処理)、内容を新しい配列にコピーし、ゼロを追加し、元の配列を解放する必要があります新しい配列を返します。明らかに、これは非効率的であり、失敗する可能性があります。 元の配列をそのまま処理し、最後の反復で仮想ゼロを追加する方がよいでしょう。 –

+0

暗号化時にパディングを追加するライブラリを使用し、暗号化時にそれを削除します。これは非常に一般的です。通常はオプションがあり、何度もデフォルトになります。実装が別のライブラリを見つけることをサポートしていない場合 – zaph

答えて

1

ほとんどの暗号ライブラリは、あなたのためのパディングを追加します。

  1. 必要なパディング量を計算します。

  2. C配列は拡張性がないので、平文とパディングの両方を保持するために新しい配列を作成する必要があります。

  3. PKCS#7パディングは一般的なので、理由がなければ選択してください。

  4. プレーンテキストとそれに続くパディングを新しい配列にコピーします。

  5. 暗号化のために新しいアレイをAESに渡します。ブロックに分割することができます。

  6. 解読時に、パディングが存在し、正しく形成されていることを確認します。不正なパディングは問題を示します。

  7. パディングを削除し、復号化されたテキストを返します。

関連する問題