• ECQV程序跑通笔记


    导师让跑一下ECQV的程序,从github上下了一个:
    链接: ecqv-utils
    本科是计算机专业,对网安方面了解甚少,刚开始看这个代码着实费劲(代码注释不太多),前前后后看了得有一星期,结合openssl中文文档以及论文《隐式证书的国密算法应用研究》做了些注释,今天跑通了,把遇到的问题和模拟ECQV过程用到的函数记录一下。

    无法打开源文件 unistd.h

    这个程序应当是原作者在linux下写的,windows下没有这个文件,windows中对应的是io.h,因此将原代码中的

    #include
    
    • 1

    改为:

    #ifdef _WIN32
    #include
    #else
    #include
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5

    无法打开源文件 getopt.h

    参考这篇博文,下载getopt.h:
    VS2019使用getopt及getopt_long

    下载openssl

    参考:在Windows下配置Openssl环境

    几个小问题

    (1)C++安全版函数替换:原代码中的sprintf函数替换为sprintf_s
    (2)access函数换为_access
    具体参考:C语言中access/_access函数的使用

    OPENSSL_Uplink(6219B000,08): no OPENSSL_Applink

    在main函数的文件中加入:

    #include 
    
    • 1

    函数使用

    流程:该图来自隐式证书的国密算法应用研究
    该图来自:隐式证书的国密算法应用研究

    使用前首先:
    在这里插入图片描述

    CA公钥生成

    在这里插入图片描述
    helloworld是项目名称

    命令:pk_extract
    参数:
    -c:CA私钥文件路径
    
    • 1
    • 2
    • 3

    打印信息:

    pk : ecqv_point_print_hex:048C04CD69D279FE0C70C935EF8912639B55CD04B35EB95E050106D8A63D4FDB5AEE7E23C1FC58AB15B10E45CB47DD6AC0DB21E911EC43CA98E6D83BDBF5848FF1  (CA公钥 16进制)
    返回编码的八位字节字符串长度:65
    print_64:BIwEzWnSef4McMk174kSY5tVzQSzXrleBQEG2KY9T9ta7n4jwfxYqxWxDkXLR91qwNsh6RHsQ8qY5tg72/WEj/E=  (CA公钥 64编码)
    
    • 1
    • 2
    • 3

    证书请求

    在这里插入图片描述

    命令:cert_request
    -i:请求者标识
    -k:请求者的私钥pem文件
    
    • 1
    • 2
    • 3

    打印信息:

    ecqv_point_print_hex:041C425492866BDBCCF8278E86A3FB3C0FA8E9CF77E2FA84DA763C37FC138E5D35080D087994E646E6C9AE382E74F8A7F1FA9233919075EFC143AC6D5AD08D9915 (请求者公钥 16进制)
    返回编码的八位字节字符串长度:65
    print_64:BBxCVJKGa9vM+CeOhqP7PA+o6c934vqE2nY8N/wTjl01CA0IeZTmRubJrjgudPin8fqSM5GQde/BQ6xtWtCNmRU=   (请求者公钥 base64)
    
    • 1
    • 2
    • 3

    生成证书

    命令:cert_generate
    -i:用户A(请求者)标识
    -r:请求者的公钥 base64
    -k:CA的私钥pem文件
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    打印信息:

    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编码)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    从证书中提取用户A真正的公钥和私钥

    命令:cert_reception
    -i:用户标识
    -k:用户A私钥pem文件
    -c:CA公钥 base64
    -a:隐式证书 base64 该程序使用公钥重构值代替证书 并未生成证书
    -r:CA计算的私钥重构值 base64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    在这里插入图片描述
    打印信息:

    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 )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    此步未显示验证失败, 说明验证成功 该程序使用公钥重构值代替了证书用于传递(从代码来看应该是这样)
    在这里插入图片描述

    签名

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

    在这里插入图片描述
    打印信息:

    返回编码的八位字节字符串长度:65
    print_64:BC/TgDj5Hu7ICr6eTBOpSFexTS8ujES3QglKCuLnSvEXWsN424tT5aiYJ/v5pzwt3xN2lJgdbZfCVmDe+vN3NKE=  (签名生成的随机数)
    ecqv_bn_print:P6odUt0YOwn+qQqRxsTWjEN8/C9/06TXVVmq/mMlo0k=  (签名 64编码)
    
    
    • 1
    • 2
    • 3
    • 4

    验证

    verify
    -m 加密信息
    -k 加密者的公钥(base64) 
    -v 签名生成的随机数 
    -s 签名(base64)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    schnorr验证时比较两个EC_POINT,相等输出1(验证成功),不等输出0或者-1.

    此博文用于记录ECQV-utils程序的调试使用过程,由于基础知识不足,如有错误,还请指正!

  • 相关阅读:
    多多表查询优化,逆向思维
    【BUG】vue中@change时间传值丢失问题
    DSPE-PEG-PDP,DSPE-PEG-OPSS,磷脂PEG衍生物试剂供应
    音频处理基础的一些笔记碎片
    Javascript 可选链
    机器人控制器编程实践指导书旧版-实践八 机器人综合设计
    爬虫项目(七):CSDN博客全部文章信息爬取
    私人服务器可以干嘛
    11.数据公式中使用2个 $$ a =b $$,是什么意思?
    9.项目细节调整
  • 原文地址:https://blog.csdn.net/qq_22494201/article/details/126850135