Day 27. 混血的最萌 - 混合加密系统(hybrid cryptosystem)

大家好,我是羊小咩

这章来谈谈混合加密系统(hybrid cryptosystem)

现今大多传送机制都是使用混合加密系统,原因无他就因速度快,使用安全

SSL/TLS 就是使用混合加密系统实作

另外许多支付系统,银行业者为了更加的安全,除了使用 SSL/TLS 传输安全协议,还会在资料部分,再包一层自己的加密系统

有业者使用硬体机制(HSM),有些使用软件客制,不外乎都是为了保障使用者和服务器之间的资料安全

image-20201012182615071

介绍

先前提到的对称式金钥(共用金钥系统),以及非对称式金钥(公开金钥系统)特性,因此单独使用也有显着的缺点

  • 对称式加密
    • 加密速度快
    • 金钥容易外泄
  • 非称式加密
    • 金钥使用保存安全
    • 加密速度慢

混合加密系统(hybrid cryptosystem),依照字面上的意思当然就是混合使用对称式加密,以及非对称式金钥加密系统

使用非对称式金钥交换安全特性,配合对称式加密加密速度快的优势,通过两种结合解决,资料很多加密很慢,或金钥保存不易问题,是结合两种优点并弥补缺点的密码系统

混合加密系统加密流程说明

羊打算透过网路传送资料给咩

咩制作好公开金钥和私密金钥

image-20201012112107080

传送公开金钥给羊

image-20201012112245202

羊,制作可以快速上锁(加密)的金钥(共享金钥/对称式金钥

image-20201012112407160

使用共享金钥对资料加密

image-20201012112514264

共享金钥使用公开金钥加密封装

image-20201012112553782

将两个封装资料传送给咩(接收者)

image-20201012113138445

image-20201012113151899

使用 私密金钥 打开使用公开金钥加密的包裹(里面放的是共享金钥)

image-20201012113254125

最後使用共享金钥解开并取出原始资料

image-20201012113313964

标准一点的加密流程图

image-20201012115034567

混合加密系统特性

  • 金钥的封装
    • 用公开金钥系统(非对称金钥)把金钥封装
    • 由於只有私钥可以解开,不用担心金钥泄漏
  • 讯息的封装
    • 用共享金钥系统(对称式金钥)将讯息加密
    • 即使资料很大,加密速度也很快

范例

这里使用简单的 iOS / SWIFT 范例程序,演示怎麽传送出去资料

首先要先接收公钥,可以双方协议怎麽交换,这里就不另外叙述

但由於我们使用公开金钥因此明文传递也不会有太大问题

有个有名又安全的金钥交换方式

迪菲-赫尔曼密钥交换(Diffie–Hellman key exchange)

WIKI DH 介绍

建立随机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 的安装方式安装在本机电脑的话,那首...

行政调查(administrative investigation)

-证据大图 行政调查是内部调查。 调查(Investigation) 调查:调查或研究,检查与某事...

【Day 22】Class 类别

前言 在学习程序语言的过程中,应该都有听过物件导向程序设计(Object-oriented prog...

【Day 26】迁移学习(Transfer Learning)(上)

Transfer Learning的意思是,假设你现在有一些跟你的task没有直接相关的data,那...

那些被忽略但很好用的 Web API / Clipboard

CTRL + C & CTRL + V,两个指令就能让你成为工程师。 Selection ...