詳解ASP.NET中加密和解密的方法
散列運算
mscorlib.dll下的System.Security.Cryptography下:
- 抽象類HashAlgorithm
- 抽象類MD5
- MD5CryptoServiceProvider
- SHA1
- SHA1CryptoServiceProvider密封類:調(diào)用Windows Crypto API
- SHA1Managed普通類:用托管代碼寫的
- SHA256
- SHA256CryptoServiceProvider
- SHA256Managed
- SHA384
- SHA512
- 抽象類MD5
對字節(jié)數(shù)組或流散列運算
class Program
{
static void Main(string[] args)
{
string str = "Hello World";
HashAlgorithm hashAlgorithm = HashAlgorithm.Create(HashAlgorithmType.SHA1);
byte[] data = Encoding.Default.GetBytes(str);
byte[] digest = hashAlgorithm.ComputeHash(data);
foreach (byte b in digest)
{
Console.Write("{0:X}",b);
}
Console.ReadKey();
}
}
public class HashAlgorithmType
{
public const string SHA1 = "SHA1";
public const string SHA256 = "SHA256";
public const string SHA384 = "SHA384";
public const string SHA512 = "SHA512";
public const string MD5 = "MD5";
}密匙散列運算
string key = "secret key";
byte[] data = Encoding.Default.GetBytes(key);
KeyedHashAlgorithm kha = new HMACSHA1();
byte[] digest = kha.ComputeHash(data);
foreach (byte b in digest)
{
Console.Write("{0:x}",b);
}對稱加密和解密
- SymmetricAlgorithm
- DES
- DESCryptoServiceProvider
- TripleDES
- TripleDESCryptoServiceProvider
- Rijndael
- RijindaelManaged
- RC2
- RC2CryptoServiceProvider
- DES
IV:Initialization vector初始化向量:
- 為了解決加密字符串加密后仍然有重復部分,引入IV,加密字符串即使有重復,也會被打亂。
- IV值可以隨意指定,但長度固定,通常為64位byte類型
- 密匙長度也是固定的,通常為128位或196位byte類型
使用Encoding類將字符串轉(zhuǎn)換為byte[]:
- 如果使用UTF8,會變長編碼
加密解密方法:
- 加密方法:CreateEncryptor(),返回ICryptoTransform接口類型
- 解密方法:CreateDecryptor(),返回ICrtyptoTransform接口類型
明文流和加密流的轉(zhuǎn)換:
public CryptoStream(Stream stream, ICryptoTransform transform, CryptoStreamMode mode)
class Program
{
static void Main(string[] args)
{
#region 對稱加密和解密
string key = "secret key";
string str = "Hello World";
//加密
string encryptedText = SymmetricCryptoHelper.Encrypt(str, key);
Console.WriteLine(encryptedText);
//解密
string clearText = SymmetricCryptoHelper.Decrypt(encryptedText, key);
Console.WriteLine(clearText);
Console.ReadKey();
#endregion
}
}
//對稱加密幫助類
public class SymmetricCryptoHelper
{
private ICryptoTransform encryptor; //加密器對象
private ICryptoTransform decryptor; //解密器對象
private const int BufferSize = 1024;
public SymmetricCryptoHelper(string algorithmName, byte[] key)
{
SymmetricAlgorithm provider = SymmetricAlgorithm.Create(algorithmName);
provider.Key = key;
provider.IV = new byte[] { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
encryptor = provider.CreateEncryptor();
decryptor = provider.CreateDecryptor();
}
public SymmetricCryptoHelper(byte[] key) : this("TripleDES", key){}
//加密算法
public string Encrypt(string clearText)
{
//創(chuàng)建明文流
byte[] clearBuffer = Encoding.UTF8.GetBytes(clearText);
//byte[] clearBuffer = Encoding.Default.GetBytes(clearText);
MemoryStream clearStream = new MemoryStream(clearBuffer);
//創(chuàng)建空的密文流
MemoryStream encryptedStream = new MemoryStream();
//明文流和密文流轉(zhuǎn)換流,準備寫到密文流中
CryptoStream cryptoStream = new CryptoStream(encryptedStream, encryptor, CryptoStreamMode.Write);
int bytesRead = 0;
byte[] buffer = new byte[BufferSize];
do
{
//讀取明文流到buffer中
bytesRead = clearStream.Read(buffer, 0, BufferSize);
//通過CryptoStream將buffer中的明文流字節(jié)數(shù)組寫到明文流中
cryptoStream.Write(buffer, 0, bytesRead);
} while (bytesRead > 0);
cryptoStream.FlushFinalBlock();
//獲取加密后的字節(jié)數(shù)組
buffer = encryptedStream.ToArray();
//將加密后的字節(jié)數(shù)組轉(zhuǎn)換成字符串
string encryptedText = Convert.ToBase64String(buffer);
return encryptedText;
}
//解密算法
public string Decrypt(string encryptedText)
{
//把加密字符串轉(zhuǎn)換為加密字節(jié)數(shù)組
byte[] encryptedBuffer = Convert.FromBase64String(encryptedText);
//創(chuàng)建密文流
Stream encryptedStream = new MemoryStream(encryptedBuffer);
//創(chuàng)建空的明文流
MemoryStream clearStream = new MemoryStream();
//創(chuàng)建明文流和密文流的轉(zhuǎn)化流,讀取密文流
CryptoStream cryptoStream = new CryptoStream(encryptedStream, decryptor, CryptoStreamMode.Read);
int bytesRead = 0;
byte[] buffer = new byte[BufferSize];
do
{
//通過CryptoStream讀取密文流到Buffer
bytesRead = cryptoStream.Read(buffer, 0, BufferSize);
//把Buffer中的密文流寫到明文流中
clearStream.Write(buffer, 0, bytesRead);
} while (bytesRead > 0);
//將明文流轉(zhuǎn)換成字節(jié)數(shù)組
buffer = clearStream.GetBuffer();
string clearText = Encoding.UTF8.GetString(buffer, 0, (int)clearStream.Length);
//string clearText = Encoding.Default.GetString(buffer, 0, (int)clearStream.Length);
return clearText;
}
//密匙加密
public static string Encrypt(string clearText, string key)
{
byte[] keyData = new byte[16]; //TripleDES密匙固定長度為16個字節(jié)
//把密匙字符串轉(zhuǎn)換成字節(jié)數(shù)組
byte[] sourceData = Encoding.Default.GetBytes(key);
int copyBytes = 16;
if (sourceData.Length < 16)
{
copyBytes = sourceData.Length;
}
//把密匙數(shù)組復制到keyData字節(jié)數(shù)組中
Array.Copy(sourceData,keyData,copyBytes);
SymmetricCryptoHelper helper = new SymmetricCryptoHelper(keyData);
return helper.Encrypt(clearText);
}
//密匙解密
public static string Decrypt(string encryptedText, string key)
{
byte[] keyData = new byte[16];
byte[] sourceData = Encoding.Default.GetBytes(key);
int copyBytes = 16;
if (sourceData.Length < 16)
{
copyBytes = sourceData.Length;
}
Array.Copy(sourceData,keyData,copyBytes);
SymmetricCryptoHelper helper = new SymmetricCryptoHelper(keyData);
return helper.Decrypt(encryptedText);
}
}
非對稱加密
- AsymmetricAlgorithm
- RSA
- RSACryptoServiceProvider
- DSA
- DSACryptoServiceProvider:只能進行認證模式,即數(shù)字簽名
- RSA
對稱加密中的密匙:
密匙為由開發(fā)者設(shè)定的字符串
非對稱加密中的密匙:
- 通常是自動生成,不同的算法有不同的密匙格式
- 在創(chuàng)建RSACryptoServiceProvider實例時,會自動創(chuàng)建一個公/私密匙對。在實例上調(diào)用ToXmlString()方法獲得。
RSACryptoServiceProvider provider = new RSACryptoServiceProvider(); string publicPrivate = provider.ToXmlString(true);//獲得公/私匙對 //string publicOnly = provider.ToXmlString(false); //只獲得公匙 Console.Write(publicPrivate); Console.ReadKey();
非對稱加密幫助類
//非對稱加密幫助類
public class RSACryptoHelper
{
//加密
public static string Encrypt(string publicKeyXml, string plainText)
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(publicKeyXml); //使用公匙初始化對象
byte[] plainData = Encoding.Default.GetBytes(plainText);
byte[] encryptedData = provider.Encrypt(plainData, true);
return Convert.ToBase64String(encryptedData);
}
//解密
public static string Decrypt(string privateKeyXml, string encryptedText)
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(privateKeyXml);
byte[] encryptedData = Convert.FromBase64String(encryptedText);
byte[] plainData = provider.Decrypt(encryptedData, true);
string plainText = Encoding.Default.GetString(plainData);
return plainText;
}
}數(shù)字簽名
RSACryptoServiceProvider或DSACryptoServiceProvider
SignData()對摘要進行簽名,并返回簽名后的摘要。
VerifyData()得出本地摘要,并解密傳遞進來的原始摘要,對比返回bool類型結(jié)果。
數(shù)字簽名幫助類
public class RSACryptoHelper
{
public static string SignData(string plainText, string privateKeyXml)
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(privateKeyXml);
byte[] plainData = Encoding.Default.GetBytes(plainText);
//設(shè)置獲取摘要的算法
HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");
//獲取簽名過的摘要,是使用私匙加密過的摘要
byte[] signedDigest = provider.SignData(plainData, sha1);
return Convert.ToBase64String(signedDigest);
}
public static bool VerifyData(string plainText, string signature, string publicKeyXml)
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(publicKeyXml);
byte[] plainData = Encoding.Default.GetBytes(plainText);
byte[] signedDigest = Convert.FromBase64String(signature);
HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");
bool isDataIntact = provider.VerifyData(plainData, sha1, signedDigest);
return isDataIntact;
}
//使用SingnHash
public static string SignData2(string plainText, string privateKeyXml)
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(privateKeyXml);
byte[] plainData = Encoding.Default.GetBytes(plainText);
//設(shè)置獲取摘要的算法
HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");
//獲得原始摘要
byte[] digestData = sha1.ComputeHash(plainData);
//對元素摘要進行簽名
byte[] signedDigest = provider.SignHash(digestData, "SHA1");
return Convert.ToBase64String(signedDigest);
}
//使用VerifyHash
public static bool VerifyData2(string plainText, string signedDigest, string publicKeyXml)
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(publicKeyXml);
byte[] plainData = Encoding.Default.GetBytes("SHA1");
byte[] signedDigestData = Convert.FromBase64String(signedDigest);
//獲得本地摘要
HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");
byte[] digest = sha1.ComputeHash(plainData);
//解密簽名
bool isDataIntact = provider.VerifyHash(digest, "SHA1", signedDigestData);
return isDataIntact;
}
}到此這篇關(guān)于ASP.NET加密和解密的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于ASP.NET+EasyUI框架實現(xiàn)圖片上傳提交表單功能(js提交圖片)
這篇文章主要介紹了基于ASP.NET+EasyUI框架實現(xiàn)圖片上傳再提交表單(js提交圖片)的相關(guān)資料,需要的朋友可以參考下2016-06-06
ASP.NET筆記之文章發(fā)布管理小系統(tǒng)案例
本篇文章小編為大家介紹,ASP.NET筆記之文章發(fā)布管理小系統(tǒng)案例。需要的朋友參考下2013-04-04
Asp.net使用SignalR實現(xiàn)聊天室的功能
這篇文章主要介紹了Asp.net使用SignalR實現(xiàn)聊天室的功能的相關(guān)資料,需要的朋友可以參考下2016-04-04
關(guān)于asp.net button按鈕的OnClick和OnClientClick事件
OnClick是button的服務(wù)器端事件 OnClientClick是button的客戶端事件2009-05-05
ASP.NET Gridview 中使用checkbox刪除的2種方法實例分享
ASP.NET Gridview 中使用checkbox刪除的2種方法實例分享,需要的朋友可以參考一下2013-06-06
未處理的事件"PageIndexChanging" 之解決方案
今天我寫一個小程序遇到這個問題,上網(wǎng)搜了一下,已經(jīng)有很好的解決方法了,以前都是拉控件自己生成,現(xiàn)在用代碼自己寫就出現(xiàn)了這個問題2008-07-07
.Net core下直接執(zhí)行SQL語句并生成DataTable的實現(xiàn)方法
.net core可以執(zhí)行SQL語句,但是只能生成強類型的返回結(jié)果。這篇文章主要介紹了.Net core下直接執(zhí)行SQL語句并生成DataTable的相關(guān)資料,需要的朋友可以參考下2016-11-11
asp.net 利用IIS的404錯誤將文件重寫成目錄的簡單方法
為什么要把文件重寫成目錄,主要原因是討好搜索引擎,至于為什么寫成目錄搜索引擎就比較容易搜錄不在本文討論范圍之內(nèi)。2009-09-09
asp.net 從POST的數(shù)據(jù)流中提取參數(shù)和文件
按理,F(xiàn)orm提交的數(shù)據(jù),無論是application/x-www-form-urlencoded還是multipart/form-data(有附件時),都可在服務(wù)端通過Request.Form["name"]和Request.Files["name"]獲取到參數(shù)和上傳的文件。2010-02-02

