1

バイト[]の暗号化配列を実行する必要があります。Microsoft で入手可能な例を使用しました。残念ながら、暗号化されたデータは 16 の倍数のサイズに切り捨てられます。データの例でバイト 0 を 8 倍にすると、データは適切に暗号化されます。パディングが設定されていますが、それを変更するものは何もありません。この問題を解決するには、データが途切れないようにします。

public byte[] EncryptAES(byte[] plainBytes)
{
    System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
    byte[] FKey = encoding.GetBytes("A002AD9AD73C402190C3E733D82CEA00");
    byte[] FIV = encoding.GetBytes("zyxwvutsrqponmlk");

    // Check arguments.
    if (plainBytes == null || plainBytes.Length <= 0)
        throw new ArgumentNullException("plainText");
    if (FKey == null || FKey.Length <= 0)
        throw new ArgumentNullException("Key");
    if (FIV == null || FIV.Length <= 0)
        throw new ArgumentNullException("Key");
    byte[] encrypted;
    // Create an RijndaelManaged object
    // with the specified key and IV.
    using (RijndaelManaged rijAlg = new RijndaelManaged())
    {
        rijAlg.Key = FKey;
        rijAlg.IV = FIV;
        rijAlg.Padding = PaddingMode.Zeros;
        rijAlg.Mode = CipherMode.CBC;

        // Create a decrytor to perform the stream transform.
        ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);

        // Create the streams used for encryption.
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                // plainBytes.Length = 2216 
                csEncrypt.Write(plainBytes, 0, plainBytes.Length);

                // encrypted.Length = 2208
                encrypted = msEncrypt.ToArray();
            }
        }
    }

    // Return the encrypted bytes from the memory stream.
    return encrypted;
}
4

3 に答える 3

2

FlushFinalBlock() を呼び出すだけで、16 の倍数の問題が解決されます。

于 2015-01-20T03:54:56.090 に答える
2

CryptoStream:

CryptoStream オブジェクトを使用した後は、必ずCloseメソッドを呼び出して明示的に閉じる必要があります。これにより、ストリームがフラッシュされ、残りのすべてのデータ ブロックが CryptoStream オブジェクトによって処理されます。ただし、Closeメソッドを呼び出す前に例外が発生した場合、CryptoStream オブジェクトが閉じられない可能性があります。Closeメソッドが常に呼び出されるようにするには、Close メソッドの呼び出しを try/catch ステートメントの finally ブロック内に配置します

(私の強調)

そのため、結果を操作する前に呼び出しCloseてください。


基本的に、パディングは、暗号化されたブロックのシーケンスの最後のブロックを処理するために使用されます。CryptoStreamは を呼び出す回数がわからないため、 を呼び出すまでWrite()、パディングを適用したり、最終的な不完全なブロックを書き込んだりしませんClose

(または、Monkieboy が指摘するように、FlushFinalBlock終了したことを示すためにも使用できます)

于 2013-03-08T10:43:52.827 に答える
0

これを試して

    using (MemoryStream msEncrypt = new MemoryStream())
    {
        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
        {
            csEncrypt.Write(plainBytes, 0, plainBytes.Length);
        }
        encrypted = msEncrypt.ToArray();
    }
于 2013-03-08T10:42:23.270 に答える