如何使用AES加密单个块?

时间:2015-10-04 23:01:32

标签: .net cryptography

我想在另一个加密算法中使用AES,因此我需要在for循环中一次加密单个128位块。

然而,MSDN上显示某些加密类(如RijndaelManaged)的使用的示例使用IO流和ICryptoTransform将整个明文直接转换为密文。

但我认为这对于整个长文本可能没问题,但是如果我只处理for循环中的单个块,那么使用这三个流会导致不必要的开销吗?还有另一种方法吗?

1 个答案:

答案 0 :(得分:0)

根据此blog post

  

" ...使用了ICryptoTransform接口的TransformBlock方法。   这个方法完全对底层进行了一次块转换   分组密码(在我们的例子中是AES),没有涉及明确的填充   在CBC的情况下也没有链接。要获得一致的AES块加密/解密,必须使用初始向量(IV)消除XOR。无论是使用ECB模式还是使用初始IV = 0 ^ {128}"

的CBC模式,都可以实现这一点。
private static byte[] AES_encrypt_block(byte[] plainText, byte[] Key)
{
    byte[] output_buffer = new byte[plainText.Length];

    using (AesManaged aesAlg = new AesManaged())
    {
        //If CBC, must initialize IV = O_{128}
        //aesAlg.Mode = CipherMode.CBC;
        //aesAlg.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        aesAlg.Mode = CipherMode.ECB;

        aesAlg.BlockSize = 128;
        aesAlg.KeySize = 128;
        aesAlg.Padding = PaddingMode.None;
        aesAlg.Key = Key;

        // Create a decrytor to perform the stream transform.
        ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
        encryptor.TransformBlock(plainText, 0, plainText.Length, output_buffer, 0);
    }

    return output_buffer;
}

private static byte[] AES_Decrypt_block(byte[] cipherText, byte[] Key)
{
    // Declare the string used to hold the decrypted text. 
    byte[] output_buffer = new byte[cipherText.Length];

    using (AesManaged aesAlg = new AesManaged())
    {
        //If CBC, must initialize IV = O_{128}
        //aesAlg.Mode = CipherMode.CBC;
        //aesAlg.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        aesAlg.Mode = CipherMode.ECB;

        aesAlg.BlockSize = 128;
        aesAlg.KeySize = 128;
        aesAlg.Padding = PaddingMode.None;
        aesAlg.Key = Key;

        // Create a decrytor to perform the stream transform.
        ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
        decryptor.TransformBlock(cipherText, 0, cipherText.Length, output_buffer, 0);
    }

    return output_buffer;
}