假设使用 256 key /IV 通过 AES 加密少量数据。加密后的数据是可以知道的。例如:
abcdefghijklmno|axXXyyYY343433553353afsafaadfafdfsafsf|2013-01-01T00:00:00
前两部分(如果你破坏管道字符上的数据)很少改变。最后一部分,日期/时间确实会改变,但不会经常改变。我注意到,改变日期而不是消息的第一部分会导致密文的开头始终相同,大概是因为纯文本的开头是相同的。
这是否会让我面临针对加密算法的任何类型的攻击?通过在纯文本的开头添加盐值,我会得到什么好处吗?
我正在使用 AesManaged
类生成 IV/ key 并加密/解密纯文本(如果这有影响的话)。
最佳答案
为了解决这个问题,通常为每个密文随机生成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);
}
}
请注意,一般来说 IV 重用会导致加密方面的弱点。例如,参见 wiki :
For CBC and CFB, reusing an IV leaks some information about the first block of plaintext, and about any common prefix shared by the two messages. For OFB and CTR, reusing an IV completely destroys security.[6]
关于c# - 给要加密的数据加盐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18835169/