C#几种常用的加密方式

  • 格式:pdf
  • 大小:113.72 KB
  • 文档页数:5

C#⼏种常⽤的加密⽅式

⼀、AES加密算法

AES算法基于排列和置换运算。排列是对数据重新进⾏安排,置换是将⼀个数据单元替换为另⼀个。AES 使⽤⼏种不同的⽅法来执⾏排列

和置换运算。

AES是⼀个迭代的、对称密钥分组的密码,它可以使⽤128、192 和 256 位密钥,并且⽤ 128 位(16字节)分组加密和解密数据。与公共

密钥密码使⽤密钥对不同,对称密钥密码使⽤相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输⼊数据相同。迭代加密

使⽤⼀个循环结构,在该循环中重复置换和替换输⼊数据。 摘⾃:互动百科

⼏种模式的优缺点对⽐:

C#代码:

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Security.Cryptography;

using System.Text;

namespace PwdDemo

{

public class AESHelper

{

///

/// AES 加密

///

/// 明⽂(待加密)

/// 密⽂

///

public string AesEncrypt(string str, string key)

{

if (string.IsNullOrEmpty(str)) return null;

Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);

RijndaelManaged rm = new RijndaelManaged

{

Key = Encoding.UTF8.GetBytes(key),

Mode = CipherMode.ECB,

Padding = PaddingMode.PKCS7

};

ICryptoTransform cTransform = rm.CreateEncryptor();

Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

return Convert.ToBase64String(resultArray);

}

///

/// AES 解密

///

/// 明⽂(待解密)

/// 密⽂

///

public string AesDecrypt(string str, string key)

{

if (string.IsNullOrEmpty(str)) return null;

Byte[] toEncryptArray = Convert.FromBase64String(str);

RijndaelManaged rm = new RijndaelManaged

{

Key = Encoding.UTF8.GetBytes(key),

Mode = CipherMode.ECB,

Padding = PaddingMode.PKCS7

};

ICryptoTransform cTransform = rm.CreateDecryptor();

Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

return Encoding.UTF8.GetString(resultArray);

}

}

}

⼆、DES加密算法

DES设计中使⽤了分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其⽬的是抗击敌⼿对密码系统的统计分析。混淆是使密⽂的统计特性与密钥的取值之间的关系尽可能复杂化,以使密钥和明⽂以及密⽂之间的依赖性对密码分析者来说是⽆法利⽤的。扩散的

作⽤就是将每⼀位明⽂的影响尽可能迅速地作⽤到较多的输出密⽂位中,以便在⼤量的密⽂中消除明⽂的统计结构,并且使每⼀位密钥的影

响尽可能迅速地扩展到较多的密⽂位中,以防对密钥进⾏逐段破译。

C#代码:

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Security.Cryptography;

using System.Text;

namespace PwdDemo

{

public class DESHelper

{

//密钥

public static byte[] _KEY = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };

//向量

public static byte[] _IV = new byte[] { 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 };

///

/// DES加密操作

///

///

///

public string DesEncrypt(string normalTxt)

{

//byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(_KEY);

//byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(_IV);

DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();

int i = cryptoProvider.KeySize;

MemoryStream ms = new MemoryStream();

CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(_KEY, _IV), CryptoStreamMode.Write);

StreamWriter sw = new StreamWriter(cst);

sw.Write(normalTxt);

sw.Flush();

cst.FlushFinalBlock();

sw.Flush();

string strRet = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);

return strRet;

}

///

/// DES解密操作

///

/// 加密字符串

///

public string DesDecrypt(string securityTxt)//解密

{

//byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(_KEY);

//byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(_IV);

byte[] byEnc;

try

{

securityTxt.Replace("_%_", "/");

securityTxt.Replace("-%-", "#");

byEnc = Convert.FromBase64String(securityTxt);

}

catch

{

return null;

}

DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();

MemoryStream ms = new MemoryStream(byEnc);

CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(_KEY, _IV), CryptoStreamMode.Read);

StreamReader sr = new StreamReader(cst);

return sr.ReadToEnd();

}

}

}

三、RSA加密算法

RSA是第⼀个能同时⽤于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最⼴泛的公钥算法,从提出到现在已近⼆⼗年,