目录

RSA公钥密码算法

一、RSA的数学基础

二、RSA原理

三、算法详细流程

四、RSA特点

五、RSA应用


参考推荐:

https://blog.csdn.net/lemon_tree12138/article/details/50696926

RSA加密算法原理_张维鹏的博客-CSDN博客_rsa加密算法原理

图解RSA算法+取余和取模运算_养只猫叫泡芙的博客-CSDN博客_rsa算法中mod怎么算

RSA公钥密码算法

RSA算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出,是最经典的非对称加密算法。非对称加密算法的特点就是加密秘钥和解密秘钥不同,秘钥分为公钥和私钥,用私钥加密的明文,只能用公钥解密;用公钥加密的明文,只能用私钥解密。它既能用于加密,也能用于数字签名,目前它已经成为最流行的公开密钥算法。SSH、OpenPGP、S/MIME、和SSL/TLS都依赖RSA的加密和签名功能。

一、RSA的数学基础

互质:如果两个正整数,除了 1 以外没有其他公因子,就称这两个数是互质关系。比如 3 和 5,13 和 31 等。

欧拉函数:求小于N 的正整数中与N 互质的数的数目。

例:对应 8,与 8 互质的数有 1,3,5,7,所以 φ(N) = 4。

RSA 算法使用了欧拉函数的一个特例:如果 N可以分解成两个互质的整数之积:

N=pq ,则φ(N)=φ(p)φ(q)=(p−1)(q−1)。

例:φ(35947)=φ(103)φ(349)=(102)(348)=35496。

模反元素:如果两个正整数 a和 n互质,那么一定可以找到整数 b,使得 ab−1被 n 整除: ab≡1 (modn),这时,b就叫做 a的"模反元素"。

模反元素求解实例:

        5*d=1 mod 52:(52*X+1)/5

        5*d=1 mod 76:(76*X+1)/5   X从1 开始往上数->d

二、RSA原理

RSA 算法的可靠性基础:对极大整数做因数分解是很困难的,对极大整数做因数分解的难度决定了RSA算法的可靠性。其公钥和私钥是一对大素数(100到200位十进制数或更大)的相关函数,从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积。

RSA 是非对称算法,加解密使用不同的密钥。两个密钥都可以用于加密,解密时需要使用另一个密钥。但是,因为公钥是近乎完全公开的,通常用公钥加密私钥解密。理论上 A 和 B 之间要通过 RSA 实现保密通信,需要 A 和 B 各自生成一组密钥,同时保管好自己的私钥;发送者用对方的公钥加密要发送的消息,接收者用自己的私钥解密对方发送过来的消息。在签名的场景下,用私钥签名,公钥验签。

RSA 比 DES 等对称算法慢得多。一般在实际数据传输时,用 RSA 来加密比较短的对称密码,双方交换密码后再使用 DES 等对称算法加密数据。

注意

RSA 加密或签名后的结果是不可读的二进制,使用时经常会转为 BASE64 码再传输。

RSA 加密时,对要加密数据的大小有限制,最大不大于密钥长度。例如在使用 1024 bit 的密钥时,最大可以加密 1024/8=128 Bytes 的数据。数据大于 128 Bytes 时,需要对数据进行分组加密(如果数据超限,加解密时会失败,openssl函数会返回false),分组加密后的加密串拼接成一个字符串后发送给客户端。

为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。

为了保证每次加密的结果都不同,RSA 加密时会在待加密数据后拼接一个随机字符串,再进行加密。不同的填充方式 Padding 表示这个字符串的不同长度,在对超限数据进行分组后,会按照这个 Padding 指定的长度填入随机字符串。例如如果 Padding 填充方式使用默认的 OPENSSL_PKCS1_PADDING(需要占用11个字节用于填充),那么明文长度最多只能就是 128-11=117 Bytes

三、算法详细流程

1、参数定义与密钥生成

  • 生成两个大素数 p和 q,p不等于 q,p,q保密;
  • 计算 n=pq,n公开;
  • 根据欧拉函数计算小于n且与n互素的整数的个数,求得 r=φ(n)=φ(p)φ(q)=(p−1)(q−1),φ(n)保密;
  • 选择一个小于 r且大于1的随机数 e,使 e与 r互质,即gcd(e,r)=1,e公开;
  • 求得 e关于 r的模反元素 d,计算d:e*d≡1modr;d保密。
  • (n,e) 是公钥,(p,q,d, φ(n))是私钥---(n,d) 是私钥。

注意:

  • 模反元素存在,当且仅当 e 与 r 互质;
  • 将 p 和 q 的记录销毁;
  • 公钥发送给所有的通信对象(对服务器来说就是所有的客户端),私钥则必须保管好,防止泄露;通过私钥可以轻松计算出公钥,反之不行。

2、加、解密、签名

加密:

假设客户端要向服务器发送消息 m,服务器的公钥是 n和 e。客户端将消息 m 转换为一个小于 N的非负整数 n,比如可以将每一个字转换为这个字的 Unicode 码,然后将这些数字连在一起组成一个数字。假如信息非常长的话,可以将这个信息分为几段,然后将每一段转换为 n。用下面这个公式他可以将 加密为 c:

计算 c并不复杂,客户端算出 c 后就可以将它传递给服务器。

解密:

得到消息 c后,可以利用密钥 d 来解码。可以用以下这个公式来将 c 转换为 n:

得到 n 后,可以将原来的信息 m 重新复原。解码的原理是:

已知 ed≡1(modr),即 ed=1+hφ(N)。由欧拉定理得:

签名:

RSA 也可以用来为一个消息签名。签名应注意:不对数据M签名,而是对HASH(M)签名,可以使用时间戳,先签名后加密。实际应用中,对消息字符串的散列值(Message digest,用 MD5、SHA256 等算法求得的长度较短且固定的字符串)使用 RSA 的私钥进行签名(加密散列值)后,得到一个签名字符串,将其附加在消息字符串的合适位置后,一并发送。接收方使用对应的公钥可以从签名字符串中解密出原来的散列值,同时对原始消息再计算一次散列值。二者相比较,假如两者相符的话,则认为发信人持有正确的私钥,并且这个消息在传播路径上没有被篡改过。

四、RSA特点

密钥长度:用户应使用 1024 位密钥,证书认证机构应用 2048 位或以上;

非对称:用公钥加密时,私钥可以解密,反之亦然;核心运算是模幂运算,实现效率比较高效;

优势:经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性;

缺陷:无法从理论上把握它的保密性能如何;产生密钥收到素数产生技术的限制;密钥分组产生高度较长,运算速度较低;

注意:其安全性要保证选取的素数p和q足够大,且为强素数,e,d不能太小,不能多个用户使用一个n。

五、RSA应用

注:

如有错误、侵权,请联系笔者更改删除!!!

(八)RSA 公钥密码算法相关推荐

  1. python语言实现rsa公钥密码算法_python实现RSA算法

    文章最后更新时间为:2018年12月26日 23:07:29 RSA是一种公钥密码算法,其影响力我就不多说了,算法原理网上多的是,看了几篇,还是觉得阮一峰写的好懂. 要想实现RSA,其关键在于大数运算 ...

  2. python语言实现rsa公钥密码算法_python 实现 rsa 算法加解密密码

    python版本:2.7 需要用到的模块:pycrypto 模块下载地址:https://pypi.org/project/pycrypto/#files 私钥和公钥的准备: 在进行RSA加密前,我们 ...

  3. SM2椭圆曲线公钥密码算法(Python实现)

    本文目录 一.实验目的(包括实验环境.实现目标等等) 1. 实验环境 2. 实现目标 3. 实验中需要导入的库 二.方案设计(包括背景.原理.必要的公式.图表.算法步骤等等) 1. 实验背景 2. 实 ...

  4. RSA证书算法实现及其应用

    密钥管理是加密算法中非常重要的一个环节,因为密钥的管理直接影响着加密算法的安全性.在公钥密码系统中,RSA算法是一种广泛应用的加密算法,它具有较高的安全性和效率.本文将介绍RSA证书算法的实现和密钥长 ...

  5. ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测

    ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测 目录 输出结果 数据集展示 输出结果 1.k-NN 2.LoR 4.DT 5.RF ...

  6. Java常用的八种排序算法与代码实现

    在Java的时候,对于排序的应用需要熟练的掌握,这样才能够确保Java学习时候能够有扎实的基础能力.那Java有哪些排序算法呢?本文小千就来详细说说Java经典的8种排序算法. 经典的排序算法有八种, ...

  7. 第八模块:算法设计模式、企业应用 第2章 企业应用工具学习

    第八模块:算法&设计模式.企业应用 第2章 企业应用工具学习 转载于:https://www.cnblogs.com/tqtl911/p/9131614.html

  8. 【算法篇】八种内排序算法

    常用的八种内排序算法分别是: 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 插入排序:直接插入排序.希尔排序 归并排序 基数排序 内排序巧记:选(选择)舰(简单选择)队(堆)的时候脚( ...

  9. ElGamal公钥密码算法(Python实现)

    本文目录 一.实验目的(包括实验环境.实现目标等等) 1. 实验环境 2. 实现目标 二.方案设计(包括背景.原理.必要的公式.图表.算法步骤等等) 1. 背景 2. 离散对数困难问题 3. EIGa ...

最新文章

  1. 3名女研究生,状告哈佛!
  2. 实现HOOK其他进程的Messagebox(2) DLL注入工具
  3. LightGBMError: Length of label is not same with #data
  4. 根目录下各文件夹的作用
  5. opencv 图像 抠图 算法_图像抠图算法学习 - Shared Sampling for Real-Time Alpha Matting
  6. STM32串口开发之环形缓冲区
  7. Compass.net
  8. 20164319 刘蕴哲 Exp1 PC平台逆向破解
  9. RabbitMQ 中的 7 种队列模式,写得太好了!
  10. [ProblemSolving]ut下载磁盘负荷过重
  11. Head First Java
  12. 推荐系统--开源代码
  13. 百度回应“柬埔寨吧”为境外赌场招工:情况属实 已报案
  14. 网卡的 Ring Buffer 详解
  15. SqlServer 中的触发器
  16. pydicom----用法一
  17. live直播平台源码
  18. mysql备份脚本 shell_linux中mysql备份shell脚本代码 相关自动化脚本
  19. SUN/FUJITSU 小型机 镜像硬盘更换方案
  20. 【MEME Tuesday 】重建光辉城市

热门文章

  1. #力扣 LeetCode27. 移除元素 #在所有 Java 提交中击败了 100.00% 的用户 @FDDLC
  2. 倚天剑第一式——爬虫基础
  3. 微信公众号开发样式失效问题
  4. 深入理解单例模式——只有一个实例
  5. 网站服务器响应时间1000毫秒,什么是网站响应时间?
  6. 新东方雅思词汇(List 16 ~ List 20)
  7. 有必要学好linux内核吗,如果你打算看完Linux内核源码,可能穷尽一生都做不出一个系统...
  8. WinForm的ListView详解
  9. Linux find查找指定文件并复制到指定文件夹
  10. java smtp_java发送邮箱(SMTP协议)