C#,目前最好的字符串加密和解密的算法是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#,目前最好的字符串加密和解密的算法是啥?相关的知识,希望对你有一定的参考价值。
无所谓什么最好不好,都有一定的局限,你可以加上一些自己的处理,就会比较好了,呵呵,附上我自己用的加密解密方法:/// <summary>
/// 使用DES加密指定字符串
/// </summary>
/// <param name="encryptStr">待加密的字符串</param>
/// <param name="key">密钥(最大长度8)</param>
/// <param name="IV">初始化向量(最大长度8)</param>
/// <returns>加密后的字符串</returns>
public static string DESEncrypt(string encryptStr,string key,string IV)
//将key和IV处理成8个字符
key += "12345678";
IV += "12345678";
key = key.Substring(0,8);
IV = IV.Substring(0,8);
SymmetricAlgorithm sa;
ICryptoTransform ict;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
sa = new DESCryptoServiceProvider();
sa.Key = Encoding.UTF8.GetBytes(key);
sa.IV = Encoding.UTF8.GetBytes(IV);
ict = sa.CreateEncryptor();
byt = Encoding.UTF8.GetBytes(encryptStr);
ms = new MemoryStream();
cs = new CryptoStream(ms, ict, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
//加上一些干扰字符
string retVal = Convert.ToBase64String(ms.ToArray());
System.Random ra = new Random();
for (int i=0;i<8;i++)
int radNum = ra.Next(36);
char radChr = Convert.ToChar(radNum + 65);//生成一个随机字符
retVal = retVal.Substring(0,2*i+1) + radChr.ToString() + retVal.Substring(2*i+1);
return retVal;
/// <summary>
/// 使用DES解密指定字符串
/// </summary>
/// <param name="encryptedValue">待解密的字符串</param>
/// <param name="key">密钥(最大长度8)</param>
/// <param name="IV">初始化向量(最大长度8)</param>
/// <returns>解密后的字符串</returns>
public static string DESDecrypt(string encryptedValue,string key,string IV)
//去掉干扰字符
string tmp = encryptedValue;
if (tmp.Length < 16)
return "";
for (int i=0;i<8;i++)
tmp = tmp.Substring(0,i+1) + tmp.Substring(i+2);
encryptedValue = tmp;
//将key和IV处理成8个字符
key += "12345678";
IV += "12345678";
key = key.Substring(0,8);
IV = IV.Substring(0,8);
SymmetricAlgorithm sa;
ICryptoTransform ict;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
try
sa = new DESCryptoServiceProvider();
sa.Key = Encoding.UTF8.GetBytes(key);
sa.IV = Encoding.UTF8.GetBytes(IV);
ict = sa.CreateDecryptor();
byt = Convert.FromBase64String(encryptedValue);
ms = new MemoryStream();
cs = new CryptoStream(ms, ict, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Encoding.UTF8.GetString(ms.ToArray());
catch (System.Exception)
return "";
参考技术A //加密字符串函数
static public string Encryption(string str,Random R)
/* 加密算法 最长可加密255个字符 */
string md1, md2, pwd = "";
string[] str_t = new string[255];
int l1, l2;
for (int i = 0; i < str.Length; i++)
l1 = R.Next(0, 256);
md1 = l1.ToString("X");
if (md1.Length == 1) md1 = "0" + md1;
str_t[i] = str.Substring(i, 1);
System.Text.ASCIIEncoding AsciiEncoding = new System.Text.ASCIIEncoding();
l2 = (int)AsciiEncoding.GetBytes(str_t[i])[0];
md2 = (l1 ^ l2).ToString("X");
if (md2.Length == 1) md2 = "0" + md2;
pwd = pwd + md1 + md2;
return pwd;
//解密字符串函数
static public string Decrypt(string str)
/* 解密算法 */
string pwd = "";
int xl;
if (str.Length % 4 == 0)
xl = str.Length / 4;
string md1, md2;
int l1, l2;
for (int i = 0; i < xl; i++)
md1 = str.Substring(i * 4, 2);
md2 = str.Substring(i * 4 + 2, 2);
l1 = int.Parse(md1, System.Globalization.NumberStyles.AllowHexSpecifier);
l2 = int.Parse(md2, System.Globalization.NumberStyles.AllowHexSpecifier);
System.Text.ASCIIEncoding AsciiEncoding = new System.Text.ASCIIEncoding();
byte[] byteArray = new byte[] (byte)(l1 ^ l2) ;
md1 = AsciiEncoding.GetString(byteArray);
pwd = pwd + md1;
return pwd;
参考技术B //加密
String str = "this is a test.";
byte[] bytes = Encoding.ASCII.GetBytes(str);
DSACryptoServiceProvider dsac = new DSACryptoServiceProvider();
byte[] sign = dsac.SignData(bytes);
Response.Write(Convert.ToBase64String(sign));
//验证
DSACryptoServiceProvider dsac2 = new DSACryptoServiceProvider();
dsac2.FromXmlString(dsac.ToXmlString(false));
bool ver = dsac2.VerifyData(bytes, sign);
if (ver)
Console.WriteLine("通过"+Convert.ToBase64String(sign));
else
Console.WriteLine("不能通过");
加密后的字符串最后有两个“==”是啥加密算法?
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
1,Base64 使用US-ASCII子集的64个字符,即大小写的26个英文字母,0-9,+,/。
2,编码总是基于3个字符,每个字符用8位二进制表示,因此一共24位,再分为4四组,每组6位,表示一个Base64的值。
3,Base64值为0就是A,为27的就是b。这样,每3个字符产生4位的Base64字符。如果被加密的字符串每3个一组,还剩1或2个字符,使用特殊字符"="补齐Base64的4字。
扩展资料:
应用
Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的一个标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。
在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换。
因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾去掉填充的'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”。
这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“/”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。
此外还有一些变种,它们将“+/”改为“_-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。
参考资料来源:百度百科-base64
参考技术ABase64 使用US-ASCII子集的64个字符,即大小写的26个英文字母,0-9,+,/。
编码总是基于3个字符,每个字符用8位二进制表示,因此一共24位,再分为4四组,每组6位,表示一个Base64的值。如下:
"A", "B", "C", "D", "E", "F", "G", "H", "I","J", "K", "L", "M", "N", "O", "P",
"Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f",
"g", "h", "i","j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
"w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/"
Base64值为0就是A,为27的就是b。这样,每3个字符产生4位的Base64字符。如果被加密的字符串每3个一组,还剩1或2个字符,使用特殊字符"="补齐Base64的4字。
http://www.iteye.com/problems/9270
以上是关于C#,目前最好的字符串加密和解密的算法是啥?的主要内容,如果未能解决你的问题,请参考以下文章