如何以C#實作AES加密方法
AES 屬於一種對稱式加密 一般來說你需要一把KEY來對訊息做加密
但是再利用C#實作的時候 他還需要一個初始化向量IV
初始化向量是幹嘛的呢?
根據MSDN所述 因為這項技術會使用前一個區塊來加密的下一個區塊,來加密資料的第一個區塊需要的初始化向量。
恩 我也不知道再攻 three 小 等我理解再補上
首先呢 我準備一個Model 裡面放了加密所需要的參數 和一些我想轉換文字的方法
為什麼我要用一個Model 因為我想記住之前的加密金鑰(Key)跟初始化向量(IV) 還有一堆有的沒的
public class encryptModel
{
public byte[] source { get; set; }
public byte[] key { get; set; }
public byte[] IV { get; set; }
public byte[] encrypt { get; set; }
public byte[] decrypt { get; set; }
public string GetKeyToBase64
{
get{ return Convert.ToBase64String(key); }
}
public string GetIVToBase64
{
get { return Convert.ToBase64String(IV); }
}
public string GetSourceToBase64
{
get { return Convert.ToBase64String(source); }
}
public string GetEncryptToBase64
{
get { return Convert.ToBase64String(encrypt); }
}
public string GetDecryptToBase64
{
get { return Convert.ToBase64String(decrypt); }
}
public string GetKeyToString
{
get { return Encoding.UTF8.GetString(key); }
}
public string GetIVToString
{
get { return Encoding.UTF8.GetString(IV); }
}
public string GetSourceToString
{
get { return Encoding.UTF8.GetString(source); }
}
public string GetEncryptToString
{
get { return Encoding.UTF8.GetString(encrypt); }
}
public string GetDecryptToString
{
get { return Encoding.UTF8.GetString(decrypt); }
}
}
之後開始寫加解密的函式
public static encryptModel AesEncrypt(encryptModel aesModel)
{
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
aes.GenerateKey();
aes.GenerateIV();
aesModel.key = aes.Key;
aesModel.IV = aes.IV;
aesModel.encrypt = aes.CreateEncryptor().TransformFinalBlock(aesModel.source, 0, aesModel.source.Length);
}
return aesModel;
}
在這邊我只用了內建的函式來直接產生Key 與 IV 在將它儲存到我的Model裡
如果你不手動建的話 直接進行加密 也是會自動幫你建好 不過我想要保存Key,跟IV 所以先建好儲存 不然沒辦法解密R
當然 也可以在加密完之後再跟去要他自動產生的key跟IV
public static encryptModel AesDecrypt(encryptModel aesModel)
{
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
aes.Key = aesModel.key;
aes.IV = aesModel.IV;
aesModel.decrypt = aes.CreateDecryptor().TransformFinalBlock(aesModel.encrypt, 0, aesModel.encrypt.Length);
}
return aesModel;
}
把哈薩Key~~ 阿不是 把Key跟IV放回去請他幫你做解密摟
static void Main(string[] args)
{
encryptModel aesModel = new encryptModel();
Console.WriteLine("輸入原文:");
string source = Console.ReadLine();
aesModel.source = Encoding.UTF8.GetBytes(source);
AesEncrypt(aesModel);
AesDecrypt(aesModel);
Console.WriteLine("------------------------------");
Console.WriteLine($"Source(UTF8):{aesModel.GetSourceToString}");
Console.WriteLine($"AES KEY(Base64):{aesModel.GetKeyToBase64}");
Console.WriteLine($"AES IV(Base64):{aesModel.GetIVToBase64}");
Console.WriteLine($"AES Encrypt(Base64):{aesModel.GetEncryptToBase64}");
Console.WriteLine($"AES Decrypt:{aesModel.GetDecryptToString}");
Console.ReadLine();
}
Reference
1. https://zh.wikipedia.org/wiki/高级加密标准
2. https://msdn.microsoft.com/zh-tw/library/system.security.cryptography.symmetricalgorithm.key(v=vs.110).aspx
3. https://msdn.microsoft.com/zh-tw/library/system.security.cryptography.symmetricalgorithm.iv(v=vs.110).aspx
4. https://msdn.microsoft.com/zh-tw/library/system.security.cryptography.aescryptoserviceprovider(v=vs.110).aspx