一 点睛

RSA的加密是求“E次方的mod N”,解密是求“D次方的mod N”,这里提到了三个数——E、D和N,它们到底是怎样生成的呢?

由于E和N是公钥,D和N是私钥,因此求E、D和N这三个数就是生成密钥对。RSA密钥对的生成步骤如下:

1 求N

2 求L(L是仅在生成密钥对的过程中使用的数)

3 求E

4 求D

二 生成密钥对过程

1 求N

首先准备两个很大的质数。

这两个很大的质数为p和q。

p和q太小的话,密码会变得容易破译,但太大的话计算时间又会变得很长。例如,假设p和q的大小都是512比特,相对于155位的十进制数字。

要求出这样大的质数,需要通过伪随机数生成器生成一个512bit大小的数,再判断这个数是不是质数。如果伪随机数生成的数不是质数,就需要再用伪随机数重新生成另外一个数。

判断一个数是不是质数并不是看它能不能分解质因数,而是通过数学上的方法来完成,判断质数的方法包括费马测试和米勒.拉宾测试等。

准备好两个很大的质数之后,再将这两个数相乘,其结果就是数N。也就是说,数N可以用下列公式来表达。

N=p*q  (p、q为质数)

2 求L

L这个数在RSA的加密和解密过程中都不会出现,它只出现在生成密钥对的过程中。

L是p-1和q-1的最小公倍数。如果用lcm(X,Y)来表示“X和Y的最小公倍数”,则L可以写成下列形式。

L=lcm(p-1,q-1)(L是p-1和q-1的最小公倍数)

3 求E

E是一个比1大,比L小的数。此外,E和L的最大公约数(gcd)必须为1.如果用gcd(X、Y)来表示X和Y的最大公约数,则E和L之间存在下列关系。

1<E<L

gcd(E,L)=1    E和L的最大公约数为1(E和L互质)

要找出满足gcd(E,L)=1的数,还是要使用伪随机数生成器。通过伪随机数生成器在1<E<L的范围内生成E的候选数,然后再判断是否满足gcd(E,L)=1这个条件。求最大公约数可以使用欧几里得的辗转相除法。

简单说,之所以要加上E和L的最大公约数为1这个条件,是为了保证一定存在在解密时需要使用的数D。

到此,已经求出了E和N,也就是说已经生成了密钥对中的公钥。

4 求D

数D是由数E计算得到的。D、E和L之间必须具备下列关系。

1<D<L

E*D mod L =1

只要数D满足上面条件,则通过E和N进行加密的密文,就可以通过D和N进行解密。

简单来说,E*D mod L =1 保证了对密文进行解密时能够得到原来的明文。

到此就求出了D和N,也就是说我们生成了密钥对中的私钥。

RSA生成密钥对的过程相关推荐

  1. [crypto]-51.1-python的aes加解密/rsa生成密钥对/rsa加解密/hmac加密

    直接上代码 import base64 from Crypto.Cipher import AES import random import sys import os import hmac fro ...

  2. 使用RSA生成一对公钥和私钥

    使用RSA生成一对公钥和私钥 package com.demoinfo.support.utils;import sun.misc.BASE64Decoder; import sun.misc.BAS ...

  3. php+rsa生成签名sign,PHP 做 RSA 签名 生成订单(支付宝例子)

    /组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的16 ...

  4. GPG生成密钥对(Windows)及应用

    安装Gpg4win,下载链接:https://download.csdn.net/download/zyhlwzy/11099228 1.生成密钥对 C:\WINDOWS\system32>gp ...

  5. gmssl国密sm2(生成密钥对-私钥签字-证书验签)

    生成密钥对: #include <stdio.h> #include <string.h> #include <stdlib.h> #include "e ...

  6. Centos7中创建RSA非对称密钥对及搭建私有CA并为客户端颁发证书

    Centos7中创建RSA非对称密钥对及搭建私有CA并为客户端颁发证书 1.在centos7中使用gpg创建RSA非对称密钥对 [13:32:55 root@centos7 data]#gpg --g ...

  7. jwt私钥和公钥怎么获取_如何为php-jwt生成密钥对?

    我试图使用PHP-JWT生成JWT,但我总是最终收到错误: PHP Warning: openssl_sign(): supplied key param cannot be coerced into ...

  8. 仅需2张图,AI便可生成完整运动过程

    金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 先给一张侧脸(关键帧1): 再给一张正脸(关键帧2): 然后仅仅根据这两张图片,AI处理了一下,便能生成整个运动过程: 而且不只是简单的那种 ...

  9. SFTP连接GCP,向服务器发送文件方法,第三方工具生成密钥对连接GCP服务器(putty生成密钥远程连接服务器)...

    190223更新通过WinSCP工具导入key,向服务器发送文件方法: 很多时候需要向服务器发送文件,GCP和一般服务器不太一样,使用ftp和用户名密码不容易获取,一般采用秘钥的方式,下边介绍实现方法 ...

最新文章

  1. 参加软件测试培训前景怎么样
  2. Mysql InnoDB B+树索引和哈希索引的区别? MongoDB 为什么使用B-树?
  3. 功能基因多样性研究概述
  4. PAT乙级题目答案汇总PAT (Basic Level) Practice (中文)
  5. 42.Android之ListView中ArrayAdapter简单学习
  6. c++语言函数strcpy,C++中函数的安全版本的意义及strcpy函数的功能和差别(图)
  7. 闲鱼如何高效承接并处理用户纠纷
  8. 如何在data visualization 中update svg_如何操作小程序页面中data数据区中的数据
  9. 蓝桥杯2019年第十届C/C++省赛B组第一题-组队
  10. Operations Manager 2007 R2系列之单台服务器拓扑图监控
  11. IEEE论文模板(latex/word)
  12. 【Go语言核心手册14】结语参考文献
  13. 超硬核!数据结构学霸笔记,考试面试吹牛就靠它
  14. 一套键鼠控制多台电脑操作——Synergy软件(windows环境)
  15. iPad pro能运行c语言吗,办公实战 iPad Pro还是洗洗睡吧_平板电脑评测-中关村在线...
  16. QMetaObjectPrivate meta_constractors Q_INVOKABLE
  17. Docker 容器技术入门
  18. 网站后台主流架构设计参考(图文)
  19. linux下查找java进程占用CPU过高原因
  20. 互联网大陆的守夜人:信息加密技术

热门文章

  1. remove logo now注册码
  2. 激光 pm2.5传感器 攀藤科技 stm32 调试通过
  3. Java 多线程平行计算总结
  4. 【菜菜的sklearn课堂笔记】逻辑回归与评分卡-用逻辑回归制作评分卡-分箱
  5. SpringBoot发送邮件通过SendGrid服务平台(带动态模板)
  6. Java List和String互相转换
  7. Ebay跨境智星:全自动批量注册及下单软件
  8. Linux命令行下使用飞信
  9. java安装的时候无效参数,java.sql.SQLException: 调用中无效的参数
  10. 浏览器打开本地exe