C# - Bouncy Castle 追加のパディングブロックを追加する

okwaves2024-01-25  8

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 バリアントは復号化中にゼロ パディングを削除しないため、復号化に必要なのは最初の部分だけです。

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。