导师让跑一下ECQV的程序,从github上下了一个:
链接: ecqv-utils
本科是计算机专业,对网安方面了解甚少,刚开始看这个代码着实费劲(代码注释不太多),前前后后看了得有一星期,结合openssl中文文档以及论文《隐式证书的国密算法应用研究》做了些注释,今天跑通了,把遇到的问题和模拟ECQV过程用到的函数记录一下。
这个程序应当是原作者在linux下写的,windows下没有这个文件,windows中对应的是io.h,因此将原代码中的
#include
改为:
#ifdef _WIN32
#include
#else
#include
#endif
参考这篇博文,下载getopt.h:
VS2019使用getopt及getopt_long
(1)C++安全版函数替换:原代码中的sprintf函数替换为sprintf_s
(2)access函数换为_access
具体参考:C语言中access/_access函数的使用
在main函数的文件中加入:
#include
流程:该图来自隐式证书的国密算法应用研究

使用前首先:


helloworld是项目名称
命令:pk_extract
参数:
-c:CA私钥文件路径
打印信息:
pk : ecqv_point_print_hex:048C04CD69D279FE0C70C935EF8912639B55CD04B35EB95E050106D8A63D4FDB5AEE7E23C1FC58AB15B10E45CB47DD6AC0DB21E911EC43CA98E6D83BDBF5848FF1 (CA公钥 16进制)
返回编码的八位字节字符串长度:65
print_64:BIwEzWnSef4McMk174kSY5tVzQSzXrleBQEG2KY9T9ta7n4jwfxYqxWxDkXLR91qwNsh6RHsQ8qY5tg72/WEj/E= (CA公钥 64编码)

命令:cert_request
-i:请求者标识
-k:请求者的私钥pem文件
打印信息:
ecqv_point_print_hex:041C425492866BDBCCF8278E86A3FB3C0FA8E9CF77E2FA84DA763C37FC138E5D35080D087994E646E6C9AE382E74F8A7F1FA9233919075EFC143AC6D5AD08D9915 (请求者公钥 16进制)
返回编码的八位字节字符串长度:65
print_64:BBxCVJKGa9vM+CeOhqP7PA+o6c934vqE2nY8N/wTjl01CA0IeZTmRubJrjgudPin8fqSM5GQde/BQ6xtWtCNmRU= (请求者公钥 base64)
命令:cert_generate
-i:用户A(请求者)标识
-r:请求者的公钥 base64
-k:CA的私钥pem文件

打印信息:
ca priv : ecqv_bn_print_hex:E874870671981832D2341B25A7DF9CC25DEA3971FEDF18A68D7FC20C1A4C5327 (CA的私钥 16进制)
R_u : ecqv_point_print_hex:041C425492866BDBCCF8278E86A3FB3C0FA8E9CF77E2FA84DA763C37FC138E5D35080D087994E646E6C9AE382E74F8A7F1FA9233919075EFC143AC6D5AD08D9915 (用户请求证书时生成的临时公钥 16进制)
P_u : ecqv_point_print_hex:04DA1E0CFFF9BD96B28280C24DC7D17D921AA7B167DE4C4E1C18120EEC11D1383C6DB090C26CD75B8119DA74E8711633EC6F0AF64103C5EC64A04569B6A7B0B458 (CA计算的公钥重构值 16进制)
r : ecqv_bn_print_hex:1C944A06107B1AED2ABAD458BDF594E1BB1DC72A4B179C219EE725C5F34A18A4 (CA计算的私钥重构值 16进制)
返回编码的八位字节字符串长度:65
print_64:BNoeDP/5vZaygoDCTcfRfZIap7Fn3kxOHBgSDuwR0Tg8bbCQwmzXW4EZ2nTocRYz7G8K9kEDxexkoEVptqewtFg= (CA计算的公钥重构值 base64编码)
ecqv_bn_print:HJRKBhB7Gu0qutRYvfWU4bsdxypLF5whnuclxfNKGKQ= (CA计算的私钥重构值 base64编码)
命令:cert_reception
-i:用户标识
-k:用户A私钥pem文件
-c:CA公钥 base64
-a:隐式证书 base64 该程序使用公钥重构值代替证书 并未生成证书
-r:CA计算的私钥重构值 base64


打印信息:
P_u : ecqv_point_print_hex:04DA1E0CFFF9BD96B28280C24DC7D17D921AA7B167DE4C4E1C18120EEC11D1383C6DB090C26CD75B8119DA74E8711633EC6F0AF64103C5EC64A04569B6A7B0B458 (公钥重构值打印)
r : ecqv_bn_print_hex:1C944A06107B1AED2ABAD458BDF594E1BB1DC72A4B179C219EE725C5F34A18A4 (私钥重构值打印)
Q_u : ecqv_point_print_hex:04961FF52E60DF6E7F51D54F63C8D3B10DBF07A25DA9074DAAD7B44327D9353257F56988CE9149BFB88BB49B509755276AEC77DA9DA1D3500F80DE77B72C0F724A (用户A最终的公钥 16进制)
返回编码的八位字节字符串长度:65
print_64:BJYf9S5g325/UdVPY8jTsQ2/B6JdqQdNqte0QyfZNTJX9WmIzpFJv7iLtJtQl1Unaux32p2h01APgN53tywPcko= (用户A最终的公钥 base64编码)
d_u : ecqv_bn_print_hex:15D538F8C3D483C8560F21AA77B6766068A81BFB9A6B14E33F77656324424D12 (用户A最终的私钥 16进制)
ecqv_bn_print:FdU4+MPUg8hWDyGqd7Z2YGioG/uaaxTjP3dlYyRCTRI= (用户A最终的私钥 base64 )
此步未显示验证失败, 说明验证成功 该程序使用公钥重构值代替了证书用于传递(从代码来看应该是这样)

命令:helloworld sign -m helloImA -k FdU4+MPUg8hWDyGqd7Z2YGioG/uaaxTjP3dlYyRCTRI=
-m:加密信息
-k:加密密钥(用户A私钥)

打印信息:
返回编码的八位字节字符串长度:65
print_64:BC/TgDj5Hu7ICr6eTBOpSFexTS8ujES3QglKCuLnSvEXWsN424tT5aiYJ/v5pzwt3xN2lJgdbZfCVmDe+vN3NKE= (签名生成的随机数)
ecqv_bn_print:P6odUt0YOwn+qQqRxsTWjEN8/C9/06TXVVmq/mMlo0k= (签名 64编码)
verify
-m 加密信息
-k 加密者的公钥(base64)
-v 签名生成的随机数
-s 签名(base64)

schnorr验证时比较两个EC_POINT,相等输出1(验证成功),不等输出0或者-1.
此博文用于记录ECQV-utils程序的调试使用过程,由于基础知识不足,如有错误,还请指正!