非对称加密
1. 对称加密的弊端’
-
秘钥分发困难
-
可以通过非对称加密完成秘钥的分发
https
Alice 和 Bob通信, Alice给bob发送数据, 使用对称加密的方式
- 生成一个非对称的秘钥对, bob生成
- bob将公钥发送给alice
- alice生成一个用于对称加密的秘钥
- alice使用bob的公钥就对称加密的秘钥进行加密, 并且发送给bob
- bob使用私钥就数据解密, 得到对称加密的秘钥
- 通信的双方使用写好的秘钥进行对称加密数据加密
2. 非对称加密的秘钥
- 不存在秘钥分发困难的问题
2.1 场景分析
数据对谁更重要, 谁就拿私钥
- 直观上看: 私钥比公钥长
- 使用第三方工具生成密钥对: 公钥文件xxx.pub xxx
通信流程, 信息加密 (A写数据, 发送给B, 信息只允许B读)
A: 公钥
B: 私钥
登录认证 (客户端要登录, 连接服务器, 向服务器请求个人数据)
客户端: 私钥
服务器: 公钥
数字签名(表明信息没有受到伪造,确实是信息拥有者发出来的,附在信息原文的后面)
- 发送信息的人: 私钥
- 收到信息的人: 公钥
网银U盾
- 个人: 私钥
- 银行拿公钥
3. 使用RSA非对称加密通信流程
要求: Alice 给 bob发送数据, 保证数据信息只有bob能看到
4. 生成RSA的秘钥对
4.1 一些概念
- x509证书规范、pem、base64
- pem编码规范 - 数据加密
- base64 - 对数据编码, 可逆
- 不管原始数据是什么, 将原始数据使用64个字符来替代
- a-z A-Z 0-9 + /
- 不管原始数据是什么, 将原始数据使用64个字符来替代
- ASN.1抽象语法标记
- PKCS1标准
4.2 密钥对生成流程
-
生成私钥操作流程概述
-
使用rsa中的GenerateKey方法生成私钥
func GenerateKey(random io.Reader, bits int) (priv *PrivateKey, err error)
- rand.Reader -> import “crypto/rand”
- 1024 的整数倍 - 建议
-
通过x509标准将得到的ras私钥序列化为ASN.1 的 DER编码字符串
func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte
-
将私钥字符串设置到pem格式块中
初始化一个pem.Block块
type Block struct { Type string // 得自前言的类型(如"RSA PRIVATE KEY") Headers map[string]string // 可选的头项
-