使用C#和SymmetricAlgorithm进行真正简单的加密

我正在寻找一种非常简单的crypt / decrypt方法。 我将始终使用相同的静态密钥。 我知道这种方法的风险。 目前我正在使用以下代码,但在加密和删除相同的字符串后,它不会生成相同的结果(字符串中间有一些垃圾)。

public static string Crypt(this string text) { string result = null; if (!String.IsNullOrEmpty(text)) { byte[] plaintextBytes = Encoding.Unicode.GetBytes(text); SymmetricAlgorithm symmetricAlgorithm = DES.Create(); symmetricAlgorithm.Key = new byte[8] {1, 2, 3, 4, 5, 6, 7, 8}; using (MemoryStream memoryStream = new MemoryStream()) { using (CryptoStream cryptoStream = new CryptoStream(memoryStream, symmetricAlgorithm.CreateEncryptor(), CryptoStreamMode.Write)) { cryptoStream.Write(plaintextBytes, 0, plaintextBytes.Length); } result = Encoding.Unicode.GetString(memoryStream.ToArray()); } } return result; } public static string Decrypt(this string text) { string result = null; if (!String.IsNullOrEmpty(text)) { byte[] encryptedBytes = Encoding.Unicode.GetBytes(text); SymmetricAlgorithm symmetricAlgorithm = DES.Create(); symmetricAlgorithm.Key = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; using (MemoryStream memoryStream = new MemoryStream(encryptedBytes)) { using (CryptoStream cryptoStream = new CryptoStream(memoryStream, symmetricAlgorithm.CreateDecryptor(), CryptoStreamMode.Read)) { byte[] decryptedBytes = new byte[encryptedBytes.Length]; cryptoStream.Read(decryptedBytes, 0, decryptedBytes.Length); result = Encoding.Unicode.GetString(decryptedBytes); } } } return result; } 

我可以改变任何需要的东西,没有限制(但是我只想要有一个方法来加密,另一个解密而不需要在它们之间共享变量)。

谢谢。

如果您不想自己处理密钥,请让操作系统为您执行此操作。 例如,使用Windows数据保护 (DPAPI)。

您可以使用以下内容编写自己的,基于stringSystem.Security.Cryptography.ProtectedData.ProtectUnprotect方法的版本:

 public static string Crypt (this string text) { return Convert.ToBase64String ( ProtectedData.Protect ( Encoding.Unicode.GetBytes (text) ) ); } public static string Derypt (this string text) { return Encoding.Unicode.GetString ( ProtectedData.Unprotect ( Convert.FromBase64String (text) ) ); } 

这样的事怎么样?

 using System; using System.Security.Cryptography; using System.Text; public static class StringUtil { private static byte[] key = new byte[8] {1, 2, 3, 4, 5, 6, 7, 8}; private static byte[] iv = new byte[8] {1, 2, 3, 4, 5, 6, 7, 8}; public static string Crypt(this string text) { SymmetricAlgorithm algorithm = DES.Create(); ICryptoTransform transform = algorithm.CreateEncryptor(key, iv); byte[] inputbuffer = Encoding.Unicode.GetBytes(text); byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length); return Convert.ToBase64String(outputBuffer); } public static string Decrypt(this string text) { SymmetricAlgorithm algorithm = DES.Create(); ICryptoTransform transform = algorithm.CreateDecryptor(key, iv); byte[] inputbuffer = Convert.FromBase64String(text); byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length); return Encoding.Unicode.GetString(outputBuffer); } } 

unit testing

 [Test] public void Test() { string expected = "this is my test string"; string a = expected.Crypt(); Debug.WriteLine(a); string actual = a.Decrypt(); Assert.AreEqual(expected, actual); } 

编辑:

澄清:我知道这不是好习惯。

“我知道这种方法的风险。”

我假设OP也知道并且在考虑在生产环境中使用这样的东西之前会进行相关的代码更改。

这个问题强调简单性而不是良好实践。

您需要将密码模式设置为CipherMode.ECB或使用IV。

 SymmetricAlgorithm symmetricAlgorithm = DES.Create(); symmetricAlgorithm.Key = new byte[8] { 1, 2, 3, 4, 5, 6, 7, 8 }; symmetricAlgorithm.Mode = CipherMode.ECB; ... 

另一点是不使用Unicode编码。 请改用Base64。 Unicode可能会“破坏”非UTF-16的字节。