[.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;
}
參考資料:
工作經驗