openssl3.2 - exp - generate ecc priv key

文章目录

    • openssl3.2 - exp - generate ecc priv key
    • 概述
    • 笔记
    • 备注
    • END

openssl3.2 - exp - generate ecc priv key

概述

前面实验已经将ECC加解密的流程用openssl命令模拟出来了.
现在开始将ECC加解密流程中的知识点从openssl.exe源码中迁移到自己工程.

先迁移了一个命令如下

openssl ecparam -name sect571r1 -genkey -noout -out priv_key_s.pem

封装了一个函数, 产生ecc密钥到buffer, 好使.

笔记

/*!
* \file exp020_ecc_gen_priv_key.cpp
* \note openssl3.2 - exp - generate ecc priv key产生ECC私钥单步调试, 移植openssl命令行的实现openssl ecparam -name sect571r1 -genkey -noout -out priv_key_s.pem
*/#include "my_openSSL_lib.h"
#include <openssl/crypto.h>
#include <openssl/bio.h>
#include <openssl/params.h>
#include <openssl/core_names.h>
#include <openssl/evp.h>
#include <openssl/encoder.h>#include <stdlib.h>
#include <stdio.h>
#include <assert.h>#include "CMemHookRec.h"void my_openssl_app();
bool my_ecc_gen_priv_key(const char* keytype, const char* curve_name, const char* out_format, unsigned char*& pdata, size_t& data_len);int main(int argc, char** argv)
{setvbuf(stdout, NULL, _IONBF, 0); // 清掉stdout缓存, 防止调用printf时阻塞mem_hook();my_openssl_app();mem_unhook();/*! run resultec priv key:0000 - 2d 2d 2d 2d 2d 42 45 47-49 4e 20 45 43 20 50 52   -----BEGIN EC PR0010 - 49 56 41 54 45 20 4b 45-59 2d 2d 2d 2d 2d 0a 4d   IVATE KEY-----.M0020 - 49 48 75 41 67 45 42 42-45 67 43 53 4d 2f 56 6a   IHuAgEBBEgCSM/Vj// ...0160 - 2b 31 64 0a 58 41 3d 3d-0a 2d 2d 2d 2d 2d 45 4e   +1d.XA==.-----EN0170 - 44 20 45 43 20 50 52 49-56 41 54 45 20 4b 45 59   D EC PRIVATE KEY0180 - 2d 2d 2d 2d 2d 0a                                 -----.free map, g_mem_hook_map.size() = 0*/return 0;
}void my_openssl_app()
{bool b_rc = false;unsigned char* pdata = NULL;size_t data_len = 0;b_rc = my_ecc_gen_priv_key("ec", "sect571r1", "PEM", pdata, data_len);assert(b_rc);printf("ec priv key:\n");BIO_dump_fp(stdout, pdata, data_len);if (NULL != pdata){OPENSSL_free(pdata);pdata = NULL;}
}bool my_ecc_gen_priv_key(const char* keytype, const char* curve_name, const char* out_format, unsigned char*& pdata, size_t& data_len)
{// openssl ecparam -name sect571r1 -genkey -noout -out priv_key_s.pembool b_rc = false;OSSL_PARAM _ossl_param_ary[2];EVP_PKEY_CTX* _evp_pkey_ctx_key_type = NULL;EVP_PKEY* _evp_pkey_key_type = NULL;EVP_PKEY_CTX* _evp_pkey_ctx_key = NULL;OSSL_ENCODER_CTX* _ossl_encoder_ctx = NULL;OSSL_LIB_CTX* _ossl_lib_ctx = NULL;EVP_PKEY* _evp_pkey = NULL;do {_ossl_lib_ctx = OSSL_LIB_CTX_new();if (NULL == _ossl_lib_ctx){break;}_evp_pkey_ctx_key_type = EVP_PKEY_CTX_new_from_name(_ossl_lib_ctx, keytype, NULL);if (NULL == _evp_pkey_ctx_key_type){break;}if (EVP_PKEY_keygen_init(_evp_pkey_ctx_key_type) <= 0){break;}_ossl_param_ary[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME, (char*)curve_name, 0);_ossl_param_ary[1] = OSSL_PARAM_construct_end();if (EVP_PKEY_CTX_set_params(_evp_pkey_ctx_key_type, _ossl_param_ary) <= 0){break;}if (EVP_PKEY_keygen(_evp_pkey_ctx_key_type, &_evp_pkey_key_type) <= 0){break;}_evp_pkey_ctx_key = EVP_PKEY_CTX_new_from_pkey(_ossl_lib_ctx, _evp_pkey_key_type, NULL);if (NULL == _evp_pkey_ctx_key){break;}if (EVP_PKEY_keygen_init(_evp_pkey_ctx_key) <= 0){break;}if (EVP_PKEY_keygen(_evp_pkey_ctx_key, &_evp_pkey) <= 0){break;}_ossl_encoder_ctx = OSSL_ENCODER_CTX_new_for_pkey(_evp_pkey, OSSL_KEYMGMT_SELECT_ALL, out_format, NULL, NULL);if (NULL == _ossl_encoder_ctx){break;}/*int OSSL_ENCODER_to_data(OSSL_ENCODER_CTX *ctx, unsigned char **pdata, size_t *pdata_len);, unsigned char*& pdata, size_t& data_len*/if (1 != OSSL_ENCODER_to_data(_ossl_encoder_ctx, &pdata, &data_len)){break;}b_rc = true;} while (false);if (NULL != _ossl_encoder_ctx){OSSL_ENCODER_CTX_free(_ossl_encoder_ctx);_ossl_encoder_ctx = NULL;}if (NULL != _evp_pkey){EVP_PKEY_free(_evp_pkey);_evp_pkey = NULL;}if (NULL != _evp_pkey_key_type){EVP_PKEY_free(_evp_pkey_key_type);}if (NULL != _evp_pkey_ctx_key_type){EVP_PKEY_CTX_free(_evp_pkey_ctx_key_type);_evp_pkey_ctx_key_type = NULL;}if (NULL != _evp_pkey_ctx_key){EVP_PKEY_CTX_free(_evp_pkey_ctx_key);_evp_pkey_ctx_key = NULL;}if (NULL != _ossl_lib_ctx){OSSL_LIB_CTX_free(_ossl_lib_ctx);_ossl_lib_ctx = NULL;}return b_rc;
}

备注

在网上查的资料, 大概只能参考一下思路. 想找和自己想的一模一样的东西基本不可能.
还是有了思路, 自己从官方实现(权威, 质量有保证)中移植(扒代码)爽.

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法-贪心-XMUOJ圣遗物的强化

题目 思路 贪心 - OI Wiki (oi-wiki.org) 贪心算法&#xff08;greedy algorithm&#xff0c;又称贪婪算法&#xff09;详解&#xff08;附例题&#xff09;-CSDN博客 代码 Python暴力排序 def min_mora_cost(n, levels):levels.sort() # 对圣遗物等级进行升序排序total_…

python数据类型 -- 元组Tuple

你好, 我是木木, 目前正在做两件事   1. 沉淀自己的专业知识   2. 探索了解各种副业项目&#xff0c;同时将探索过程进行分享&#xff0c;帮助自己以及更多朋友找到副业, 做好副业 文末有惊喜 在Python中&#xff0c;元组&#xff08;tuple&#xff09;是一种不可变序列类型&…

PostgreSQL 高可用安装部署

文章目录 一、概述1.PostgreSQL高可用2.Patroni 二、PostgreSQL高可用部署1.安装简介2.安装准备3.安装ETCD4.安装PostgreSQL5.安装Patroni6.安装haproxy7.安装keepalived8.测试 开源中间件 # PostgreSQLhttps://iothub.org.cn/docs/middleware/ https://iothub.org.cn/docs/mi…

vue触发真实的点击 事件 跟用户行为一致

<template><div><button ref"myButton" click"handleClick">按钮</button></div> </template><script> export default {methods: {handleClick() {const button this.$refs.myButton;// 创建一个鼠标点击事件…

Python基础快速入门

Python基础快速入门 前置知识 Python Python是一种广泛使用的高级编程语言&#xff0c;以其易于学习和使用的语法而闻名。以下是Python的一些主要特点&#xff1a; 高级语言&#xff1a;Python是一种高级语言&#xff0c;这意味着它提供了较高层次的抽象&#xff0c;使编程更…

什么是设计模式,举例说明Python中的常见设计模式

什么是设计模式&#xff0c;举例说明Python中的常见设计模式 设计模式是一种在软件设计中对常见问题的通用解决方案。它们是在软件开发中积累的宝贵经验&#xff0c;可以帮助开发者更快速、更高效地编写高质量、可维护的代码。设计模式通常包含一些类和接口&#xff0c;以及它…

排序算法的对比

类别排序方法时间复杂度空间复杂度稳定性平均情况最好的情况最坏的情况 插入 排序 插入排序稳定希尔排序不稳定 选择 排序 选择排序不稳定堆排序不稳定 交换 排序 冒泡排序稳定快速排序不稳定归并排序稳定基数排序稳定

git for windows

记录&#xff0c;git svn混用&#xff0c;检出代码时出错及解决方案&#xff0c; 执行命令&#xff1a; git svn clone svn_project_url 报错&#xff1a; certificate problem.(R)eject,accept (t)emporarily or accept (p)ermanently 解决&#xff1a; 在弹框中 输入P …

记录一个编译的LLVM 含clang 和 PTX 来支持 HIPIFY 的构建配置

llvm 18 debug 版本 build llvmorg-18.1rc4 debug $ cd llvm-project $ git checkout llvmorg-18.1.0-rc4 $ mkdir build_d $ cd build_d $ mkdir -p ../../local_d cmake \ -DCMAKE_INSTALL_PREFIX../../local_d \ -DLLVM_SOURCE_DIR../llvm \ -DLLVM_ENABLE_PROJECTS&…

平台工程:构建企业数字化转型的基石

有人说&#xff0c;平台工程&#xff08;Platform Engineering&#xff09;&#xff0c;不过是新瓶装旧酒&#xff08;DevOps&#xff09;。 而Gartner 将平台工程列为 2024 顶级战略技术趋势之一。我国信通院也开始陆续制定与平台工程相关的技术标准。 随着数字化浪潮的席卷…

【LV15 day10 信号量 互斥锁】

一、信号量&#xff1a;基于阻塞的并发控制机制 a.定义信号量 struct semaphore sem; b.初始化信号量 void sema_init(struct semaphore *sem, int val); c.获得信号量P int down(struct semaphore *sem);//深度睡眠 int down_interruptible(struct semaphore *sem);//浅度…

【数学】【网格】【状态压缩】782 变为棋盘

作者推荐 视频算法专题 本文涉及知识点 数学 网格 状态压缩 LeetCode:782 变为棋盘 一个 n x n 的二维网络 board 仅由 0 和 1 组成 。每次移动&#xff0c;你能任意交换两列或是两行的位置。 返回 将这个矩阵变为 “棋盘” 所需的最小移动次数 。如果不存在可行的变换&am…

Git是一个分布式版本控制系统 一.2

Git是一个分布式版本控制系统&#xff0c;用于跟踪和管理代码的变化。它最初由Linus Torvalds于2005年创建&#xff0c;并成为开源社区中最流行的版本控制系统之一。 Git的主要特点包括&#xff1a; 分布式&#xff1a;每个开发者都可以在本地拥有完整的代码仓库&#xff0c;并…

day08_Mybatis

文章目录 前言一、快速入门1.1 入门程序分析1.2 入门程序实现1.2.1 准备工作1.2.1.1 创建springboot工程1.2.1.2 数据准备 1.2.2 配置Mybatis1.2.3 编写SQL语句1.2.4 单元测试1.3 解决SQL警告与提示 二、JDBC介绍2.1 介绍2.2 代码2.3 问题分析2.4 技术对比 三、数据库连接池3.1…

c语言经典测试题12

1.题1 float f[10]; // 假设这里有对f进行初始化的代码 for(int i 0; i < 10;) { if(f[i] 0) break; } 上述代码有那些缺陷&#xff08;&#xff09; A: for(int i 0; i < 10;)这一行写错了 B: f是float型数据直接做相等判断有风险 C: f[i]应该是f[i] D: 没有缺…

CentOS 7 基于官方源码制作openssh 9.7p1 rpm包(without ssl)—— 筑梦之路

2024年3月11日&#xff0c;openssh 发布9.7 p1版本&#xff0c;这里在centos7 x86_64系统上来进行制作适用于centos 7 redhat 7 x86_64操作系统的openssh 9.7版本rpm包。 特别说明&#xff1a;9.6版本以后官方不再使用openssl&#xff0c;因此安装后ssh -V 查看会显示without …

各种环境下载链接

多环境镜像站 https://developer.aliyun.com/mirror/?spma2c6h.25603864.0.0.75fb4dda6bhioC http://mirrors.163.com/ http://mirrors.ustc.edu.cn/ http://mirrors.zju.edu.cn/ debeaver https://dbeaver.io/download/ mysql https://downloads.mysql.com/archives/comm…

【YOLOv8模型网络结构图理解】

YOLOv8模型网络结构图理解 1 YOLOv8的yaml配置文件2 YOLOv8网络结构2.1 Conv2.2 C3与C2f2.3 SPPF2.4 Upsample2.5 Detect层 1 YOLOv8的yaml配置文件 YOLOv8的配置文件定义了模型的关键参数和结构&#xff0c;包括类别数、模型尺寸、骨干&#xff08;backbone&#xff09;和头部…

谷歌seo外链重要还是内容重要?

想做网站&#xff0c;内容跟外链缺一不可&#xff0c;如果真的要说哪个更重要&#xff0c;那内容依旧是网站的核心&#xff0c;而外链则是额外的加分项 内容永远是王道&#xff0c;不管谷歌seo的算法怎么变&#xff0c;只要你的内容没问题&#xff0c;那就肯定不会牵扯到你的网…

【蓝桥杯】分糖果(DFS)

问题描述 两种糖果分别有 9个和 16 个&#xff0c;要全部分给 7 个小朋友&#xff0c;每个小朋友得到的糖果总数最少为 2个最多为 5 个&#xff0c;问有多少种不同的分法。糖果必须全部分完。 只要有其中一个小朋友在两种方案中分到的糖果不完全相同&#xff0c;这两种方案就…