c# - 给要加密的数据加盐?

标签 c# encryption aes

假设使用 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/

相关文章:

c - 在 C 程序中,我尝试使用 ECB 模式加密 AES 128

使用 aes-256-cbc 的 openssl hmac

c# - 将 Mallet 作为二元分类器应用于文档分类

java - PBEWITHHMACSHA512ANDAES_128 和初始化 vector

java - Adler32 快速重复

python - 检查符号和大写/小写以使用凯撒密码进行加密?

java - 使用 Rijndael 在 .Net 中加密的 java 中解密文件时出错

c# - 为什么 linq to object 手动实现迭代器?

c# - SortedList 中值的总和和键的条件

c# - 使用 C# DateTime 将 SQL 日期时间设置为最小值