【发布时间】:2020-01-16 20:17:18
【问题描述】:
我编写了完全解密输入字符串的代码。但由于这是一种 ECB 模式,我想以某种方式解密的不是整个输入文本,而是一个单独的块。
据我了解,ECB AES 以 8 字节块进行加密。例如,如何将AES_Decrypt 函数添加到它,以便它只解密输入字符串的最后 8 个字节。
byte[] bytesToBeDecrypted = new byte[32];
byte[] 8_bytesToBeDecrypted = new byte[8]; // Only 8 bytes of bytesToBeDecrypted
public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
{
byte[] decryptedBytes = null;
string salt = "12345678";
Encoding unicode = Encoding.Unicode;
byte[] saltBytes = unicode.GetBytes(salt);
using (MemoryStream ms = new MemoryStream())
{
using (RijndaelManaged AES = new RijndaelManaged())
{
AES.KeySize = 256;
AES.BlockSize = 128;
AES.Padding = PaddingMode.Zeros;
var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 65535);
AES.Key = key.GetBytes(AES.KeySize / 8);
AES.IV = key.GetBytes(AES.BlockSize / 8);
AES.Mode = CipherMode.ECB;
using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
cs.Close();
}
decryptedBytes = ms.ToArray();
}
}
return decryptedBytes;
}
【问题讨论】:
-
AES 的块大小为 16 字节。你使用 Rijndael 和 Rijndael != AES。
-
但是 AES 控制示例与我使用 Rijndael 得到的匹配
-
AES 具有 128 位的固定块大小和 128、192 或 256 位的密钥大小,而 Rijndael 可以指定 32 位的任意倍数的块和密钥大小,最小128 位,最大 256 位。
-
如果使用 8 字节进行加密,剩下的就是填充。你使用 PaddingMode.Zeros 用 0 填充其余部分
-
谢谢!使用 Rijndael 代替 AES 会降低工作速度吗?据我了解,Rijndael 比 AES 更通用?
标签: c# encryption aes