私は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));
配列の直後のバイトが空いていると仮定することはできません。 こうすれば、配列へのポインタへのポインタを渡し、適切なサイズの新しい配列を割り当て(+エラー処理)、内容を新しい配列にコピーし、ゼロを追加し、元の配列を解放する必要があります新しい配列を返します。明らかに、これは非効率的であり、失敗する可能性があります。 元の配列をそのまま処理し、最後の反復で仮想ゼロを追加する方がよいでしょう。 –
暗号化時にパディングを追加するライブラリを使用し、暗号化時にそれを削除します。これは非常に一般的です。通常はオプションがあり、何度もデフォルトになります。実装が別のライブラリを見つけることをサポートしていない場合 – zaph