大家好,我是羊小咩
這章來談談混合加密系統(hybrid cryptosystem)
現今大多傳送機制都是使用混合加密系統,原因無他就因速度快,使用安全
SSL/TLS 就是使用混合加密系統實作
另外許多支付系統,銀行業者為了更加的安全,除了使用 SSL/TLS 傳輸安全協議,還會在資料部分,再包一層自己的加密系統
有業者使用硬體機制(HSM),有些使用軟體客製,不外乎都是為了保障使用者和伺服器之間的資料安全
先前提到的對稱式金鑰(共用金鑰系統),以及非對稱式金鑰(公開金鑰系統)特性,因此單獨使用也有顯著的缺點
混合加密系統(hybrid cryptosystem),依照字面上的意思當然就是混合使用對稱式加密
,以及非對稱式金鑰
加密系統
使用非對稱式金鑰交換安全特性,配合對稱式加密加密速度快的優勢,通過兩種結合解決,資料很多加密很慢,或金鑰保存不易問題,是結合兩種優點並彌補缺點的密碼系統
羊打算透過網路傳送資料給咩
咩製作好公開金鑰和私密金鑰
傳送公開金鑰給羊
羊,製作可以快速上鎖(加密)的金鑰(共享金鑰/對稱式金鑰)
使用共享金鑰對資料加密
將共享金鑰使用公開金鑰加密封裝
將兩個封裝資料傳送給咩(接收者)
使用 私密金鑰 打開使用公開金鑰加密的包裹(裡面放的是共享金鑰)
最後使用共享金鑰解開並取出原始資料
標準一點的加密流程圖
這裡使用簡單的 iOS / SWIFT 範例程式,演示怎麼傳送出去資料
首先要先接收公鑰,可以雙方協議怎麼交換,這裡就不另外敘述
但由於我們使用公開金鑰因此明文傳遞也不會有太大問題
有個有名又安全的金鑰交換方式
迪菲-赫爾曼密鑰交換(Diffie–Hellman key exchange)
建立隨機AES 金鑰
key: "1111111111111111", iv: "0000000000000000"
將明文進行加密
if
let aes = try? AES(key: "1111111111111111", iv: "0000000000000000") , // aes128
let encrypted = try? aes.encrypt(orgiTextView.text!.bytes) ,
let EncData = encrypted.toBase64()
{
crypTextView.text = EncData
print(EncData)
}
將金鑰使用公開金鑰加密
let EncPublicKey = try! PublicKey(base64Encoded: inputPubkey.text!)
let clear = try! ClearMessage(string: "aes128 1111111111111111:0000000000000000", using: .utf8)
let encrypted = try! clear.encrypted(with: EncPublicKey, padding: .PKCS1)
let EncAESData = encrypted.base64String
crypKeyTextView.text = EncAESData
print(EncAESData)
注意這裡要被加密字串資料格式為
金鑰類型 金鑰:初始向量
aes128 1111111111111111:0000000000000000
這個沒有標準的格式,只要傳送方跟接收方協議好即可
用 JSON當然也是OK 的
{"key":"1111111111111111","iv":"0000000000000000"}
最後將 EncData(密文)和加密後的金鑰(EncAESData)這兩個資料傳送出去
小知識:通常我們會將加密金鑰放在 Header 內,密文一樣放在body
然後雙方自定 parser 解需傳輸資料
https://en.wikipedia.org/wiki/Hybrid_cryptosystem