OpenSSL和龙脉GM3000_SKF交叉验证

SM4

OpenSSL :随机生成对称密钥,对明文进行加密,并将 iv 写入密文的开头。

龙脉GM3000_SKF :

ecb 模式

cbc 模式


OpenSSL 生成 SM2 密钥对 和 自签名证书

openssl 生成SM2格式pri.key私钥

openssl ecparam -genkey -name SM2 -out pri.key

根据pri.key私钥生成SM2格式公钥pub.key

openssl ec -in pri.key -pubout -out pub.key

根据pri.key生成请求ca-req.csr

openssl req -new -out ca-req.csr -key pri.key

之后会要求输入信息,其中只有Common Name是必填字段,其余如不想填直接回车即可

接下来根据请求文件生成X509格式的ca-cert.pem证书

openssl x509 -req -in ca-req.csr -out ca-cert.pem -signkey pri.key -days 3650

将X509格式的证书(包含公钥)和pri.key结合到一个证书,即PKCS12格式的证书,后缀名为.pfx

openssl pkcs12 -export -clcerts -in ca-cert.pem -inkey pri.key -out cert.pfx

pri.key文件转换成.pem格式
openssl ec -in pri.key -out pri.pem


SM2 签名验签

OpenSSL : 读取 PEM 格式的私钥,使用私钥对文件进行签名。

龙脉GM3000_SKF :向 USBKey 中导入证书和公私钥对,读取 USBkey 中的公钥,进而进行验签。

由于目前 OpenSSL 和 龙脉GM3000_SKF 的签名值数据结构不同,无法交叉测试成功

龙脉GM3000_SKF 的 SM2签名函数 和 签名值数据结构

/*
*	ECC数字签名。采用ECC算法和指定私钥hKey,对指定数据pbData进行数字签名。签名后的结果存放到pbSignature缓冲区,设置pulSignLen为签名值的长度
*	hContainer		[IN] 用来签名的私钥所在容器句柄
*	pbData			[IN] 被签名的数据
*	ulDataLen		[IN] 待签名数据长度,必须小于密钥模长
*	pbSignature		[OUT] 签名值,为NULL时用于获得签名值的长度
*	pulSigLen		[IN,OUT] 返回签名值长度的指针 
*/
ULONG DEVAPI SKF_ECCSignData (HCONTAINER hContainer, BYTE *pbData, ULONG  ulDataLen, PECCSIGNATUREBLOB pSignature);

签名值的数据结构是:

#define ECC_MAX_XCOORDINATE_BITS_LEN	512	//ECC算法X坐标的最大长度
#define ECC_MAX_YCOORDINATE_BITS_LEN	512	//ECC算法Y坐标的最大长度

// ECC签名数据结构
typedef struct Struct_ECCSIGNATUREBLOB{
	BYTE	r[ECC_MAX_XCOORDINATE_BITS_LEN/8];
	BYTE	s[ECC_MAX_YCOORDINATE_BITS_LEN/8];
} ECCSIGNATUREBLOB, *PECCSIGNATUREBLOB;

结论:龙脉GM3000_SKF 的 签名值 是 128 字节,不符合 SM2 签名值的长度( SM2 理论签名长度:70-72字节不等)

而且函数的声明,和函数的注释不相符,参数少一个,数据类型也对不上,很可能是 API 弄错了。

签名结果里面有大量的、规律的 0x00

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: f2f2 20b8 2a84 c04b 40f3 a7db e6d9 3389  .. .*..K@.....3.
00000030: 2dde d081 fb6e f3d8 94ee f92a 5596 4df1  -....n.....*U.M.
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: c128 fd08 73e0 ef06 5a05 1a7a 045b a7fe  .(..s...Z..z.[..
00000070: 9c02 ac27 1197 ca41 d6a7 b8ae efc9 5520  ...'...A......U 

但 OpenSSL 和 龙脉GM3000_SKF SM2 的签名验签都是自洽的

posted @ 2022-04-17 17:57  191206  阅读(759)  评论(0编辑  收藏  举报