【密码学】六、公钥密码

公钥密码

  • 1、概述
    • 1.1设计要求
    • 1.2单向函数和单向陷门函数
  • 2、RSA公钥密码体制
    • 2.1加解密
    • 2.2安全性分析
  • 3、ElGamal公钥密码体制
    • 3.1加解密算法
    • 3.2安全性分析
  • 4、椭圆曲线
    • 4.1椭圆曲线上的运算
    • 4.2ECC
  • 5、SM2公钥密码体制
    • 5.1参数选取
    • 5.2密钥派生函数
    • 5.3加解密过程
      • 5.3.1初始化
      • 5.3.2加密过程
      • 5.3.3解密过程

公钥密码体制的出现是迄今为止密码学发展史上一次最伟大的革命。
在公钥密码体制中有公钥(用于加密或验证签名)和私钥(用于解密或签名)之分,且公钥是公开的,通信双方不需要利用秘密信道就可以进行加密通信。
在公钥密码之前的密码都是基于代换和置换两个基本方法实现的,而公钥密码体制是采用的数学函数。
在对称密码体制中,密钥的分配、管理不方便,密钥量很大。

1、概述

1.1设计要求

密钥对(pk,sk),pk是公钥,sk是私钥。
使用公钥进行加密,使用私钥进行解密。
①产生密钥对的计算是容易的;加解密的计算是容易的;
②不能通过pk计算出sk;不能通过密文和公钥恢复出明文;
③加解密的次序可换。

1.2单向函数和单向陷门函数

单向函数
已知X求Y很简单,但是已知Y求X很难;
单向陷门函数
已知X求Y很简单,在参数t未知的情况下,已知Y求X很难,但是t已知的情况下,已知Y求X很简单。
单向陷门的例子:大素数相乘比因式分解容易;函数求导很容易但是求积分有可能很困难。

2、RSA公钥密码体制

RSA的基础是数论的欧拉定理,它的安全性依赖于大整数因子分解的困难性。RSA既可以用于加密,也可以用于数字签名,具有安全、易懂、易实现等特点。

2.1加解密

①选取两个不同的大素数p,q
②计算n=pq,r(n)=(p-1)(q-1),其中r(n)是n的欧拉函数
③随机选取整数e作为公钥,满足gcd(e,r(n))=1
④采用欧几里得算法计算私钥d,使得ed=1(modr(n)),即d=e-1(modr(n))
⑤加密函数:E(m)≡me(mod n)
⑥解密函数:D©≡cd(mod n)

2.2安全性分析

大因子分解很难;
侧信道安全性分析也称为信息泄露攻击,分为能量分析攻击、计时攻击、错误分析攻击。

3、ElGamal公钥密码体制

是基于离散对数问题且主要为数字签名的目的而设计,是继RSA之后最著名的数字签名方案。

3.1加解密算法

参数p是一个素数,g是Z*p上的一个生成元。
密钥生成,a∈(1,p-1),b=ga mod p,那么私钥为a,公钥为(p,g,b)
加密过程:任意选择随机数k∈(1,p-1),计算r=gk mod p和 t= mbk mod p,得到密文c=(r,t)
解密过程:计算r-a t = (gk)-at = m mod p =m,得以得到明文m

3.2安全性分析

算法的安全性是基于离散对数问题,求解离散对数问题的攻击算法有:Shanks算法、指标计算法、Pohlig-Hellman算法

4、椭圆曲线

研究学者将椭圆曲线引入密码学,提出了基于有限域GF§的椭圆曲线上的点集构成群,在这个群上定义了离散对数系统并构造出基于离散对数的一类公钥密码体制,即基于椭圆曲线的公钥密码体制,其安全性基于椭圆曲线上离散对数问题求解的困难性
椭圆曲线是指由三次平滑代数平面曲线,可以表达为
E: y2+axy+by = x3+cx2+dx+e
其中a b c d e属于F,椭圆曲线是其上所有的点外加一个无限远点O(O不在椭圆曲线上)

通过坐标变换,可以简化称E:y2 = x3+ax+b

4.1椭圆曲线上的运算

⊕的运算如下:
①O⊕O=O;O是椭圆曲线的无穷远点
②P⊕O=P
③若P=(x,y),则P⊕(-P)=O,即P的逆-P=(x,-y)
④若P=(x1,y1),Q=(x2,y2),则R=P⊕Q=(x3,y3)
公式
⑤满足加法交换律,P⊕Q=Q⊕P
⑥满足假发结合律,(P⊕Q)⊕R=P⊕(Q⊕R)

kP=P⊕P⊕P…P⊕P k个P相加
(s+t)P=sP⊕+tP

椭圆曲线的阶是椭圆曲线中元素的个数

4.2ECC

设E是有限域GF(pm)或GF§上的椭圆曲线,其中p是素数,m是正整数,已知E对运算⊕构成一个群,ECC椭圆曲线公钥密码体制包括三个过程:选取参数、加密过程和解密过程
选取参数:选取椭圆曲线E(a,b),取其生成元G,任意选取x∈(1,ord(G))为私钥,Y=xG为公钥
加密过程:任意选取k,密文为c=(c1,c2),其中c1=kG,c2=M⊕kY
解密过程:c2-xc1=M,其中-为⊕的逆过程

5、SM2公钥密码体制

SM2是一种椭圆曲线公钥密码算法,密钥长度是256bit。SM2算法有基于素域和二元扩域的椭圆曲线。

5.1参数选取

p:有限域F( p )中元素的数目,越大越安全,但是会变慢
a,b:是方程中的系数,取值于F( p )
G:是基点
n:是点G的阶,大素数,应当尽可能大
h:是椭圆曲线上点的个数N除以n的结果,也称为余因子

5.2密钥派生函数

密钥派生函数的作用是从一个共享的秘密比特串中派生出密钥数据,需要调用杂凑函数,杂凑函数的输出比特长度为v
在SM2中,密钥派生函数是通过输入比特串Z=x2||y2和整数len,从而得到一个长度为len的比特串。

5.3加解密过程

5.3.1初始化

A->B发送数据,先选取椭圆曲线,后产生B的私钥dB和对应的公钥PB

5.3.2加密过程

发送消息为M,长度为len,则A需要:
①产生随机数k∈[1,n-1],其中n是椭圆曲线基点G的阶次
②计算椭圆曲线点C1=[k]G=(x1,y1)
③计算椭圆曲线上的点S=[h]PB
④计算椭圆曲线点[k]PB=(x2,y2)
⑤计算t=KDF(x2||y2,len)
⑥计算C2=M⊕t
⑦计算C3=Hash(x2||M||y2)
⑧输出密钥C=C1 || C2 || C3

5.3.3解密过程

①从C中取出C1,验证C1是否满足椭圆曲线方程,不满足就解密错误
②计算S=[h]C1,S若为无穷远点则解密错误
③计算[dB]C1=(x2,y2)
④计算t=KDF(x2 || y2,len),若t是全0比特串则解密错误
⑤从C中取出C2,计算M’ = C2⊕t
计算u=hash(x2 ||M’ ||y2),从C中取出C3,若u≠C3则解密错误
⑥M’就是解密后的明文

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

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

相关文章

ThinkPHP6企业OA办公系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP6企业OA办公系统 一 介绍 勾股OA基于ThinkPHP6开发,前端Layui,数据库mysql,是一款实用的企业办公系统。可多角色登录,集成了系统设置、人事管理、消息管理、审批管理、日常办公、客户…

pytest 用例运行方式

一、命令行方式运行 执行某个目录下所有的用例,符合规范的所有用例 进入到对应的目录,直接执行pytest; 例如需要执行testcases 下的所有用例; 可以进入testcases 目录; 然后执行pytest 进入对应目录的上级目录,执行pytest 目录名称/ ; ; 例如需要执行testcases 下…

【Android】在Windows11系统上运行VisualStudioEmulator forAndroid

这是一个x86架构处理器的安卓模拟器, 在Visual Studio开发工具上用的,也是运行在Hyper-V虚拟机上的,相比其它的模拟器的性能好,占用磁盘空间小,操作简洁方便,非常适合开发人员调试安卓手机模拟。 安装 首…

K8S系列文章之 Traefik快速入门

traefik 与 nginx 一样,是一款优秀的反向代理工具,或者叫 Edge Router。至于使用它的原因则基于以下几点 无须重启即可更新配置自动的服务发现与负载均衡与 docker 的完美集成,基于 container label 的配置漂亮的 dashboard 界面metrics 的支…

要实现智能制造到底有多难?先看看这一步...

是新朋友吗?记得先点上方蓝字关注Ruff 智能制造、数字化转型,已成为当下制造业最炙手可热的话题,政府工作报告中已多次提到,为了促进数字经济发展,加强数字中国建设整体布局,打造智能工厂、智慧工厂。愿景是…

论文阅读---《Unsupervised Transformer-Based Anomaly Detection in ECG Signals》

题目:基于Transformer的无监督心电图(ECG)信号异常检测 摘要 异常检测是数据处理中的一个基本问题,它涉及到医疗感知数据中的不同问题。技术的进步使得收集大规模和高度变异的时间序列数据变得更加容易,然而&#xff…

SEO搜索引擎优化

目录 场景 内部业务To B (Business-to-Business,B2B)需要降低SEO,反爬 客户业务To C (Business-to-Consumer,B2C)需要提高SEO TDK优化 Title(标题) Description(描述) Keywords&#xff…

matplotlib 笔记 plt.grid

用于添加网格线 主要参数 visible 布尔值,True表示画网格 which表示要显示的刻度线类型,可以是 major(主刻度)或 minor(次刻度),或者同时显示(both)alpha 透明度 …

Effective Java笔记(27)消除非受检的警告

用泛型编程时会遇到讲多编译器警告 : 非受检转换警告( unchecked cast warning )、非受检方法调用警告、非受检参数化可变参数类型警告( unchecked parameterized vararg type warning),以及非受检转换警告…

【Pyhthon实战】Python对全校电费查询采集并可视化分析

前言 今天,我来说说怎么抓取宿舍电费的过程。我们学校是在完美校园交电费的,我们可以不用取抓包完美校园的数据接口,我们可以直接登录学校的一卡通网站,每个学校都有,大家可以自己找找,这里我为什么要抓包呢,因为学校提供的网站已经打不开了,这里就不介绍怎么抓包了。 …

9篇论文速览 ICML 2023 测试时自适应(TTA)最新研究进展

测试时自适应对于领域转移下真实机器感知应用的成功至关重要,近年来,研究者们仍然在不断优化现有的方法。在今年的ICML中,TTA相关的研究也有了最新进展。 1.Uncovering Adversarial Risks of Test-Time Adaptation 标题:揭示测试…

Java 常用编辑器 IntelliJ IDEA

文章目录 IDEA 概述IDEA 下载和安装IDEA 中的第一个代码IDEA 的项目和模块操作(一)类的操作(二)模块的操作(三)项目的操作 IDEA 概述 IntelliJ IDEA是一款由JetBrains开发的集成开发环境(IDE&am…

git【潦草学习】

初始配置git 查询版本号 初次使用git前配置用户名与邮箱地址 git config --global user.name "your name" git config --global user.email "your email" git config -l 发现最后两行多出了用户名和邮箱,说明配置成功

玩机搞机---安卓新机型payload.bin刷写救砖 无需专用线刷包

目前的新机型官方卡刷包解包后都是payload.bin分区格式的卡刷固件。而有个别一些机型没有线刷包,当这些机型出现系统问题的时候有以下几种方法参考救砖。遇到类似故障的朋友可以借鉴参考下. 其中的不足和相关的资源可以参考这两个博文。任何教程的目的只是拓展你的…

多个配置WebMvcConfigurationSupport失效问题

最近在项目中用类继承WebMvcConfigurationSupport实现拦截器 Configuration RequiredArgsConstructor public class SpringWebSupport extends WebMvcConfigurationSupport {private final ProjectInterceptor projectInterceptor;// 拦截器 //设置拦截器对象和拦截请求Ove…

【广州华锐视点】VR燃气轮机故障判断模拟演练系统

VR燃气轮机故障判断模拟演练系统由广州华锐视点开发,是一款基于虚拟现实技术的教育工具,旨在为学生提供一个安全、高效、互动的学习环境,帮助他们更好地掌握燃气轮机的故障诊断技能。 这款VR实训软件能够模拟真实的燃气轮机故障诊断场景&…

章节4:JavaScript操作Cookie

章节4:JavaScript操作Cookie 直接利用Cookie登录 JavaScript语法 获取:document.cookie; 设置:document.cookie“usernamexx”; 删除:document.cookie“usernamexx;expiresThu, 01 Jan 1970 00:00:00 GMT”;

C语言进阶第二课-----------指针的进阶----------升级版

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

图像的转置之c++实现(qt + 不调包)

1.基本原理 图像的转置就是将图像的横坐标和纵坐标交换位置,和矩阵的转置是一样的,公式见下: 2.代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解) /*图像的转置函…

Qt画波浪球(小费力)

画流动波浪 #ifndef WIDGET3_H #define WIDGET3_H#include <QWidget> #include <QtMath> class widget3 : public QWidget {Q_OBJECT public:explicit widget3(QWidget *parent nullptr);void set_value(int v){valuev;}int get_value(){return value;} protecte…