长度,建议至少1024。模数n(常取默认65537)两边都要用。

指数e,和n一起就是公钥。

指数d,和n一起就是私钥。

质数p和q用于生成密钥对,然后就丢弃不公开。

一。密钥对的生成步骤

1、随机选择两个不相等的质数p和q。

2、计算p和q的乘积n。

3、计算p-1和q-1的乘积m。

4、随机选个整数e,e与m要互质,且0<e<m。

5、计算e的模反元素d。

6、n,e组成公钥,n,d组成私钥。

用公钥(n, e)加密:明文e ≡ 密文 (mod n)

用私钥(n, d)解密:密文d ≡ 明文 (mod n)

上述表达式是同余式,也就是“≡”两边mod n是相等的。mod运算就是取被除数 / 除数得到的余数,运算符是%。比如5%3=2。所以上式也可表达成

用公钥(n, e)加密:密文 = 明文e % n

用私钥(n, d)解密:明文 = 密文d % n

一。

i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
i mod 4 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
i mod 7 0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3 4 5

(a % 4)是以4为周期在循环,(a % 7)是以7为周期在循环,而且数对(a % 4, a % 7)在这个[0,21]之间并没有出现重复,也就是说由(a % 4, a % 7)可以确定a的值

如果n个数互质,且乘积为P,有一个未知数M,已知M分别除以n个数的余数,那个在0<M<P的范围内,可以确定唯一的M值。

二。

13 * 77 = 1001 => 1001 % 1000 = 1

=> 1001 ≡ 1 (mod 1000)

=> a * 1001 ≡ a (mod 1000)

就是说任何数乘以1001除以1000得到余数是本身。因此:

(a * 1001) % 1000 = (a * 13 * 77) % 1000 = ((a * 13) % 1000) * 77) % 1000

理解一下就能发现,我们并不需要知道a * 13的积是多少,而是知道它除以1000的余数就行了,因为反正最后都是要模1000,那事先拿一部分来模1000并不影响结果。

除法类似,两个数乘积除以另一个数,那事先用一个乘数除以除数,得到的值再乘以另一个乘数再除,并不影响结果。这个思想,也是RSA用来当被模数过大时优化计算力的算法。

你心想三位数,乘以13,告诉我乘积的后三位数,我就能知道你想的是哪个数!

假如你想的是233,233*13=3029,所以你告诉我的是029,我只要把29*77=2233,积的后三位数233就是你心想的数。

这里就有点非对称的影子了,(1000, 13)就是公钥,(1000, 77)就是私钥。

3.费马小定理

☆  p = 3

2- 1 = 3,   2- 1 = 15 = 3×5,   2- 1 = 63 = 3×21,  2- 1 = 255 = 3×85,  210 - 1 = 1023 = 3×341, ...

费马指数:2, 4, 6, 8, 10, ......

☆  p = 5

2- 1 = 15 = 5×3,   2- 1 = 255 = 5×51,   212 - 1 = 4095 = 5×819,   216 - 1 = 65535 = 5×13107, ...

费马指数:4, 8, 12, 16, ......

☆  p = 7

2- 1 = 7 = 7×1,   2- 1 = 63 = 7×9,   2- 1 = 511 = 7×73,   212 - 1 = 4095 = 7×585,  ...

费马指数:3, 6, 9, 12, ......

☆  p = 11

210 - 1 = 1023 = 11×93,   220 - 1 = 1048575 = 11×95325,   230 - 1 = 1073741823 = 11×797612893,   ...

费马指数:10, 20, 30,  ......

参考:

https://toutiao.io/posts/u6ehd/preview

图片:http://introcs.cs.princeton.edu/java/99crypto/

RSA原理说明的更多相关文章

  1. RSA原理及生成步骤

    摘自:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html(可到原网址查看秘钥生成原理) RSA算法原理(一) 因为它是 ...

  2. RSA原理、ssl认证、Tomcat中配置数字证书以及网络传输数据中的密码学知识

      情形一:接口的加.解密与加.验签 rsa不是只有加密解密,除此外还有加签和验签.之前一直误以为加密就是加签,解密就是验签.这是错误的! 正确的理解是: 数据传输的机密性:公钥加密私钥解密是密送,保 ...

  3. RSA - 原理、特点(加解密及签名验签)及公钥和私钥的生成

    Wiki - RSA加密演算法 Wiki - 欧拉函数 Wiki - 模反元素 ASN.1 格式标准 RSA算法原理(二) 注意: RSA 加密或签名后的结果是不可读的二进制,使用时经常会转为 BAS ...

  4. 转: RSA原理 阮一峰的博客

    转:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 讲的非常细致,易懂.

  5. 数字签名中公钥和私钥是什么?对称加密与非对称加密,以及RSA的原理

    http://baijiahao.baidu.com/s?id=1581684919791448393&wfr=spider&for=pc https://blog.csdn.net/ ...

  6. (转)对称加密与非对称加密,以及RSA的原理

    一 概述 二对称加密和非对称加密 对称加密 非对称加密 区别 三RSA原理 整数运算 同余运算 当模数为合数n时 当模数为质数p的时候 离散对数问题 RSA原理 一 , 概述 在现代密码学诞生以前,就 ...

  7. Windows phone应用开发[19]-RSA数据加密

    在这个系列的第十六章节中Windows phone应用开发[16]-数据加密 中曾详细讲解过windows phone 常用的MD5,HMAC_MD5,DES,TripleDES[3DES] 数据加密 ...

  8. RSA算法详解

    1.RSA加密算法是最常用的非对称加密算法 2.RSARSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名, 3.目前学术界无法证明RS ...

  9. RSA加解密算法以及密钥格式

    RSA算法: 有个文章关于RSA原理讲的不错: https://blog.csdn.net/dbs1215/article/details/48953589 http://www.ruanyifeng ...

随机推荐

  1. Jenkins构建触发器

       我们在执行Jenkins的项目构建的时候一般都是通过web管理界面中的”构建”来执行项目构建操作,但是除此之外我们还可以通过项目配置中的”构建触发器”来触发构建操作, 其中”构建触发器”有一种方 ...

  2. 如何构建日均千万PV Web站点(二) 之~缓存为王~

    随着网站业务的不断发展,用户的规模越来越大:介于中国无比蹩脚复杂的网路环境:南电信:北联通:中间竟然只用一条链路进行互联通信!有研究表明,网站访问延迟和用户流失率正相关,网站访问速度越慢,用户越容易失 ...

  3. c语言学习笔记---符号

    专题2.符号的技巧: 1) 注释符与转义符 vC语言中的接续符(\)是指示编译器行为的利器: 接续符的使用:编译器会将反斜杠剔除,嗯在反斜杠后面的字符自动解到前面的一行. 在接续单词时,反斜杠之后不能 ...

  4. 普通for循环和增强for循环的区别

    1.普通for循环:自行维护循环次数,循环体自行维护获取元素的方法: int[] array = new int[]{1,2,3,4,5}; //int[] array ={1,2,3,4,5} ; ...

  5. Java访问数据库Mysql

    一.概述 本文主要介绍Java接连数据库的基本方法和步骤,并对其中的几个要点进行简要说明. 二.数据库访问步骤 在Java中连接数据库进行的访问主要有以下几个步骤: 加载数据库驱动 注册数据库驱动 建 ...

  6. 清空Cookie

    function delCookie() { ; i < cookies.length; i++) { try { document.cookie = cookies[i] + "=0 ...

  7. Delphi XE 10 跨平台三层数据库应用教程

    Delphi XE 10 跨平台三层数据库应用教程 前言: Delphi XE 开始越来越庞大,比经典的Delphi7难用,但依然是目前所有跨平台开发工具中开发效率最高.最容易上手的,其快速设计RAD ...

  8. C++构造函数、new、delete

    1. c++在调用构造函数时,才会把最开始的虚表指针指向虚表. 2.在构造函数或者析构函数中调用虚函数. 编译上没有问题. 运行时,调用虚函数不会发生多态行为,会调用正在构造的类的虚函数. 详细可见c ...

  9. 深入理解 Neutron -- OpenStack 网络实现(4):网络名字空间

    问题导读1.如何查看网络名字空间?2.网络名字空间开头的名字有什么规律?3.dhcp服务是如何实现的?4.router的实现是通过iptables进行的是否正确?5.SNAT和DNAT规则有什么作用? ...

  10. 题目1452:搬寝室(dp题目)

    题目链接:http://ac.jobdu.com/problem.php?pid=1452 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...