我的Rijndael有什么问题给了我这个?

时间:2014-12-27 16:09:44

标签: initialization-vector rijndael

我使用.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,它不应该混淆整个文本吗?

1 个答案:

答案 0 :(得分:5)

正如您所猜测的,这是一个初始化向量问题。

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

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

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