[C#]加密 AES

如何以C#實作AES加密方法

AES 屬於一種對稱式加密   一般來說你需要一把KEY來對訊息做加密

但是再利用C#實作的時候 他還需要一個初始化向量IV

初始化向量是幹嘛的呢?

根據MSDN所述  因為這項技術會使用前一個區塊來加密的下一個區塊,來加密資料的第一個區塊需要的初始化向量。

恩 我也不知道再攻 three 小  等我理解再補上

首先呢 我準備一個Model 裡面放了加密所需要的參數 和一些我想轉換文字的方法

為什麼我要用一個Model 因為我想記住之前的加密金鑰(Key)跟初始化向量(IV) 還有一堆有的沒的

Model
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