0

私は現在、RijndaelManaged をこの方法でセットアップしています (サーバーが暗号化を処理する方法により、IV とキーは同じです)。サーバーもモードにCFB8を使用していますが、これを正しく設定しましたか?

    public static RijndaelManaged GenerateAES(byte[] key)
    {
        RijndaelManaged cipher = new RijndaelManaged();
        cipher.Mode = CipherMode.CFB;
        cipher.Padding = PaddingMode.None;
        cipher.KeySize = 128;
        cipher.Key = key;
        cipher.IV = key;

        return cipher;
    }

次のようにしてデータを書き込みます。 ICryptoTransform e = GenerateAES(key).CreateEncryptor();

        using(CryptoStream stream = new CryptoStream(BaseStream, e, CryptoStreamMode.Write))
        {
            stream.WriteByte(b);
            stream.FlushFinalBlock();
        }

BaseStream は私が開いた NetworkStream であり、「b」は関数に送信した値です。

ストリームに (テストとして) 0x00 を試行すると、次のエラーが発生します。

System.Security.Cryptography.CryptographicException: Length of the data to encrypt is invalid.
at System.Security.Cryptography.RijndaelManagedTransform.EncryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
at System.Security.Cryptography.CryptoStream.FlushFinalBlock()
at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()

この機能テストは、外部ライブラリに依存せずにサーバーと通信できるかどうかのみをテストしました。

4

2 に答える 2

6

を [なし] に設定し、PaddingModeデータの完全なブロックよりも少ないバイトを暗号化しようとしています。より多くのデータ (の倍数cipher.BlockSize) を暗号化するか、パディング モードを [なし] 以外に設定して、適切な長さに自動的にパディングされるようにします。

編集:

RijndaelManaged のデフォルトの FeedbackSize は 128 ビットですが、CFB8 を使用したいと考えています。を 8 に設定するcipher.FeedbackSizeと、パディングなしでストリーム暗号として使用できるようになり、CryptoStream に書き込まれるすべてのバイトが暗号化され、出力ストリームにすぐに書き込まれます。これにより暗号化プロセスが終了するため、各書き込み後に呼び出すべきではありません。FlushFinalBlock

于 2012-08-02T12:16:16.223 に答える
0

ここで解決策を提供しました: https://stackoverflow.com/a/29038974/725903

アイデアは、暗号化/復号化の前に必要なバイトを追加し、戻り時にそれらを削除する TransformFinalBlock を処理する CryptoStream ctor に渡された ICryptoTransform をラップすることです。

于 2015-03-13T18:09:04.720 に答える