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 的签名验签都是自洽的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构