1

我正在使用 .net System.Security 中的 Rijndael 类来加密我的 RSA 密钥

这就是我的设置方式:

static Rijndael CreateRijndael (byte[] userID, string password, string pepper)
{
    if (userID == null)
        throw new ArgumentNullException ("userID");
    if (password == null)
        throw new ArgumentNullException ("password");
    if (pepper == null)
        throw new ArgumentNullException ("pepper");
    string passpepper = password + pepper;
    Rijndael Rij = Rijndael.Create ();
    Rij.KeySize = 256;
    Rij.Padding = PaddingMode.ISO10126;
    Rij.Mode = CipherMode.CBC;
    Rfc2898DeriveBytes aesKey = new Rfc2898DeriveBytes (passpepper, userID, 65536);
    Rij.Key = aesKey.GetBytes (Rij.KeySize / 8);
    Rij.GenerateIV ();
    return Rij;
}

这就是我得到的:

逫⇾귏䜪춈票칔alue><Modulus>kgOu5EG6vbabnvq6xB+cRmxDL....

代替

<RSAKeyValue><Modulus>kgOu5EG6vbabnvq6xB+cRmxDL...

是IV吗?
如果是 IV,考虑到我已将模式设置为 CBC,它不应该混淆整个文本吗?

4

1 回答 1

5

如您所料,这是一个初始化向量问题。

在加密时,您应该使用随机初始化向量,并将其与密文一起发送(或在您的情况下存储)。在解密时,您应该使用与加密相同的初始化向量,而不是随机向量。

使用 CBC 模式,正如您在此处使用的那样,错误的初始化向量仅导致第一个块(即 AES 的 16 个字节)成为垃圾,其余内容保持正常。原因是,第一个块之后的每个块在解密之后(和加密之前)都与前一个块的密文进行异或运算,这不依赖于 IV。

使用其他操作模式,您可能会得到完全乱码的明文。

于 2014-12-27T17:31:48.623 回答