C# 如何在C语言中加密和解密字符串#
我想用一种算法对C#中的一个字符串进行加密和解密,该算法可以使我得到相同的加密字符串。例如,如果我加密一个字符串122ujhdheiwe,结果是uoi8asdf8asdf,如果我再次加密同一个字符串122ujhdheiwe,它将导致我进入uoi8asdf8asdf字符串。我可以使用哪些可能的加密算法以及如何使用?rot13(凯撒)可能?它按偏移量13移动所有字符。因此,应用两次,您将再次获得纯文本。我这里有一个简单的解决方案: 基本上它是这样工作的:C# 如何在C语言中加密和解密字符串#,c#,encryption,C#,Encryption,我想用一种算法对C#中的一个字符串进行加密和解密,该算法可以使我得到相同的加密字符串。例如,如果我加密一个字符串122ujhdheiwe,结果是uoi8asdf8asdf,如果我再次加密同一个字符串122ujhdheiwe,它将导致我进入uoi8asdf8asdf字符串。我可以使用哪些可能的加密算法以及如何使用?rot13(凯撒)可能?它按偏移量13移动所有字符。因此,应用两次,您将再次获得纯文本。我这里有一个简单的解决方案: 基本上它是这样工作的: DESCryptoServiceProvi
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);
然后反过来。这个答案包含我的即用加密类Triple-Des
只需创建新类库,复制/粘贴此代码,然后使用它:)如果需要简单的解决方案,可以使用
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),那么您需要的是保留格式的加密--,我没有示例
编辑:我刚刚注意到,在您的问题中,您写道您希望能够再次加密相同的字符串并获得相同的加密结果,在这种情况下,ProtectedData将不起作用,因为加密中使用的密钥将随时间而改变。
我编写了一个演示程序,需要源代码吗?
我正在使用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());
以及(如何)解密,密钥(和盐)要使用什么,安全性应该有多高?在我的场景中,安全性不是问题,我只是不希望用户查看我在HiddenField中保存的内容,我使用的解决方案如下: