交互流程
- 请求服务器公钥 0x0B01 无加密
- 服务器应答公钥 0x8B01无加密
- 客户端进行证书验证
- 请求客户端公钥 0x8B02 无加密
- 客户端应答公钥 0x0B02 无加密
- 服务端进行证书验证
- 客户端表明支持的加密方式 0x0B03 无加密
- 服务器应答收到 0x8001
- 服务端选择加密方式
- 服务端下发密钥 0x8B04 设备公钥
- 设备端上报密钥 0x0B04 服务器公钥
报文编解顺序
-
encode
原始报文 - 压缩 - 加密 - 异或 - 转义
-
decode
转义 - 异或验证 - 解密 - 解压 - 原始报文
Diffie-Hellman
迪菲-赫尔曼密钥交换(英语:Diffie–Hellman key exchange,缩写为D-H)双方约定一个大质数P 和一个原根G, 发送方自己本地生成一个整数a作为G的a次方,接受方本地生成一个整数b作为G的b次方。 \(Key = (g^a \:mod\: p)^b \:mod\: p == (g^b \:mod\: p) ^ a \:mod\: p\)
上图A为Alice的公钥,a为Alice的私钥; B为Bob的公钥,b为Bob的私钥;K为双方的本地密钥
- 爱丽丝与鲍伯协定使用 p=23以及base g=5.
- 爱丽丝选择一个秘密整数a=6, 计算A = ga mod p并发送给鲍伯。 A = 56 mod 23 = 8.
- 鲍伯选择一个秘密整数b=15, 计算B = gb mod p并发送给爱丽丝。 B = 515 mod 23 = 19.
- 爱丽丝计算s = B a mod p 196 mod 23 = 2.
- 鲍伯计算s = A b mod p 815 mod 23 = 2.
RSA
RSA非对称加密算法,选择两个大的质数,生成公钥和私钥。将公钥传输给接受方,私钥自己保存。
可用于传递对称加密算法的密钥
一般情况是公钥加密,私钥解密。其中进行数字签名的时候,需要使用私钥加密,公钥来解密。
AES
高级加密标准(英语:Advanced Encryption Standard,缩写:AES)是一种对称加密算法
ECB-AES
Electronic Codebook
优点:
- 简单
- 有利于并行计算
- 误差不会被传送
缺点:
- 不能隐藏明文的模式
- 可能对明文进行主动攻击
CBC-AES
Cipher Block Chaining
优点:
- 安全性优于ECB,适合传输长报文,是SSL、IPSec的标准
缺点:
- 不利于并行计算
- 误差传递
- 需要初始化向量IV
CFB-AES
Cipher Feedback
优点:
- 隐藏明文模式
- 分组密码转化为流模式
- 可以及时加密传送小于分组的数据
缺点:
- 不利于并行计算
- 误差传送
- 唯一的IV
OFB-AES
Output Feedback
优点:
- 隐藏明文模式
- 分组密码转化为流模式
- 可以及时加密传送小于分组的数据
缺点:
- 不利于并行计算
- 对明文的主动攻击是可能的
- 误差传送,一个明文单元损坏影响多个单元
CTR-AES
Counter
数字证书
自签名证书:用自己的私钥签发自己的公钥即主体信息生成的证书。
证书签名:对证书固定值进行hash后用密钥对中的私钥对hash值加密
keystore: keytool生成证书的存储库,用来存储若干条目,每一条目包含公私钥,主体信息等。默认为用户目录下.keystore,相当于一个有密码保护的文件。
truststore: 与keystore格式相同,但是为区分只用来存放信任的证书,不存密钥等信息。
der:证书编码格式,证书结构体转换为二进制格式。
pem:证书编码格式,对der二进制编码的base64字符,包含---begin---,----end----。// 命令中加-rfc可打印和生成此类文件
.csr:证书请求文件格式,包含公钥和主体信息,发给ca,ca用私钥对内容签名并制作成证书返回。keytool在生成csr文件时需要指定证书(即公钥与主体信息)。
.crt:一般用于linux系统的证书格式,包含公钥和主体信息。
.cer:一般用于windows的证书文件格式,包含公钥和主体信息。
.p12:证书交换格式,包含公钥私钥(私用密码加密),用于交换传输。
生成自签名证书
$ keytool -storepass g7.com -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 3650 -alias g7 -keystore g7.keystore -storetype PKCS -dname "CN=www.g7.com.cn, OU=g7, O=g7, L=BJ, ST=BJ, C=CN"
-
genkeypair:生成公私钥对条目,私钥不可见,公钥会以证书格式保存在keystore中。
-
alias: 指定别名,区分不同条目,默认mykey
-
keysize: 密钥长度
-
keyalg: 公私钥算法 RSA
-
validity: 证书过期时间 天
-
keystore: 指定存储密钥库,若不存在会创建,若指定则在当前文件夹下生成。默认密钥库为用户目录下.keystore文件
-
storetype: 密钥库类型 JKS PKCS等
导出签名
$ keytool -export -alias g7 -keystore g7.keystore -storepass g7.com -file g7.crt