欢迎光临散文网 会员登陆 & 注册

杂说6 —— 尝试自定义加密传输协议

2023-04-18 10:06 作者:FineClassFuture  | 我要投稿

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():

  1. 就像密码不要设置为弱密码(如123456)一样,不要设置为一想就能想到的“加、异或、直接AES/SM4”等

  2. 每次实现应不同,这样就类似前向加密

  3. 最好M != F

其中信息密钥Ki、数据密钥Kd:可想而知,对称加密SM4密钥

其中发送的包要做摘要以供校验,使用SM3


    至于SM2非对称加密,可以使用到M()、F()中,但好像没必要在小地方使用这重武器


浅层攻击如何:(在假设条件完好且M()、F()够复杂的情况下)

  1. 第三者当作客户端, 生成随机数Rc、发送自己的(CID,Rc),然后服务端发送(SID, Ei, Ed0)。第三者接收到自己的(SID, Ei, Ed0),SID是公开的,不知道M()、F(),无法解密,也无法继续

  2. 第三者截获客户端的(CID,Rc)、(SID, Ei, Ed0),CID、SID、Rc都是公开的,不知道M()、F(),无法解密,也就获取不到数据密钥Kd,无法继续伪装通信


深层攻击:

    ???

(只是了解过,不是做安全的,不知道他们是怎么测试攻击的)


    这样协议头很简单


杂说6 —— 尝试自定义加密传输协议的评论 (共 条)

分享到微博请遵守国家法律