隨著網際網路的興起,帶動資訊的流通,關切的重點從資料的機密性 (Confidentiality),移動到資訊來源的整全性 (Integrity) 與鑑別性 (Authentication),此範疇稱為「近代密碼學」。
AES 不能保證可鑑別性嗎?這就回到了「對稱性演算法」與「非對稱性演算法」的討論,就是有對稱鑰匙和不對稱鑰匙的區別。這裡我請各位先了解一下這兩個差別,再繼續看下去囉。
(停頓 3 分鐘,讓大家有時間查資料)
... 1 min
... 2 mins
... 3 mins
(好,時間到,下方高能預警,請小心服用)
我個人覺得,RSA 要搭配 AES 來用,因為 RSA 不適合加密大量檔案,所以大量檔案的部分由 AES 完成,而我們所需要的鑑別性,可以利用「數位簽章法」來完成,數位簽章的部分再使用 RSA 即可。來直接看 CODE:
/// <summary>
/// RSA 字串加密 (非對稱式演算法)
/// </summary>
/// <param name="Source">加密前字串</param>
/// <param name="CryptoKey">加密金鑰</param>
/// <returns>加密後字串</returns>
internal static string rsaEncryptBase64(string Source, string CryptoKey)
{
// 建立 RSA 加解密物件
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
// 匯入加密金鑰
rsa.FromXmlString(CryptoKey);
// 加密
byte[] orgData = Encoding.Default.GetBytes(Source);
byte[] encryptedData = rsa.Encrypt(orgData, false);
return Convert.ToBase64String(encryptedData);
}
接下來是解密的部分,有加密就有解密,循環相剋,生生不息...
/// <summary>
/// RSA 字串解密 (非對稱式演算法)
/// </summary>
/// <param name="Source">解密前字串</param>
/// <param name="CryptoKey">解密金鑰</param>
/// <returns>解密後字串</returns>
internal static string rsaDecryptBase64(string Source, string CryptoKey)
{
// 建立 RSA 加解密物件
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
// 匯入解密金鑰
rsa.FromXmlString(CryptoKey);
// 解密
byte[] encryptedData = Convert.FromBase64String(Source);
byte[] decryptedData = rsa.Decrypt(encryptedData, false);
return Encoding.Default.GetString(decryptedData);
}
文檔區塊 | 說明舉例 |
---|---|
檔頭 (可鑑別之物) | 以 RSA-Key 加密後的 AES-Key |
檔身 (訊息內容) | 以 AES-Key 加密後的 Cipher |
怎麼樣?安總的文章架構脈絡很清楚,又很容易應用吧?昨天我們先用 AES 演算法來保證「文檔機密性」,今天再用 RSA 演算法再加上「文檔鑑別性」。如果您不需要「文檔鑑別性」,那就做到「文檔機密性」就好囉。( ^.< )
幾年前安總做韌體 (Firmware) 工程時,接觸到很多加密 IC,是利用硬體加密的方法來實作 AES、RSA,或是橢圓曲線的加密算法,以保證資料機密性,或是硬體與硬體之間的可鑑別性 (M2M Authentication)。從下方這張圖我們更可以看出安全模型、框架與基礎建設 (Security Models, Framework, and Infrastructure) 的重要,下面幾章我們就會好好來探討,當今在各領域中常用之模型與框架。
圖片來源:https://www.slideshare.net/Eurotechchannel/iot-security-in-action-boston-sept-2015