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

参考技术A

    Base64 使用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

参考技术B 如果是以“==”结尾的,除了BASE64算法,也有可能是可逆算法RC4。 参考技术C BASE64本回答被提问者采纳

以上是关于C#,目前最好的字符串加密和解密的算法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

用c#做aes加密 为啥在线解密解不了

如何使用Base64进行加密和解密

java的 DES 加密解密方法 求对应C#的加密解密方法,急切

(转)C#实现RSA非对称加密解密

加密后的字符串最后有两个“==”是啥加密算法?

使用C# DES解密java DES加密的字符串