杂说6 —— 尝试自定义加密传输协议
gmssl在tlcp中使用了ecc-sm4-sm3 (0x0e13)
SM2是基于ECC椭圆曲线加密,对标RSA,不是前向加密的
ECDHE 前向加密

-----------------------------------------------------------------

-----------------------------------------------------------------
TLCP是基于TLS的,更多的是用于安全传输http等应用协议,也可以安全传输自定义的应用协议。
既然要自定义,且TLCP也是应用层协议,那就基于TLCP进行自定义修改
密钥协商算法 :ECDHE SM9
签名算法:RSA SM2
通信:AES-256-GCM SM4
摘要算法:SHA384 SM3
密钥交换/密钥协商: SM9

对于已经无法去参悟高等数学的我去看 “椭圆曲线”、“群”、“G点”,真是头都要炸了。
直接看gmssl中sm9怎么用
使用例子(命令行工具)为demos/scripts/sm9demo.sh

/opt/gmssl/GmSSL/demos/scripts$ export PATH=$PATH:`pwd`/../../build/bin
/opt/gmssl/GmSSL/demos/scripts$ ./sm9demo.sh
sm9verify success
hello
看着还挺复杂的,还得看文档

有个重要的东西
GMT 0044.2-2016 SM9标识密码算法 第二部分:数字签名算法
3.6 密钥生成中心 KGC
本部分中,负责选择系统参数、生成签名主密钥并产生用户签名私钥的可信机构
GMT 0044.3-2016 SM9标识密码算法 第三部分:密钥交换协议
3.9 密钥生成中心 KGC
在本部分中,负责选择系统参数、生成加密主密钥并产生用户加密私钥的可信机构
为了验证客户端或服务端的可信任性,需要可信第三方机构,之前是CA,这里是KGC。
-------------------------------------
和http等应用不同,
我的环境:服务端、客户端均应该是自己的。
假设:服务端、客户端自身保证了固件、运行环境的安全性,不会泄漏内部资源(如初始密钥、加密函数等)
我只要设定某种条件保存在服务端、客户端中,外界不会得知,那么就可以认为这个服务端、客户端是自己的,可以信任。
就像SM9中使用身份信息(如邮件、身份证ID等)作为公钥一样,服务端、客户端的ID是可以公开的,那么就可以:
client server
CID:客户端ID SID:服务端ID
生成随机数Rc,发送(CID,Rc)
接收到 (CID,Rc)
使用函数M(SID, CID)生成信息密钥Ki
生成随机数Rs,使用函数F(Rs, Rc)生成数据密钥Kd
使用Ki加密(Rs, Kd)为Ei,使用Kd加密第一块数据Ed0
发送(SID, Ei, Ed0)
接收到 (SID, Ei, Ed0)
使用函数M(SID, CID)生成信息密钥Ki
使用Ki解密Ei为(Rs, Kd)
使用函数F(Rs, Rc)生成数据密钥Kd‘,校验Kd和Kd’
校验成功,使用Kd解密第一块数据Ed0
发送Kd加密的回复
开始传输流
其中M()、F():
就像密码不要设置为弱密码(如123456)一样,不要设置为一想就能想到的“加、异或、直接AES/SM4”等
每次实现应不同,这样就类似前向加密
最好M != F
其中信息密钥Ki、数据密钥Kd:可想而知,对称加密SM4密钥
其中发送的包要做摘要以供校验,使用SM3
至于SM2非对称加密,可以使用到M()、F()中,但好像没必要在小地方使用这重武器
浅层攻击如何:(在假设条件完好且M()、F()够复杂的情况下)
第三者当作客户端, 生成随机数Rc、发送自己的(CID,Rc),然后服务端发送(SID, Ei, Ed0)。第三者接收到自己的(SID, Ei, Ed0),SID是公开的,不知道M()、F(),无法解密,也无法继续
第三者截获客户端的(CID,Rc)、(SID, Ei, Ed0),CID、SID、Rc都是公开的,不知道M()、F(),无法解密,也就获取不到数据密钥Kd,无法继续伪装通信
深层攻击:
???
(只是了解过,不是做安全的,不知道他们是怎么测试攻击的)
这样协议头很简单
