【国密】TLCP单向认证握手解密失败

一、现象:

  最近项目上与三方对接需要实现TLS国密证书认证,由于jdk没有实现TLCP协议,选择使用阿里的开源项目gmsse,但在与三方连接时发现有概率出现java.lang.IllegalArgumentException : Invalid point coordinates错误

二、原因:

  找了很久,怀疑过我们生成的证书有问题,也怀疑过是不是对面加密有问题,最后,在抓包过程中发现在TLS加密握手的过程中Client Key Exchange阶段传递过来的密文总是在208198开头的时候可以成功连接,但除了208198开头的密文外,还有208199和20819a这两种前缀。

208198:

208199:

20819a:

  遂开始研究国密交换流程,查找许多资料后发现(TLCP交互流程),国密在客户端交换秘钥时SM2加密后C1||C3||C2使用的是ASN1.DER编码格式,这种编码格式在R或S的最高位为1时,需要前补0X00,为了在有符号的情况下避免被误认为是负数。

  具体可以查看:【加密算法】SM2签名本地验证成功,为啥对方判定非法?——深入解析SM2签名格式兼容性问题

  回到我们抓包拿到的密文,根据ASN1.DER可以辨别出208198后面跟着的C1的值是152个字节,继续解析C1x和C1y可以发现,这对坐标的长度都是32个字节,而208199的密文C1x和C1y都有可能出现前补0X00的情况,20819a则C1x和C1y都会前补0X00

三、解决:

  发现了上面的情况后,debug追踪代码发现gmsse在接收client交换来的密文后,解密时并没有对C1x和C1y做任何处理,尝试修改源码,将0X00删除后不在出现java.lang.IllegalArgumentException : Invalid point coordinates错误

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值