rijndael加密 – 只解密部分字符串

只有部分字符串被解密,我认为它与我的编码有关。

这是发生的事情:

string s = "The brown fox jumped over the green frog"; string k = "urieurut"; string enc = EncryptString(s, k); string dec = DecryptString(enc, k); 

结果是这样的:棕色的狐狸ϼ裴裴ㆉ≸frog frog frog frog frog frog frog frog frog

 public static string EncryptString(string stringToEncrypt, string encryptionKey) { string encrypted = String.Empty; UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(encryptionKey); RijndaelManaged RMCrypto = new RijndaelManaged(); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write); byte[] encryptedString = UE.GetBytes(stringToEncrypt); cs.Write(encryptedString, 0, encryptedString.Length); cs.FlushFinalBlock(); cs.Close(); encrypted = UE.GetString(ms.ToArray()); return encrypted; } public static string DecryptString(string stringToDecrypt, string encryptionKey) { string decrypted = String.Empty; UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(encryptionKey); byte[] data = UE.GetBytes(stringToDecrypt); RijndaelManaged RMCrypto = new RijndaelManaged(); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Write); cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); cs.Close(); decrypted = UE.GetString(ms.ToArray()); return decrypted; } 

干得好:

  string s = "The brown fox jumped over the green frog"; string k = "urieurut"; byte[] enc = EncryptString(s, k); string dec = DecryptString(enc, k); 

您不能尝试将加密的字节串解释为Unicode字符串。 将它们保留为字节。 解密后的版本可以转换回字符串。

另请注意下面处理一次性物品。 如果你没有using()Dispose()正确释放它们,你可能会因某些资源被搁置太长或泄漏而结束。

 public static byte[] EncryptString(string stringToEncrypt, string encryptionKey) { UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(encryptionKey); using (RijndaelManaged RMCrypto = new RijndaelManaged()) using (MemoryStream ms = new MemoryStream()) using (ICryptoTransform encryptor = RMCrypto.CreateEncryptor(key, key)) using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { byte[] encryptedString = UE.GetBytes(stringToEncrypt); cs.Write(encryptedString, 0, encryptedString.Length); cs.FlushFinalBlock(); return ms.ToArray(); } } public static string DecryptString(byte[] stringToDecrypt, string encryptionKey) { UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(encryptionKey); using (RijndaelManaged RMCrypto = new RijndaelManaged()) using (MemoryStream ms = new MemoryStream()) using (ICryptoTransform decryptor = RMCrypto.CreateDecryptor(key, key)) using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) { cs.Write(stringToDecrypt, 0, stringToDecrypt.Length); cs.FlushFinalBlock(); return UE.GetString(ms.ToArray()); } } 

我通过使用base64字符串进行加密解决了我的问题 – 我可能会看其他选项,但我只需要这些方法来处理少量数据,这里是最终代码:

 public static string EncryptString(string stringToEncrypt, string encryptionKey) { string encrypted = String.Empty; byte[] key = Encoding.Unicode.GetBytes(encryptionKey); RijndaelManaged RMCrypto = new RijndaelManaged(); RMCrypto.Padding = PaddingMode.PKCS7; MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write); byte[] encryptedString = Encoding.ASCII.GetBytes(stringToEncrypt); cs.Write(encryptedString, 0, encryptedString.Length); cs.FlushFinalBlock(); cs.Close(); //encrypted = Encoding.ASCII.GetString(ms.ToArray()); return Convert.ToBase64String(ms.ToArray()); } public static string DecryptString(string stringToDecrypt, string encryptionKey) { string decrypted = String.Empty; byte[] key = Encoding.Unicode.GetBytes(encryptionKey); byte[] data = Convert.FromBase64String(stringToDecrypt); RijndaelManaged RMCrypto = new RijndaelManaged(); RMCrypto.Padding = PaddingMode.PKCS7; MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Write); cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); cs.Close(); decrypted = Encoding.ASCII.GetString(ms.ToArray()); return decrypted; } 

不确定你的具体代码块,但Jeff Atwood做了一个我以前用过的漂亮的小库:

http://www.codeproject.com/KB/security/SimpleEncryption.aspx

值得一看,因为它简化了加密事物的过程,我实际上不得不移植到C#,因为当我看到它时没有可用的端口。 但是现在有一个C#端口(在评论部分)。