假设使用 256 密钥/IV 通过 AES 加密少量数据。加密后的数据是可以知道的。例如:
abcdefghijklmno|axXXyyYY343433553353afsafaadfafdfsafsf|2013-01-01T00:00:00
前两个部分(如果您破坏管道字符上的数据)很少改变。最后一部分,日期/时间确实会改变,但不会经常改变。我注意到改变日期但不改变消息的第一部分会导致密文的开头始终相同,大概是因为纯文本开始时是相同的。
这是否会让我面临针对加密算法的任何类型的攻击?通过在纯文本的开头添加盐值我会得到什么吗?
我正在使用该类AesManaged生成 IV/密钥并加密/解密纯文本(如果这有影响的话)。
为了解决这个问题,通常为每个密文随机生成IV,并将未加密的IV添加到加密数据的前面。这样,每个加密数据都与其他数据不同。
在代码中应该是
string str = "abcdefghijklmno|axXXyyYY343433553353afsafaadfafdfsafsf|2013-01-01T00:00:00";
byte[] data = Encoding.UTF8.GetBytes(str);
byte[] key = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; // Your random key, I hope more random!
byte[] encrypted;
// Encrypt
using (var am = new AesManaged())
using (var rng = new RNGCryptoServiceProvider())
{
am.Key = key;
var iv = new byte[am.BlockSize / 8];
rng.GetBytes(iv);
am.IV = iv;
using (var encryptor = am.CreateEncryptor())
using (var ms = new MemoryStream())
{
ms.Write(iv, 0, iv.Length);
using (var encStream = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
encStream.Write(data, 0, data.Length);
}
encrypted = ms.ToArray();
}
}
// Decrypt
string str2;
using (var am = new AesManaged())
using (var ms = new MemoryStream(encrypted))
{
am.Key = key;
var iv = new byte[am.BlockSize / 8];
ms.Read(iv, 0, iv.Length);
am.IV = iv;
using (var decryptor = am.CreateDecryptor())
using (var decStream = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
using (var ms2 = new MemoryStream())
{
decStream.CopyTo(ms2);
str2 = Encoding.UTF8.GetString(ms2.GetBuffer(), 0, (int)ms2.Length);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,一般来说,IV 重用会导致加密方面的弱点。例如参见维基:
对于 CBC 和 CFB,重用 IV 会泄露有关第一个明文块以及两个消息共享的任何公共前缀的一些信息。对于 OFB 和 CTR 来说,重复使用 IV 会完全破坏安全性。[6]
| 归档时间: |
|
| 查看次数: |
834 次 |
| 最近记录: |