這幾天我們從雜湊(Hash)、訊息驗證(MAC)到數位簽章複習起資料傳輸的完整性及來源識別,
如果從PCI DSS標準檢視我們的請款檔案,還有一個應該被加以遮罩或加密的卡號(PAN)欄位要處理:
如果檔案在網際網路(internet)中走跳著人生,那麼我們怎麼使用密碼學實作檔案內容的機密性(Confidentiality)?
於是出現了一種不知道是不是某種工業標準的混搭風格,俗稱數位信封(Digital Envelop),打翻傳統使用單一加密演算法的款式搭配。
她的概念上是以非對稱加密演算法加密此次會議金鑰(Session key),檔案內容就以會議金鑰進行對稱式演算法加密,一來顧金鑰安全、二來顧效能。
RSA除了與AES混搭結合外,也見過她與DES、2TDEA、3DES三兄弟的同台演出,人相當的隨和。
如果商家需要傳送檔案給收單銀行,首先收單銀行會產生一組公開與私密金鑰,收單銀行小心保護私密金鑰,並且把公開金鑰交給商家。
同樣的,如果收單銀行要傳送請款結果給商家,商家也需要產生一組公開與私密金鑰,商家小心保護私密金鑰,並且把公開金鑰交給銀行。
1.首先商家要先產生這次的會議金鑰(Session key)
2.商家使用會議金鑰(Session key)對檔案內容進行加密。
3.商家使用收單銀行的公開金鑰(public key)對會議金鑰(Session key)進行加密。
4.將步驟2.3檔案合併
簡單畫一個加密流程圖
1.銀行將加密後的檔案拆開為加密後的會議金鑰(Session key)及加密後的檔案內容兩部分。
2.銀行使用自己保管的私密金鑰(private key)對會議金鑰(Session key)進行解密。
3.使用步驟2解開的會議金鑰(Session key)對加密後的檔案內容進行解密。
簡單畫一個解密流程圖
好,今天先完成會使到的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是Advanced Encryption Standard進階加密標準,這邊我們先不多介紹AES,只學習怎麼使用,後面再找一天作AES的特別專輯。
傳入加密金鑰,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);
}
}
傳入解密金鑰,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
托斯卡尼省女警還有老婆
2011.11 攝於Toscana,Italy