6

CBC モードの AES アルゴリズムでデータを暗号化しようとしています。このため、.Net Library 'Bouncy Castle' を使用しています。私は暗号のバックグラウンドがないので、簡単な方法で使用しようとしています。ここに私の暗号化コードがあります

public byte[] encrypt(byte[] key, byte[] iv,byte[] data) 
    {
        IBlockCipher engine=new AesFastEngine();
        KeyParameter keyParam = new KeyParameter(key);
        CbcBlockCipher cipher = new CbcBlockCipher(engine);

        ICipherParameters parameters = new ParametersWithIV(keyParam, iv);

        byte[] output=new byte[16+data.Length];
        cipher.Init(true, parameters);
        cipher.ProcessBlock(data, 0, output, data.Length);

        //process output
        byte[] cipherArray = new byte[data.Length];
        /*
        int k=0;
        for (int i = 0; i < output.Length; i++) 
        {
            if (output[i]!= 0) 
            {
                cipherArray[k++] = output[i];
            }
        }
         */
        return cipherArray;

    }

16 の乗算ではない入力を試みると、例外が発生します。配列の右側に (16-length%16) の数値をパディングし、左側をゼロにすると、結果が得られます。しかし、結果は私にとっても問題です。次のような結果が得られます。

[0][0][0][0[111][22][33][44][66][77][33][12][32][23][0][0][0][0][0] 

左右ともゼロ。

私はそれが私の機能の使用についてかもしれないと思いましたProcessBlock(data, 0, output, data.Length)。出力が私の暗号化されたテキストになるという前提で使用していますが、出力は入力の長さよりも長くなるはずです。この関数に関するドキュメントがないため、間違った方法で使用している可能性があります。どんな助けでもいただければ幸いです

4

2 に答える 2

5

Bouncy Castle がパディングを行います。開始するには、次のように暗号を設定する必要があります。

  PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(engine), new Pkcs7Padding());

コードの残りの部分が機能するにはcipher.GetOutputSize(data.Length) ProcessBytes、を使用する必要があるDoFinalため、パディングが正しく追加されます。

byte[] output = new byte[cipher.GetOutputSize(data.Length)];
int len = cipher.ProcessBytes(data, 0, data.Length, output, 0);
cipher.DoFinal(output, len);

CodeReview の Bouncy Castle で AES-GCMを使用する簡単な例があります。

AES-GCM は認証済み暗号化を追加しますが、API を使用する基本原則は同じです。

Bouncy Castle をバックエンドとして使用した高レベル暗号化フレームワークKecyzarの C# ポートもあります。これはより難しい例ですが、抽象化された暗号化コードSymmetricStreamは、 BouncyAesKeyで AES-CBC を使用するためにセットアップされています。

于 2012-11-13T17:16:00.587 に答える
3

通常、標準のパディング アルゴリズムを使用して、平文データが暗号のブロック サイズに合わせられるようにします。

現在、ゼロ パディングを手作業でコーディングしています。元のデータが 0 バイトで終わることを禁止するため、これは良い選択ではありません。これをパディングとどのように区別できますか?

PKCS #7 paddingなどの標準のパディングを使用することをお勧めします。これは、よく似ているため、「 PKCS #5 padding 」と呼ばれることが多いことに注意してください。

標準パディングの使用例については、この他の SO の質問 - C# で Bouncy Castle を使用して暗号化/復号化 - を参照することをお勧めします。

于 2012-11-13T16:03:28.417 に答える