使用C#和SymmetricAlgorithm进行非常简单的加密
本文关键字:非常 简单 加密 SymmetricAlgorithm 使用 | 更新日期: 2023-09-27 18:21:39
我正在寻找一个非常简单的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)。
您可以使用以下方法编写自己的基于string
的System.Security.Cryptography.ProtectedData.Protect
和Unprotect
方法版本:
public static string Crypt (this string text)
{
return Convert.ToBase64String (
ProtectedData.Protect (
Encoding.Unicode.GetBytes (text) ) );
}
public static string Decrypt (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);
}
}
单元测试
[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);
}
编辑:
澄清一下:我知道这不是一个好的做法。
"我意识到这种方法的风险。"
Iv'e假设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的字节。