我想在另一个加密算法中使用AES,因此我需要在for循环中一次加密单个128位块。
然而,MSDN上显示某些加密类(如RijndaelManaged)的使用的示例使用IO流和ICryptoTransform将整个明文直接转换为密文。
但我认为这对于整个长文本可能没问题,但是如果我只处理for循环中的单个块,那么使用这三个流会导致不必要的开销吗?还有另一种方法吗?
答案 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;
}