[.NET]AES加密解密資料的快速範例

  • 4838
  • 0
  • 2020-10-15

[.NET]AES加密資料的快速範例

加密的範例:

//photoBytes是原始尚未加密的任何二進位資料
public byte[] photo_encryption(byte[] photoBytes)
{
	//宣告AES 256加密演算法
	AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
	SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider();
	//key值通常是base64格式的字串, 因為一般人在定義key, iv的時候
	//都是任意輸入中文或是英文的字串
	//所以大多時候,key, iv都是將此中文或是英文字串先轉成base64格式
	//才儲存於檔案或是資料庫裡面
	
	//QVRNMzkzOTg4OQ== Convert出來是ATM3939889
	//ComputeHash()會幫ATM3939889湊滿長度=64的字串, 並轉成byte[]
	//為什麼要執行ComputeHash()呢?因為AES演算法的key必須由長度=64的字串
	//轉成byte[]才能進行
	//ps.如果把ATM3939889字串手動湊成剛好長度=64,即不用執行ComputeHash()
	//直接convert.tobyte[]即可
	byte[] key = sha256.ComputeHash(Convert.FromBase64String("QVRNMzkzOTg4OQ==")); 
	//ODgyNTI1Mg== Convert出來是8825252
	//AES 256加密演算法的iv的道理類似於他的key
	//只是iv只需要長度16就好
	//ps.如果把8825252字串手動湊成剛好長度=16,即不用執行ComputeHash()
	//直接convert.tobyte[]即可
	byte[] iv = sha256.ComputeHash(Convert.FromBase64String("ODgyNTI1Mg=="));
	byte[] xx = new byte[16];

	for (int i = 0; i < 16; i++)
	{
		xx[i] = iv[i];
	}

	aes.Key = key;
	aes.IV = xx;

	byte[] encryptPhotoDataBytes;
	using (MemoryStream msPhotoData = new MemoryStream())
	using (CryptoStream cs = new CryptoStream(msPhotoData, aes.CreateEncryptor(), CryptoStreamMode.Write))
	{
		cs.Write(photoBytes, 0, photoBytes.Length);
		cs.FlushFinalBlock();
		encryptPhotoDataBytes = new byte[msPhotoData.Length];
		msPhotoData.Position = 0;
		msPhotoData.Read(encryptPhotoDataBytes, 0, (int)msPhotoData.Length);
		msPhotoData.Close();
	}
	MessageBox.Show("執行完畢!");
	return encryptPhotoDataBytes;	
		
}


解密範例:

//由於加密跟解密的原理一樣,所以註解都寫在加密那邊,而這邊的解密沒有加註解
//看完加密那邊的註解之後,解密這邊就會都瞭解囉
public byte[] photo_Decrypt(byte[] encryptBytes)
{
	AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
	SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider();
	byte[] key = sha256.ComputeHash(Convert.FromBase64String("QVRNMzkzOTg4OQ=="));
	byte[] iv = sha256.ComputeHash(Convert.FromBase64String("ODgyNTI1Mg=="));
	byte[] xx = new byte[16];

	for (int i = 0; i < 16; i++)
	{
		xx[i] = iv[i];
	}

	aes.Key = key;
	aes.IV = xx;

	using (MemoryStream ms = new MemoryStream())
	{

		using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write))

		{
			cs.Write(encryptBytes, 0, encryptBytes.Length);
			cs.FlushFinalBlock();
			return ms.ToArray();
		}

	}

}


實務上引用的時候,為了方便,建議搭配下面兩個函數,方便把物件轉型

首先將要加密的字串轉成二進位資料,然後才去加密,加密完畢之後通常會再轉換為base64的字串,才方便儲存在檔案或是db
ps. 加密後的字串常常需要寫在.config檔案(大多情況是db連線字串的密碼),所以最後才會常常轉回base64的字串格式。

public string CryptEncryptString(string src)
{
	string result = "";
	try
	{
		byte[] aesBytes = photo_encryption(System.Text.Encoding.UTF8.GetBytes(src));
		result = Convert.ToBase64String(aesBytes);
	}
	catch
	{
		result = "";
	}

	return result;
}



接著將base64格式的字串轉回二進位資料,於是就可以進行解密,解密之後再轉回人類看得懂的文字,大概就是這樣

public static string CryptDecryptString(string src)
{
	string result = "";
	try
	{
		byte[] noAesBytes = photo_Decrypt(Convert.FromBase64String(src));
		result = System.Text.Encoding.UTF8.GetString(noAesBytes);
	}
	catch
	{
		result = "";
	}

	return result;
}




參考資料:
工作經驗