我想使用一种算法对 C# 中的字符串进行加密和解密,该算法可以得到相同的加密字符串。例如,如果我加密一个字符串122ujhdheiwe,结果是uoi8asdf8asdf,如果我再次加密相同的字符串122ujhdheiwe,它会引导我到uoi8asdf8asdf字符串。我可以使用哪些可能的加密算法以及如何使用?
我这里有一个简单的解决方案:
http://remy.supertext.ch/2011/01/simple-c-encryption-and-decryption/
基本上它的工作原理是这样的:
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] Key = { 12, 13, 14, 15, 16, 17, 18, 19 };
byte[] IV = { 12, 13, 14, 15, 16, 17, 18, 19 };
ICryptoTransform encryptor = des.CreateEncryptor(Key, IV);
byte[] IDToBytes = ASCIIEncoding.ASCII.GetBytes(source);
byte[] encryptedID = encryptor.TransformFinalBlock(IDToBytes, 0, IDToBytes.Length);
return Convert.ToBase64String(encryptedID);
然后反过来。
rot13(凯撒)也许?它将所有字符移动偏移量 13。因此,应用它两次,您将再次获得纯文本。
如果您想要一个简单的解决方案,可以使用
ProtectedData
类:
using System;
using System.Security.Cryptography;
using System.Text;
private void example()
{
string data = "122ujhdheiwe";
// Encrypt
UnicodeEncoding unicodeEncoding = new UnicodeEncoding();
byte[] secret = ProtectedData.Protect(unicodeEncoding.GetBytes(data), null, DataProtectionScope.CurrentUser);
Console.WriteLine(BitConverter.ToString(secret));
// If you need it as a printable string, you can convert the binary to Base64
string base64 = Convert.ToBase64String(secret);
Console.WriteLine(base64);
// Back to binary...
byte[] backagain = Convert.FromBase64String(base64);
// Decrypt
byte[] clearbytes = ProtectedData.Unprotect(backagain, null, DataProtectionScope.CurrentUser);
string roundtripped = unicodeEncoding.GetString(clearbytes);
Console.WriteLine(roundtripped);
}
参见。 受保护的数据类
如果您希望加密数据看起来非常像原始数据,如问题中的示例(122ujhdheiwe ==> uoi8asdf8asdf),那么您正在寻找的是格式保留加密 - cf。这里,我没有例子。
编辑:我刚刚注意到,在您的问题中,您写道您希望能够再次加密相同的字符串并获得相同的加密结果,在这种情况下,ProtectedData 将不起作用,因为加密中使用的密钥会随着时间的推移而改变.
我编写了一个演示程序,需要源代码吗? 我正在使用这个命名空间
using System.Security.Cryptography;
还有两个这个
public string encryptus(string x, string encrypt)//function
{
try
{
string y = x;
byte[] etext = UTF8Encoding.UTF8.GetBytes(y);
string Code = encrypt;
MD5CryptoServiceProvider mdhash = new MD5CryptoServiceProvider();
byte[] keyarray = mdhash.ComputeHash(UTF8Encoding.UTF8.GetBytes(Code));
TripleDESCryptoServiceProvider tds = new TripleDESCryptoServiceProvider();
tds.Key = keyarray;
tds.Mode = CipherMode.ECB;
tds.Padding = PaddingMode.PKCS7;
ICryptoTransform itransform = tds.CreateEncryptor();
byte[] result = itransform.TransformFinalBlock(etext, 0, etext.Length);
string encryptresult = Convert.ToBase64String(result);
return encryptresult.ToString();
}
catch (Exception ex)
{
return ex.Message;
}
}
public string dencryptus(string x, string keyai)
{
try
{
string y = x.Replace("\0", null);
byte[] etext = Convert.FromBase64String(y);
string key = keyai;
MD5CryptoServiceProvider mdhash = new MD5CryptoServiceProvider();
byte[] keyarray = mdhash.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
TripleDESCryptoServiceProvider tds = new TripleDESCryptoServiceProvider();
tds.Key = keyarray;
tds.Mode = CipherMode.ECB;
tds.Padding = PaddingMode.PKCS7;
ICryptoTransform itransform = tds.CreateDecryptor();
byte[] result = itransform.TransformFinalBlock(etext, 0, etext.Length);
string dencryptresult = UTF8Encoding.UTF8.GetString(result);
return dencryptresult.ToString();
}
catch (Exception ex)
{
return ex.Message;
}
}
并像这样使用它们:
Encrypted.Text = encryptus(Message.Text, EncryptCode.Text.ToString());
Decrypted.Text = dencryptus(Message.Text, EncryptCode.Text.ToString());
.NET 7 更新
死灵魔法...
我只是想为任何正在寻找简单加密的人提供一个简单的复制粘贴:
public static class AesConverter
{
public static string Encrypt(string clearText)
{
var inputBytes = Encoding.Unicode.GetBytes(clearText);
var outputBytes = AesConvert(inputBytes, aes => aes.CreateEncryptor());
return Convert.ToBase64String(outputBytes);
}
public static string Decrypt(string cipherText)
{
var inputBytes = Convert.FromBase64String(cipherText.Replace(" ", "+"));
var outputBytes = AesConvert(inputBytes, aes => aes.CreateDecryptor());
return Encoding.Unicode.GetString(outputBytes);
}
private static byte[] AesConvert(byte[] inputBytes, Func<Aes, ICryptoTransform> convert)
{
using var aes = Aes.Create();
var key = "populateThisFromAppSettings";
var salt = new byte[] { 0x52, 0x79, 0x61, 0x6e, 0x20, 0x4e, 0x61, 0x63, 0x61, 0x72, 0x61, 0x74, 0x6f };
var derivedBytes = new Rfc2898DeriveBytes(key, salt, 1000, HashAlgorithmName.SHA1);
aes.Key = derivedBytes.GetBytes(32);
aes.IV = derivedBytes.GetBytes(16);
using var ms = new MemoryStream();
using var cs = new CryptoStream(ms, convert(aes), CryptoStreamMode.Write);
cs.Write(inputBytes, 0, inputBytes.Length);
cs.Close();
return ms.ToArray();
}
}