当使用c#rijndael解密之前加密并保存在sql server ce中的字符串时,我从解密中一无所获。我可以从调试和检查数据库中看出,解密后的字符串似乎是按预期保存的,不同的输入字符串有不同的无意义集,所以我认为问题出在解密代码中。我还确认了cipherText输入参数在从数据库中检索并重新制作成字节数组后,得到了正确的字节数。我使用了位于的示例:http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael%28v=vs.110%29.aspx为了做到这一点,进行了一些修改。
static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
{
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");
// Declare the string used to hold
// the decrypted text.
string plainText = null;
// Create an Rijndael object
// with the specified key and IV.
using (Rijndael rijAlg = Rijndael.Create())
{
rijAlg.Key = Key;
rijAlg.IV = IV;
rijAlg.Padding = PaddingMode.PKCS7;
// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
var plainBytes = new byte[cipherText.Length];
int plainByteCount;
// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
plainByteCount = csDecrypt.Read(plainBytes, 0, plainBytes.Length);
using (StreamReader srDecrypt = new StreamReader(csDecrypt, System.Text.Encoding.Unicode))
{
// Read the decrypted bytes from the decrypting stream
// and place them in a string.
plainText = srDecrypt.ReadToEnd();
}
}
}
plainText = Encoding.Unicode.GetString(plainBytes, 0, plainBytes.Length);
}
return plainText;
}
在
plainText = srDecrypt.ReadToEnd();
plainText得到"的值,我希望它是解密的单词。
最后,在
plainText = Encoding.Unicode.GetString(plainBytes, 0, plainBytes.Length);
明文变为:"\0\0\0\0\0"
我在加密和解密阶段尝试了各种填充选项,可以看出这样做有效果,但并不能解决问题。在不设置填充的情况下,0字节首先被加密,应该是16字节。我还尝试了调用flush和flushfinalblock的不同方法。我将密钥/iv存储在纯文本文件中(我知道这可能不是安全性的最佳实践,我现在的目标只是了解更多关于此主题的信息)。
请帮我找出我在这里做错了什么。
我在VB.NET中遇到过类似的问题,发现加密和解密过程中使用的变量应该相同。给加密和解密函数它们自己的局部变量肯定会导致解密函数返回错误的值。尝试将key和iv设置为全局变量,而不是局部变量。