BounyCastle v1.8.6 .net コアを使用して AES 128 CBC 暗号化を実装しました。長さ 16 バイトのデータを暗号化しようとすると、データ (おそらくパディング) を含むさらに 16 バイトが追加されるという問題がありました。なぜこれを追加するのかわかりません。デフォルトの C# 実装ではそのようなことは行われないことを知っています
文字列としての 16 進形式のデータの例
6752b87027fc7728fbe4ec2f0d76da75 => EE93F245FCDB928BF8E3012C9E5150EDA1B876A6D790CFC69C2F129215B3C938
これは、暗号化するデータが 32、64、128 などの場合にも発生しました。
コード:
int DefaultBlockSize = 16;
public byte[] Encrypt(byte[] plainBytes, byte[] key, byte[] iv = null)
{
iv ??= new byte[DefaultBlockSize] ;
AesEngine engine = new AesEngine();
CbcBlockCipher blockCipher = new CbcBlockCipher(engine);
IBlockCipherPadding padding = new ZeroBytePadding();
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(blockCipher, padding);
KeyParameter keyParam = new KeyParameter(key);
ParametersWithIV keyParamWithIV = new ParametersWithIV(keyParam, iv, 0, DefaultBlockSize);
// Encrypt
cipher.Init(true, keyParamWithIV);
byte[] outputBytes = new byte[cipher.GetOutputSize(plainBytes.Length)];
int length = cipher.ProcessBytes(plainBytes, outputBytes, 0);
cipher.DoFinal(outputBytes, length);
return outputBytes ;
}
これを修正する方法はありますか?
------------------------
投稿されたコードゼロパディングを適用します。ゼロ パディングにはいくつかのバリエーションがあります。 1 つは、平文の長さが既にブロック サイズの整数倍である場合に完全なブロックで埋め込みます (例: BC を使用するバリアント)。もう 1 つはそうではありません (例: .NET を使用するバリアント)。ここも参照してください。ゼロパディングセクション。
BC バリアントと .NET バリアントのもう 1 つの違いは、BC バリアントでは復号化時にパディングが削除されるのに対し、.NET バリアントではパディングが削除されないことです。
この曖昧さは、ゼロ パディングの欠点です。もう 1 つの欠点は、ゼロ パディングにはパディング バイト数に関する情報が含まれていないため、プレーンテキストの終端 0x00 バイトとパディング 0x00 バイトを区別できないことです。
この信頼性の低さのため、PKCS7 パディングの方が優れています。これは RFC 2315 (セクション 10.3、注 2) で明確に定義されており (つまり、異なるバリアントはありません)、平文バイトと区別できるようにパディング バイト数に関する情報が含まれています。
BouncyCastle には、さまざまなゼロ パディング バリアントから選択するオプションはありません。上記のバリアントのみが提供されます。したがって、.NET バリアントで BouncyCastle を使用するには、これを自分で実装する必要があります。 まず、PaddedBufferedBlockCipher を BufferedBlockCipher に置き換える必要があります。これは、単に (BouncyCastle) パディングが使用されないことを意味します。次に、.NET バリアントを対応するメソッドで実装する必要があります。これは比較的単純です。プレーンテキストの長さがブロック長の整数倍でない場合、この条件が満たされるまでパディングは 0x00 値で行われます。に満たされます。このメソッドは、暗号化の前に平文に適用されます。 .NET バリアントは復号化中にゼロ パディングを削除しないため、復号化に必要なのは最初の部分だけです。