2

に問題がAesEncryptあります。テキストを暗号化する次のコード ブロックがあります。

private byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
{
    // Check arguments. 
    if (plainText == null || plainText.Length <= 0)
        throw new ArgumentNullException("plainText");
    if (Key == null || Key.Length <= 0)
        throw new ArgumentNullException("Key");
    if (IV == null || IV.Length <= 0)
        throw new ArgumentNullException("Key");
    byte[] encrypted;
    // Create an Aes object 
    // with the specified key and IV. 
    using (Aes aesAlg = Aes.Create())
    {
        aesAlg.Padding = PaddingMode.None;
        aesAlg.Key = Key;
        aesAlg.IV = IV;

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

        // Create the streams used for encryption. 
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {
                    swEncrypt.Write(plainText);
                    csEncrypt.FlushFinalBlock();
                }
            }
            encrypted = msEncrypt.ToArray();
        }
    }

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

問題は、場合によってはmsEncrypt.ToArray()が空の を返しbyte[]、場合によってはうまく機能することです...

私の一日を救ってください!

4

1 に答える 1

4

暗号化swEncryptしよFlushFinalBlock()うとしているすべてのデータがCryptoStream.

変化する

swEncrypt.Write(plainText);
csEncrypt.FlushFinalBlock();

swEncrypt.Write(plainText);
swEncrypt.Flush();
csEncrypt.FlushFinalBlock();

この変更を行った後CryptoStream、入力がブロック サイズ (AES の場合は 16 バイト) の倍数でない場合、例外がスローされるようになりました。

この問題を解決するには、2 つのオプションがあります。

  1. ブロック サイズの倍数になるまで手動で入力をパディングします。の場合"This is a test string"、次のようにパディングします"This is a test string\0\0\0\0\0\0\0\0\0\0\0"。パディング文字は何でもかまいませんが、復号化後にパディングを必ず削除してください。
  2. パディングモードをまたはのような別のものに変更しPKCS7ますZeros。絶対に使用する必要がない限りPaddingMode.None(たとえば、他のシステムとの互換性のため)、これがより良い解決策です。
于 2013-09-13T13:06:31.263 に答える