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

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

看了资料, 当双方各自独自推导出共享密钥后, 密钥交换就完成了.
下面就是拿共享密钥去对称加解密. 直到本次通讯结束.
当新的通讯开始时, 为了保证前向安全性, 还需要进行新的ECDH, 用来保证每次通讯的共享密钥不一样

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

单步调试了, 上面这个命令并不能加密会话密钥, 只是将会话密钥原样输出到session_key.sek.enc.
原因是没有指定加密算法.
但是这里要用指定的EC算法, 而不是对称加密.
@todo 在研究这块.

双方生成自己的ECC私钥/公钥, 然后将自己的公钥给对方, 然后双方从自己的私钥和对方公钥推导出共享密钥, 这是ECDH(ECC的密钥交换算法), 需要每次通讯都生成新的ECC密钥对才安全, 保证了通讯的前向安全性.

对于离线应用, 一次ECDH过程相当于发放一次授权文件. 来保证授权文件的共享密钥每次都不同(前向安全性).
服务端对参数文件对称加密用的密钥为(ECC共享密钥加密客户端指纹, 然后做摘要为适合对称加密算法长度的MD), 用这个MD去加密客户端应用要用到的参数文件. 这样安全. 可以保证用客户端指纹来控制客户端的模块功能数量.

ECDH保证的是通讯过程中的密钥安全交换.
不过说到底, 离线应用和在线应用(TLS)还是不一样的, 离线应用如果被用户逆向的改掉(使用正版用户才能看到的参数), 甩掉参数文件, 还是防不住的. 最终还是防不住正版用户.

防止用户在客户端来改程序的2进制内容, 那是另外的思路了.

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

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

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

相关文章

可视化图表:南丁格尔玫瑰图,来自历史上最著名的护士。

Hi,我是贝格前端工场的老司机,本文分享可视化图表设计的南丁格尔玫瑰图设计,欢迎老铁持续关注我们。 一、南丁格尔与玫瑰图 南丁格尔(Florence Nightingale,1820年-1910年)是一位英国护士和统计学家&…

按位操作符详解

大家好啊,我是情谊,今天我们来讨论一下按位操作符的知识点与应用,按位操作符有时候在解决一些问题的时候可以提供一个很好的解题思路,话不多说,我们直接来看! 今天我们主要是从两个方面来讲述一下按位操作…

突破编程_C++_C++11新特性(智能指针shared_ptr与weak_ptr)

1 std::shared_ptr 的概述 std::shared_ptr 是 C11 标准库中引入的一种智能指针,用于表示共享所有权的智能指针。它允许多个 shared_ptr 实例共享同一个对象的所有权,并在最后一个引用该对象的 shared_ptr 被销毁或被重置时自动删除该对象。这种特性使得…

Redis:使用redis-dump导出、导入、还原数据实例

redis的备份和还原,借助了第三方的工具,redis-dump 1、安装必要环境 yum -y install zlib-devel openssl-devel2、安装redis-dump 安装ruby: ruby下载地址:https://www.ruby-lang.org/zh_cn/downloads/ 我下载的是 2.5.0 版本…

2024(最新)前端面試題----歡迎補充

HTML、css相關。 HTML5新特性 1、增强了表单,input新增了一些type:color----定义调色板tel-----定义包含电话号码的输入域email—定义包含email地址的输入域search–定义2、搜索域number–定义包含数值的输入域date----定义选取日、月、年的输入域 3、Vi…

Elasticsearch(11) intervals的使用

elasticsearch version 7.10.1 在Elasticsearch中,intervals查询是用来做复杂的区间表达式匹配的,它可以基于分析过的文本字段执行一系列复杂的关系运算。intervals查询特别适合于那些需要对文本数据进行模式匹配,而不只是单一词汇匹配的情况…

动态规划课堂6-----回文串问题

目录 引言: 例题1:回文子串 例题2:回文串分割IV 例题3:分割回文串II 例题4:最长回文子序列 例题5:让字符串成为回文串的最小插入次数 引言: 回文字符串 是正着读和倒过来读一样的字符串。…

【周赛】第385场周赛

🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 【1】100212.统计前后缀下标对 100212. 统计前后缀下标对 Ihttps://leetcode.cn/problems/count-prefix-and-suffix-pairs-i/ 熟…

4.1_4 文件的物理结构

文章目录 4.1_4 文件的物理结构(一)文件块、磁盘块(二)文件分配方式——连续分配(三)文件分配方式——链接分配(1)链接分配——隐式链接(2)链接分配——显式链…

OpenStack之存储cinder

一、 存储 1、DAS 1)存储更多的依赖服务器主机操作系统进行数据的IO读写和存储维护管理,数据备份和恢复要求占用服务器主机资源(包括CPU、系统IO等) 2)直连式存储与服务器主机之间的连接通道通常采用SCSI连接,随着服务器CPU的处…

Type-C接口介绍

1、USB介绍 (1)标准USB A型连接器(左)及B型连接器(右) 引脚1 VCC(5V) 引脚2 Data- 引脚3 Data 引脚4 接地 (2)Micro USB 引脚定义及OTG (USB-HOST) …

QT 多线程使用以及注意事项

Qt 是一个跨平台的 C 应用程序开发框架,提供了丰富的库和工具,用于开发图形用户界面、网络应用、数据库应用等。Qt 中的多线程支持使得开发者可以方便地在应用程序中实现并发执行的功能。 以下是一个简单的使用 Qt 多线程的代码例程: #inclu…

单片机实践:开发板上运行AES128防盗算法

本章内容主要是在开发板上运行AES128防盗算法,并且通过串口调试助手观测防盗算法加密后的值以及解密后的值,判断防盗算法是否在开发板上正确运行。 1,防盗算法 以下为AES128防盗算法源码: aes.h文件源码 #ifndef _AES_H_ #def…

mvcc介绍

前提:在介绍mvcc之前,先简单介绍一下mysql事务的相关问题,mvcc归根结底是用来解决事务并发问题的,当然这个解决不是全部解决,只是解决了其中的一部分问题! mysql事务 一、事务的基本要素(ACID&a…

k8s CKA upgrade - Kubeadm 版本升级实测

升级版本最好是逐步去升级,不要跨越多个大版本,可能会出错 大体流程: 1.先确定升级版本 2.升级kubeadm 3.驱逐节点 4.升级kubelet和kubectl 5.重启kubelet服务 6.恢复节点,使其上线 1.查看现版本:升级版本 kubectl ge…

python从入门到精通(十五):python爬虫完整学习大纲

一、基础知识 爬虫的基本概念和工作原理。 HTTP 协议和网页结构。 Python 爬虫开发的基础库,如 requests、BeautifulSoup 等。 常见的反爬虫机制和应对方法。 二、爬虫逆向的技术 代理服务器和 IP 封锁突破。 用户代理和请求头模拟。 JavaScript 解析和执行。 验证码…

华为配置Hotspot2.0无线网络示例

配置Hotspot2.0无线网络示例 组网图形 图1 配置Hotspot2.0无线网络组网图 组网需求配置思路配置注意事项操作步骤配置文件 组网需求 某网络服务商在原有移动网络业务的基础上,新增部署WLAN网络接入业务,为用户提供更好的网络体验。但传统的WLAN网络业…

React/RN组件避免重复渲染的一些技巧

组件基础 回顾下React中创建组件的几种方式: ES5的React.createClass方式ES6的React.Component方式无状态的函数组件方式带hooks的函数组件方式 这里我们只讨论Component和函数组件。我们知道Component是否发生重渲染是由shouldComponentUpdate决定的,…

【每日一题】2024年3月汇编(上)

3.1【2369】检查数组是否存在有效划分 2369. 检查数组是否存在有效划分https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/ 1.这样的判断可以用动态规划来解决,用一个长度为(n1) 的数组来记录 是否存在有效划分,dp[i]…

乘法-逆矩阵

文章目录 1. 矩阵相乘-4种方式1.1 CAB1.2 AX 列组合1.3 XB 行组合 2. A,AB, A T A^T AT的逆3. 高斯消元法求 A − 1 A^{-1} A−1 1. 矩阵相乘-4种方式 1.1 CAB 假设我们要求得矩阵CAB ,可以用如下公式表示 c i j ∑ k 1 N a i k b k j (1) c_{ij}\sum_{k1}^Na_…