密码技术 (2) - 公钥密码

news/2024/10/18 16:41:39/

一. 前言

        公钥密码的秘钥分为加密秘钥和解密秘钥,加密秘钥成为公钥,解密秘钥成为私钥,公钥和私钥的成对存在的,一对公钥和私钥称为密钥对。发送消息时,发送者用公钥对消息进行加密,接收者用私钥进行解密。从这里可以知道,发送者只需要用公钥对消息进行加密,而接收者用私钥解密即可,这样就解决了对称密码的秘钥传送问题。公钥可以通过任何方式公开,但是接收者的私钥是绝对不能被别人知道的。

        由于加密的密码和解密的密码不同,与公钥密码相对的,公钥密码也被称为非对称密码。下面介绍公钥密码相关的几种加密算法。

二. 加密算法

1. RSA

        RSA这种公钥密码算法是由三位开发者完成,分别是Ron Rivest,Adi Shamir和Leonard Adleman。而RSA名字就是分别取自三人的姓的首字母。

        对于RSA在数学上的具体实现,这里不做探究

2. EIGamal

        EIGamal算法是由Taher EIGamal设计的,EIGamal相对于RSA有一个缺点,经过加密的密文长度会变为明文的两倍

三. openssl实践

        openssl通过genrsa,rsa和rsautl选项用于公钥密码,genrsa用于生成公钥和私钥,rsa用于处理rsa秘钥,例如由私钥生成公钥,rsautl是rsa的一些工具,例如加密解密。下面介绍生成私钥和公钥的方法以及利用公钥私钥加密和解密数据步骤:

1. 生成私钥

openssl genrsa -out private.pem 2048

        生成2048长度的私钥。 

2. 由私钥生成公钥

openssl rsa -in private.pem -pubout -out public.pem

3. 由公钥加密数据

infile内容:

ni hao,rsa

加密操作:

openssl rsautl -encrypt -pubin -inkey public.pem -in infile -out outfile

outfile内容:

00000000  29 44 23 c6 10 14 65 58  75 0d f7 ef f1 6e 77 9b  |)D#...eXu....nw.|
......
000000f0  10 a7 82 16 fd 44 dc d5  1b 3c ca a1 16 79 22 54  |.....D...<...y"T|

4. 由私钥解密数据

解密操作:

openssl rsautl -decrypt -inkey private.pem -in outfile -out decryptfile

decryptfile内容:

ni hao,rsa

四. 总结

        公钥密码对于对称密码是解决了秘钥的传送问题,公钥无法解密公钥加密的数据,只有私钥可以,所以任何人都可以获得公钥。不过公钥密码还存在一个问题,发送者不能确定公钥和接收者的私钥是密钥对,公钥可能被篡改,导致使用了中间攻击人的公钥,导致安全问题。

        除RSA算法外,公钥密码的算法还有,Rabin和椭圆曲线密码(ECC)。


http://www.ppmy.cn/news/1131969.html

相关文章

Python 编程基础 | 第三章-数据类型 | 3.2、整数

一、整数 有些强类型的编程语言会提供多种整数类型&#xff0c;每种类型的长度都不同&#xff0c;能容纳的整数的大小也不同&#xff0c;例如C语言提供了 short、int、long、long long 四种类型的整数。而 Python 则不同&#xff0c;它的整数不分类型&#xff0c;或者说它只有一…

基于Vue+ELement实现增删改查案例与表单验证(附源码)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

webpack优化策略

这三点是webpack优化策略的一部分&#xff0c;具体解释如下&#xff1a; 优化正则匹配&#xff08;Test&#xff09;&#xff1a;在webpack的配置中&#xff0c;test属性是一个正则表达式&#xff0c;用于匹配需要应用该loader的文件的扩展名。在您提供的代码中&#xff0c;te…

【C++】class的设计与使用(十)重载iostream运算符

希望对某个类对象进行读写操作&#xff0c;直接cout<<类对象<<endl;或cin>>类对象;编译器会报错&#xff0c;所以我们必须提供一份重载的input/output运算符&#xff1a; 重载ostream运算符 ostream& operator<<(ostream &os, const Triangu…

枚举,进制转换,char*,补码,算法,链表,位运算,NULL的含义

什么是枚举 进制转换 4个二进制位组合才能有16个状态 字符指针 补码 编码就是解决这个东西到底用哪个二进制表示 不够位数指的是比如32位&#xff0c;前面都补1 #include <iostream> #include <map> #include <vector> #include <algorithm> using na…

CSS box-shadow阴影

1、语法 box-shadow: h-shadow v-shadow blur spread color inset; 值描述h-shadow必需的。水平阴影的位置。允许负值v-shadow必需的。垂直阴影的位置。允许负值blur可选。模糊距离spread可选。阴影的大小color可选。阴影的颜色。在CSS颜色值寻找颜色值的完整列表inset可选。…

通过code2Session接口获取openId(上)

//导入request请求工具类 import {getBaseUrl,getWxLogin,getUserProfile,requestUtil} from ../../utils/requestUtil; import regeneratorRuntime from ../../lib/runtime/runtime; Page({/*** 页面的初始数据*/data: {address:{},baseUrl:,cart:[],totalPrice:0,totalNum:0}…

使用sqlmap获取数据步骤

文章目录 1.使用sqlmap获取所有数据库2.使用sqlmap获取当前连接数据库3.使用sqlmap获取当前数据库下所有表名4.使用sqlmap获取当前数据库下某个表下所有列名5.使用sqlmap获取当前数据库下某个表下指定字段的数据6.脱库命令 1.使用sqlmap获取所有数据库 –dbs python sqlmap.py…