当使用 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\0\0”
我在加密和解密阶段都尝试了各种填充选项,并且可以看到这样做有效果,但并不能解决问题。如果不设置填充,0 字节首先会被加密,它应该是 16 字节。我还尝试了调用flush和flushfinalblock的不同方法。我将密钥/iv 存储在纯文本文件中(我知道这可能不是安全的最佳实践,我现在的目标只是了解有关此主题的更多信息)。
请帮我找出我在这里做错了什么。