我使用.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,它不应该混淆整个文本吗?
答案 0 :(得分:5)
正如您所猜测的,这是一个初始化向量问题。
在加密时,您应该使用随机初始化向量,并使用密文发送(或在您的情况下存储它)。在解密时,您应该使用与加密相同的初始化向量,不是随机的。
使用CBC模式时,正如您在此处使用的那样,错误的初始化向量仅导致第一个块(即AES的16个字节)变为垃圾,其余内容保持正常。原因是,第一个之后的每个块都与前一个块进行了异或。解密后(加密前)阻塞密文,并且不依赖于IV。
使用其他操作模式,您可能会得到一个完全乱码的明文。