当前位置: 首页 > news >正文

openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程

文章目录

    • openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程
    • 概述
    • 笔记
    • 实验环境
    • 实验
    • 备注
    • END

openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程

概述

工程中要用到ECC加解密, 先去查了资料.
在网上能查到一些大佬们写的ECC加解密实现(基于openssl API), 不过写的都比较早. 仅仅作为参考.

openssl API并不向下兼容, 只要换了openssl版本, 大概率程序得改(改多该少的问题).
从网上找到的第三方代码, 大概率不能用(API的名字都不同). 而且网上能查到的实现, 都不说自己用的openssl具体版本.
如果要找到和自己openssl版本一致, 拿来就能用的代码, 只能看自己版本的openssl实现(包括apps/demo/openssl内部实现中调用的openssl API)

我是准备从openssl实现中移植(抄代码), 这个方法靠谱, 只要能找到代码, 都是官方原装实现(权威用法).
先用openssl命令行模拟了一次.
后续准备将openssl命令行实现单步调试一下, 将openssl API调用代码迁移到自己工程.

笔记

实验环境

win10x64最新版 + openssl3.2

实验

打开自己做的的openssl命令批处理(PATH变量包含了openssl/bin路径, 可以直接运行openssl命令)

进入实验目录

cd /d D:\my_dev\my_local_git_prj\study\openSSL\exp\exp019_ecc_enc_dec

建立2个用户

mkdir .\sender && mkdir .\receiver

sender/receiver两端必须采用相同的椭圆曲线, 否则ECC共享密钥推导不出来

切换到sender

cd .\sender

产生ecc私钥_sender

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

导出ecc公钥_sender 给receiver

openssl ec -in priv_key_s.pem -pubout -out ..\receiver\pub_key_s.pem

切换到receiver

cd ..\receiver

产生ecc私钥_receiver

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

导出ecc公钥_receiver 给sender

openssl ec -in priv_key_r.pem -pubout -out ..\sender\pub_key_r.pem

双方各自在自己的一边(物理隔离)单独推导出共享密钥

sender单独推导出共享密钥

cd ..\senderopenssl pkeyutl -derive -inkey priv_key_s.pem -peerkey pub_key_r.pem -out shared_key_s.sk

receiver单独推导出共享密钥

cd ..\receiver
openssl pkeyutl -derive -inkey priv_key_r.pem -peerkey pub_key_s.pem -out shared_key_r.sk

确认双方共享密钥是一把

fc /B .\shared_key_r.sk ..\sender\shared_key_s.sk

可以看到双方推导出的共享密钥是一把.

sender准备明文

cd ..\sender
echo msg from sender > pt.txt

制作会话密钥(每次会话都做新的会话密钥, AES256的密钥为32个字节)

openssl rand -hex 32 > session_key.sek 2>&1

查看会话密钥值, 后面对称加密时要用, 必须在命令行直接输入, 指定文件不好使.

more session_key.sek

e90b95cbcfa054d6ec2e8e2f3725254fd26096e8d50ee69550a14db32cffaa96

sender加密会话密钥

openssl enc -k file:shared_key_s.sk -e -in session_key.sek -out session_key.sek.enc

sender产生IV(AES对称加密要用, iv长度为16个字节)

openssl rand -hex 16 > session_iv.sek

查看IV值, 加密是要用

more session_iv.sek
0ffcf7d0b32a813ddc3ff63fdfb02b73
这个iv值用命令行AES加密时, 要在命令行直接输入, 指定文件不好使.

sender用会话密钥对称加密明文, 对称加密算法为aes-256-cbc(如果编程来加密, 可以选择更好的aes-256-gcm)

openssl enc -aes-256-cbc -K e90b95cbcfa054d6ec2e8e2f3725254fd26096e8d50ee69550a14db32cffaa96 -iv 0ffcf7d0b32a813ddc3ff63fdfb02b73 -e -in pt.txt -out pt.txt.enc

现在将session_key.sek.enc, session_iv.sek, pt.txt.enc 一次发给对方(其中iv不是机密数据, 直接给就行. 实际应用中, 这些数据合成一个大buffer, 直接甩给对方)

copy .\session_key.sek.enc ..\receiver\session_key.sek.enc
copy .\session_iv.sek ..\receiver\session_iv.sek
copy .\pt.txt.enc ..\receiver\pt.txt.enc

recevier操作

cd ..\receiver

从加密的会话密钥session_key.sek.enc中解密出会话密钥

openssl enc -k file:shared_key_r.sk -d -in session_key.sek.enc -out session_key.sek.enc.dec

确认解密的会话密钥和原始的会话密钥相同

fc .\session_key.sek.enc.dec ..\sender\session_key.sek

确认了现在解密出的会话密钥和加密时的会话密钥相同.

查看解密后的会话密钥

more .\session_key.sek.enc.dec
e90b95cbcfa054d6ec2e8e2f3725254fd26096e8d50ee69550a14db32cffaa96

查看发送者给的iv

more .\session_iv.sek
0ffcf7d0b32a813ddc3ff63fdfb02b73

用会话密钥解密明文

openssl enc -aes-256-cbc -K e90b95cbcfa054d6ec2e8e2f3725254fd26096e8d50ee69550a14db32cffaa96 -iv 0ffcf7d0b32a813ddc3ff63fdfb02b73 -d -in pt.txt.enc -out pt.txt.enc.dec

确认解密后的明文是否为原始明文

fc /B .\pt.txt.enc.dec ..\sender\pt.txt

可以确认解密后的明文就是原始明文

通讯过程结束

备注

知道怎么用openssl命令行来做ECC加解密, 那么就可以单步调试openssl.exe, 移植openssl.exe的实现(openssl API调用)到自己工程, 这个不难.

END

相关文章:

openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程

文章目录 openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程概述笔记实验环境实验备注END openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程 概述 工程中要用到ECC加解密, 先去查了资料. 在网上能查到一些大佬们写的ECC加解密实现(基于openssl API), 不…...

【Linux进阶之路】HTTP协议

文章目录 一、基本概念1.HTTP2.域名3.默认端口号4.URL 二、请求与响应1.抓包工具2.基本框架3.简易实现3.1 HttpServer3.2 HttpRequest3.2.1 version13.2.2 version23.2.3 version3 总结尾序 一、基本概念 常见的应用层协议: HTTPS (HyperText Transfer Protocol Sec…...

股市新手福音:河北源达“财源滚滚”让投资变得更简单

在浩渺的股市海洋中,每一位投资者都渴望找到一把能够指引航向的罗盘。尤其是对于股市新手来说,面对复杂的市场环境、纷繁的个股信息以及不断变化的投资策略,如何快速入门、精准选股,无疑是一大挑战。而河北源达信息技术股份有限公…...

2024.02.14 校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、校招&社招 | 中国电子信息产业集团有限公司校园招聘 校招&社招 | 中国电子信息产业集团有限公司校园招聘 2、校招&社招 | 中核光电2024年春季校园招聘开启! 校…...

5.Java并发编程—JUC线程池架构

JUC线程池架构 在Java开发中,线程的创建和销毁对系统性能有一定的开销,需要JVM和操作系统的配合完成大量的工作。 JVM对线程的创建和销毁: 线程的创建需要JVM分配内存、初始化线程栈和线程上下文等资源,这些操作会带来一定的时间和…...

llama2c(4)之forward、sample、decode

1、forward float* logits forward(transformer, token, pos); 输入transformer的参数,当前token,pos位置,预测出下一个token的预测值(用矩阵乘,加减乘除等运算构成Transformer) 其中,logits如…...

20240312-2-贪心算法

贪心算法 是每次只考虑当前最优,目标证明每次是考虑当前最优能够达到局部最优,这就是贪心的思想,一般情况下贪心和排序一起出现,都是先根据条件进行排序,之后基于贪心策略得到最优结果。 面试的时候面试官一般不会出贪…...

前端 --- HTML

1. HTML 结构 1.1 HTML 文件基本结构 <html><head><title>第一个html程序</title></head><body>hello world!</body> </html> html 标签是整个 html 文件的根标签(最顶层标签)head 标签中写页面的属性.body 标签中写的是页…...

curl c++ 实现HTTP GET和POST请求

环境配置 curl //DV2020T环境下此步骤可省略 https://curl.se/download/ 笔者安装为7.85.0版本 ./configure --without-ssl make sudo make install sudo rm /usr/local/lib/curl 系统也有curl库&#xff0c;为防止冲突&#xff0c;删去编译好的curl库。 对以json数据的解析使…...

12、设计模式之代理模式(Proxy)

一、什么是代理模式 代理模式属于结构型设计模式。为其他对象提供一种代理以控制对这个对象的访问。 在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作用。 二、分类 代理模式分为三类&#…...

springboot集成Quartz定时任务组件

文章目录 前言一、Quartz 是什么&#xff1f;下面是对 Java 中 Quartz 的主要概念的简单描述&#xff1a; 二、使用步骤总结 前言 平时开发中相信大家都经常用到定时任务吧&#xff0c;最近简单的就是直接使用Scheduled注解标注到方法上用注解的方式在项目运行时无法去对任务进…...

代码随想录算法训练营第38天—动态规划06 | ● 完全背包 ● *518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包 视频讲解&#xff1a;https://www.bilibili.com/video/BV1uK411o7c9 https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85.html 题目描述&#xff1a;有n件物品和一个最多能…...

C语言每日一题(63)复写零

题目链接 力扣网 1089 复写零 题目描述 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改&#xff0c;不…...

ElasticSearch聚合查询

数据准备 索引创建 PUT product {"mappings": {"properties": {"createtime": {"type": "date"},"desc": {"type": "text","fields": {"keyword": {"type": …...

【毕设级项目】基于AI技术的多功能消防机器人(完整工程资料源码)

基于AI技术的多功能消防机器人演示效果 竞赛-基于AI技术的多功能消防机器人视频演示 前言&#xff1a; 随着“自动化、智能化”成为数字时代发展的关键词&#xff0c;机器人逐步成为社会经济发展的重要主体之一&#xff0c;“机器换人”成为发展的全新趋势和时代潮流。在可预见…...

【一】【设计模式】类关系UML图

1. 继承&#xff08;Generalization&#xff09; 继承是对象间的一种层次关系&#xff0c;允许子类继承并扩展父类的功能。 UML线&#xff1a;带有空心箭头的直线&#xff0c;箭头指向基类&#xff08;父类&#xff09;。 class Parent {public void parentMethod() {System.…...

【DevOps基础篇】容器化架构基础设施监控方案

【DevOps基础篇】容器化架构基础设施监控方案 目录 【DevOps基础篇】容器化架构基础设施监控方案要监视什么不同监控系统方案比较1. Datadog2. Prometheus3. ELK(Elasticsearch、Logstash、Kibana)4. Sysdig5. 自行打造!如何选择总结推荐超级课程: Docker快速入门到精通 当…...

【QT】文件流操作(QTextStream/QDataStream)

文本流/数据流&#xff08;二级制格式&#xff09; 文本流 &#xff08;依赖平台&#xff0c;不同平台可能乱码&#xff09;涉及文件编码 #include <QTextStream>操作的都是基础数据类型&#xff1a;int float string //Image Qpoint QRect就不可以操作 需要下面的 …...

CentOS 7 devtoolset编译addressSanitizer版本失败的问题解决

在我的一个Cent OS7开发环境中&#xff0c;按https://yeyongjin.blog.csdn.net/article/details/134178420的方法升级GCC版本到8.3.1。 这两天&#xff0c;要用Google的addressSanitizer检验内存问题&#xff0c;加上编译参数后&#xff0c;却发现编译不通过。configure时直接退…...

ubuntu2004桌面系统英伟达显卡驱动安装方法

#如何查看显卡型号 lspci | grep -i vga#----output------ 01:00.0 VGA compatible controller: NVIDIA Corporation Device 1f06 (rev a1)根据 Device 后的 值 进入网站查询 pci-ids.ucw.cz/mods/PC/10de?actionhelp?helppci #根据显卡型号&#xff0c;下载对应系统的驱动…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...