文档章节

调试国密算法验签遇到的问题

Yan9527
 Yan9527
发布于 2017/07/08 10:11
字数 1175
阅读 173
收藏 0

项目要求服务端与客户端支持国密证书建立ssl通道.在本地demo中可以建立完整的ssl连接并通信.

服务端建立ssl时直接使用openssl加载根证书,服务端证书,服务端私钥.这里毫无问题.

但是客户端必须调用windows的csp接口,而且windows系统目前不支持导入国密证书,所以建立连接的方式只能是通过usekey的形式(usebkey可以想象为银行u盾),usbkey中实现了csp接口.

问题1,handshake摘要

openssl在建立连接的过程中,会将握手过程的信息做摘要保存在handshake_dgst[]数组,数组中每个索引对应一种摘要算法,每种支持的摘要算法都算一遍摘要保存.

摘要算法的过程有三个,1初始化init ,2 update ,3 final.其有一个特点,就是中间的update可以分多次调用,即

init();update("123");final(); 等同于init();update("1");update("2");update("3");final();

握手过程中,未避免保存大量待摘要内容,每次握手都是增量调用摘要update,在最后一次握手时调用final就可以了.

国密算法要求计算摘要前需要计算Z值,计算Z值需要对方的公钥,而且usbkey只支持在内部计算摘要并签名,不能只调用其签名接口,这就产生了如下矛盾:

1.客户端必须保存签名前的所有握手信息,极其占用空间

2.服务端必须在第一次握手时就计算出Z值加在握手信息前摘要,否则无法验签.而第一次握手时服务端没有客户端公钥无法计算Z值,所以服务端也必须保存一份极占空间的握手信息,这种做法在访问量大的时候是个灾难.

解决方法:只要能够保证握手信息的完整性,并且服务端和客户端信息一致就可以.所以不对原始握手信息进行摘要,而对openssl计算的摘要信息进行再摘要.逻辑如下: 

客户端:sign( 摘要(Z值+openssl摘要) )    服务端:verify( 摘要(Z值+openssl摘要) )  

问题2:大端小端问题

在签名与验签过程中,始终不能通过,打印过程中的参数都没有错误.最后确认为:usbkey实现的csp接口返回的签名是已小端方式存储的.服务端实现的是大端存储方式的验签算法.所以将csp接口返回的签名(r,s)分别倒序,验签通过.大小端区别如下: 转载自http://blog.csdn.net/zhaoshuzhaoshu/article/details/37600857/

 

 

所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

2.为什么会有大小端:

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

3.大小端在内存中的存放方式举例:

 例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址

0x4000

0x4001

存放内容

0x34

0x12

而在Big-endian模式CPU内存中的存放方式则为:

内存地址

0x4000

0x4001

存放内容

0x12

0x34

 

© 著作权归作者所有

Yan9527
粉丝 0
博文 31
码字总数 11309
作品 0
海淀
后端工程师
私信 提问
解决国密SM2算法前端JavaScript实现的问题

实现国密SM2算法前端JavaScript加密与后端bouncy castle包内的算法保持一致,加密解密/签名验签功能可前端后端相互操作。

liusha_0302
2017/10/27
220
1
众享比特李刘海:国密在超级账本Fabric中的应用

导读 4月22日,超级账本Hyperledger北京Meetup在北京大学信息学院举行。本次会议由Hyperledger中国工作组和Linux基金会主办、安妮股份、版权区块链联盟、北京大学协办,专注于技术交流、实践...

众享比特
2018/04/25
66
0
“国密证书全生态应用战略研讨会”在深圳隆重召开

4月15日,沃通主办的“国密证书全生态应用战略研讨会”在深圳隆重召开,有关领导、全国26家CA机构的负责人和CA业内专家齐聚一堂,详细了解沃通CA基于国密证书的全生态应用研究成果,共同探讨...

一夜九次
04/17
0
0
解决开源组件esapi调用bouncy castle包中国密算法失败问题

1. 解决通过 ESAPI调用bouncy castle库中SM4算法失败的问题。 2. 解决通过ESAPI调用bouncy castle库中SM2算法签名验签失败的问题。

liusha_0302
2017/11/09
9
0
《电子签名法》修正案草案通过,房地产行业电子签名重磅利好

4月3日,国务院常务会议通过了一批法律修正案草案,决定提请全国人大常委会审议。其中《电子签名法》修正案草案的修改建议中包括:“允许在办理土地、房屋等转移登记时使用电子文书。”这项修...

wossl
06/18
12
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud 笔记之Spring cloud config client

观察者模式它的数据的变化是被动的。 观察者模式在java中的实现: package com.hxq.springcloud.springcloudconfigclient;import org.springframework.context.ApplicationListener;i...

xiaoxiao_go
21分钟前
2
0
CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
今天
3
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
7
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部