大家好,我是羊小咩
这章来谈谈混合加密系统(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
<<: [Day28]一寸光阴不可轻-修好你的资料,补值初学上线
>>: [Day 29] Frontend ? Backend ? 如何做选择?
若是您选择以软件包或 Docker 这种 On Premises 的安装方式安装在本机电脑的话,那首...
-证据大图 行政调查是内部调查。 调查(Investigation) 调查:调查或研究,检查与某事...
前言 在学习程序语言的过程中,应该都有听过物件导向程序设计(Object-oriented prog...
Transfer Learning的意思是,假设你现在有一些跟你的task没有直接相关的data,那...
CTRL + C & CTRL + V,两个指令就能让你成为工程师。 Selection ...