iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 22
3
Security

資料安全與簡單加密演算法見面會 系列 第 22

[Day22] 資料傳輸安全(機密性) RSA x AES 混搭風(上)

這幾天我們從雜湊(Hash)、訊息驗證(MAC)到數位簽章複習起資料傳輸的完整性及來源識別
如果從PCI DSS標準檢視我們的請款檔案,還有一個應該被加以遮罩或加密的卡號(PAN)欄位要處理:

http://ithelp.ithome.com.tw/upload/images/20170106/201034349chMdMJjw2.png

如果檔案在網際網路(internet)中走跳著人生,那麼我們怎麼使用密碼學實作檔案內容的機密性(Confidentiality)?

  • 用非對稱加密演算法RSA加密處理?但效能相較其他對稱加密演算法好像來得慢一些。
  • 用對稱加密演算法,但金鑰交換的安全需要重視。

RSA x AES 混搭風


於是出現了一種不知道是不是某種工業標準的混搭風格,俗稱數位信封(Digital Envelop),打翻傳統使用單一加密演算法的款式搭配。
她的概念上是以非對稱加密演算法加密此次會議金鑰(Session key),檔案內容就以會議金鑰進行對稱式演算法加密,一來顧金鑰安全、二來顧效能

RSA除了與AES混搭結合外,也見過她與DES、2TDEA、3DES三兄弟的同台演出,人相當的隨和。

RSA金鑰交換流程


如果商家需要傳送檔案給收單銀行,首先收單銀行會產生一組公開與私密金鑰,收單銀行小心保護私密金鑰,並且把公開金鑰交給商家。

同樣的,如果收單銀行要傳送請款結果給商家,商家也需要產生一組公開與私密金鑰,商家小心保護私密金鑰,並且把公開金鑰交給銀行。

RSA x AES 加密流程


1.首先商家要先產生這次的會議金鑰(Session key)
2.商家使用會議金鑰(Session key)對檔案內容進行加密。
3.商家使用收單銀行的公開金鑰(public key)對會議金鑰(Session key)進行加密。
4.將步驟2.3檔案合併

簡單畫一個加密流程圖
http://ithelp.ithome.com.tw/upload/images/20170106/20103434cTJ19UZgTu.jpg

RSA x AES 解密流程


1.銀行將加密後的檔案拆開為加密後的會議金鑰(Session key)及加密後的檔案內容兩部分。
2.銀行使用自己保管的私密金鑰(private key)對會議金鑰(Session key)進行解密。
3.使用步驟2解開的會議金鑰(Session key)對加密後的檔案內容進行解密。

簡單畫一個解密流程圖
http://ithelp.ithome.com.tw/upload/images/20170106/20103434tEe0Y1MwCN.jpg

好,今天先完成會使到的C#方法,明天來組合。

準備會使用到的方法


測試檔案寫出

[TestMethod]
public void CreateFile()
{
    //輸入資料
    List<string> datas = new List<string>()
    {
        "4567-1111-2222-3333,高雄台鋁生活商場,1000",
        "4567-1111-2222-3333,台北微風信義分店,2000",
        "5567-1111-2222-3333,台南南紡購物中心,3000",
        "END,3,6000"
    };

    using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\temp\transaction.txt", false))
    {
        foreach (var data in datas)
        {
            file.WriteLine($"{data}");
        }
    }
}

AES加解密

AES是Advanced Encryption Standard進階加密標準,這邊我們先不多介紹AES,只學習怎麼使用,後面再找一天作AES的特別專輯。

AES256加密

傳入加密金鑰,IV初始向量及明文。
回傳BASE64編碼後的密文。。

//AES加密功能
public string AESEncryption(string Key, string IV, string PlainText)
{
    using (Aes aesAlg = Aes.Create())
    {
        //加密金鑰(32 Byte)
        aesAlg.Key = Encoding.Unicode.GetBytes(Key);
        //初始向量(Initial Vector, iv) 
        aesAlg.IV = Encoding.Unicode.GetBytes(IV);
        //加密器
        ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
        //執行加密
        byte[] cryptTextBytes = Encoding.Unicode.GetBytes(PlainText);
        byte[] cryptedText = encryptor.TransformFinalBlock(cryptTextBytes, 0, cryptTextBytes.Length);
        return Convert.ToBase64String(cryptedText);
    }
}

AES256解密

傳入解密金鑰,IV初始向量及BASE64編碼後的密文
回傳Unicode編碼後的明文。

//AES解密功能
public string AESDecryption(string Key, string IV, string CipherText)
{
    using (Aes aesAlg = Aes.Create())
    {
        //加密金鑰(32 Byte)
        aesAlg.Key = Encoding.Unicode.GetBytes(Key);
        //初始向量(Initial Vector, iv) 
        aesAlg.IV = Encoding.Unicode.GetBytes(IV);
        //加密器
        ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
        //執行解密
        byte[] encryptTextBytes = Convert.FromBase64String(CipherText);

        byte[] encryptedText = decryptor.TransformFinalBlock(encryptTextBytes, 0, encryptTextBytes.Length);
        return Encoding.Unicode.GetString(encryptedText);
    }
}

補充2016年7月自 .NET 4.6.2 起供應新的AesCng加解密演算法。

今天我們先花一點時間了解混搭風格,明天就來實地執行傳輸安全機密性。

參考

余小章 @ 大內殿堂 [C#.NET] AES 與 RSA 的加解密效能比較
https://dotblogs.com.tw/yc421206/2012/06/27/73097

Aes 類別
https://msdn.microsoft.com/zh-tw/library/system.security.cryptography.aes(v=vs.110).aspx


托斯卡尼省女警還有老婆
http://ithelp.ithome.com.tw/upload/images/20170106/20103434c45UADVUo4.jpg
2011.11 攝於Toscana,Italy


上一篇
[Day21] 資料傳輸安全(完整性)數位簽章
下一篇
[Day23] 資料傳輸安全(機密性) RSA x AES 混搭風(下)
系列文
資料安全與簡單加密演算法見面會 30

尚未有邦友留言

立即登入留言