一文详解 RSA 非对称加密算法

一文详解 RSA 非对称加密算法非对称加密算法指的是加 解密使用不同的密钥 一把为公开的公钥 另一把为私钥 公钥加密的内容只能由私钥进行解密 反之由私钥加密的内容只能由公钥进行解密 也就是说 这一对公钥 私钥都可以用来加密和解密 并且一方加密的内容只能由对方进行解密

  • 加密:公钥加密,私钥解密的过程,称为「加密」
    因为公钥是公开的,任何公钥持有者都可以将想要发送给私钥持有者的信息进行加密后发送,而这个信息只有私钥持有者才能解密。

  • 签名:私钥加密,公钥解密的过程,称为「签名」
    它和加密有什么区别呢?因为公钥是公开的,所以任何持有公钥的人都能解密私钥加密过的密文,所以这个过程并不能保证消息的安全性,但是它却能保证消息来源的准确性和不可否认性,也就是说,如果使用公钥能正常解密某一个密文,那么就能证明这段密文一定是由私钥持有者发布的,而不是其他第三方发布的,并且私钥持有者不能否认他曾经发布过该消息。故此将该过程称为「签名」。

RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相同的算法,但他的发现被列入机密,一直到1997年才被发表。

对极大整数做因数分解的难度决定了RSA算法的可靠性。 换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。 但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

一、举一个通俗易懂的例子

看一个数学小魔术:

让A写下一个任意3位数,并将这个数和91相乘;然后将积的最后三位数告诉B,这样B就可以计算出A写下的是什么数字了。

  • 比如A写下的是123 (需加密内容),并且A计算出123 * 91 (B的公钥加密)等于11193,并把结果的末三位193(加密结果)告诉B ;
  • B只需要把193再乘以11 (B的私钥),193 * 11 = 2123 末三位123(解密结果)就是A写下的数字了;

道理很简单,91乘以11等于1001,而任何一个三位数乘以1001后,末三位显然都不变(例如123乘以1001就等于)。

  • 任意一个数乘以后,末8位都不变,而 = 19801 * 20201。于是A来乘以19801,B来乘以20201,又一个加密解密不对称的系统就构造好了;
  • 甚至可以构造得更大一些 00000000000000000001 = 46957 * 69093,这样我们就成功构造了一个30位的加密系统;

如果仅仅按照上面的思路,如果对方知道原理,非常容易穷举出这个目标值;RSA算法使用的是指数和取模运算,本质上就是上面这套思想。

二、一句话:

对极大整数做因数分解的难度决定了RSA算法的可靠性。

三、RSA加密算法

3.1、维基百科——RSA加密算法

先看一下维基百科的算法描述:

公钥与私钥的产生

  • 1、随意选择两个大的质数 p和 q,p不等于 q,计算 N=pq
  • 2、根据欧拉函数,求得 r
r = φ(N) = φ(p)φ(q) = (p-1)(q-1) 
  • 3、选择一个小于r并与r互质的整数e,求得e关于r的模反元素,命名为d ( ed ≡ 1(mod r) 模反元素存在,当且仅当e与r互质 );
  • 4、销毁p和q,此时 (N , e)是公钥,(N, d)为私钥;

加密消息

假设Bob想给Alice发送一个消息 n,他知道Alice产生的 Ne ;用下面这个公式他可以将 n加密为 c

c ≡ n^e (mod N) 

计算 c并不复杂。Bob算出 c后就可以将它传递给Alice。

解密消息

Alice得到Bob的消息 c后就可以利用她的密钥d来解码。可以用以下这个公式来将 c转换为 n

n ≡ c^d (mod N) 

3.2、依照算法公式举个例子

依照算法公式来举个例子

1、随意选择两个大的质数 p和 q,p不等于 q,计算 N=pq

质数 定义:

除了1和该数自身外,无法被其他自然数整除的数。 

举例:

p = 3; q = 5; N = 3*5 = 15; 

2、根据欧拉函数,求得 r

r = φ(N) = φ(p)φ(q) = (p-1)(q-1)。 

欧拉函数 定义:

欧拉函数 φ(n)是小于或等于n的正整数中与n互质的数的数目。 例如:φ(8) = 4,因为1,3,5,7均和8互质。 

举例:

r = φ(N) = φ(p)φ(q) = (p-1)(q-1) ; r = φ(15) = φ(3)φ(5) = (3-1)(5-1) ; r = 8 

3、选择一个小于r并与r互质的整数e,求得e关于r的模反元素,命名为d ( ed ≡ 1(mod r) 模反元素存在,当且仅当e与r互质 );

互质 定义:

如果两个或两个以上的整数的最大公约数是 1,则称它们为互质 例如:1,3,5,7均和8互质 

模反元素 定义:

如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。( ab ≡ 1(mod n) ) 例如:比如3和5互质,3关于5的模反元素就可能是2,因为 (3*2)%5=1 。 

举例:

// 选择一个小于r并与r互质的整数e (1,3,5,7均和8互质): e = 7; // 求得e关于r的模反元素,命名为d ( ed ≡ 1(mod r) ) ed ≡ 1(mod r) ; 7*d ≡ 1(mod 8) ; 7*d%8 = 1; // 这里取d = 15 d = 15; 

4、销毁p和q,此时 (N , e)是公钥,(N, d)为私钥

// 公钥 (N , e) ( 15,7 ) // 私钥 (N, d) ( 15,15 ) 

5、加密

假设Bob想给Alice发送一个消息 n,他知道Alice产生的 Ne ;用下面这个公式他可以将 n加密为 c

举例:

// 假设 n = 2; // 计算c c ≡ n^e (mod N) ; (c^-1 * n^e)%N = 1 ; (c^-1 * 2^7)%15 = 1 ; // c = 8; 

6、解密

Alice得到Bob的消息 c后就可以利用她的密钥d来解码。可以用以下这个公式来将 c转换为 n

举例:

// 计算n n ≡ c^d (mod N) n ≡ 8^15 (mod 15) ; (n^-1 * 8^15)%15 = 1 ; // n = 2; 

参考

= THE END =

欢迎关注我的公众号

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218044.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午8:11
下一篇 2026年3月18日 上午8:11


相关推荐

  • 配置更安全的服务器Windows 2003 Server

    配置更安全的服务器Windows 2003 Server

    2021年7月22日
    51
  • “双击Pycharm无响应”解决方案「建议收藏」

    “双击Pycharm无响应”解决方案「建议收藏」问题描述昨晚直接关机,导致pycharm强制关闭,今早打开时双击图标无响应解决方法第一步:找到该路径下的cmd.exe,右键管理员身份打开;第二步:在cmd窗口中,输入netshwinsockreset,回车;第三步:重启电脑,尝试重新打开pycharm关于指令winsock是Windows网络编程接口netsh是一个能够通过命令行操作几乎所有网络相关设置的接口netshwinsockreset命令,作用是重置Winsock目录这个命令可以重新初始化网

    2022年8月28日
    10
  • Latex常见符号对照表

    摘要:Latex可以很方便的利用命令来生成各式各样的特殊符号.这里根据官方的文档将这些常见符号列出,以备查用.

    2022年4月4日
    251
  • vscode怎样新建HTML文件_vscode快速生成html

    vscode怎样新建HTML文件_vscode快速生成html1、点击OpenFolder:2、选择目标文件夹,在本地新建一个拓展名为html的文件:3、在第1行输入!(英文状态下),按tab键,新建成功。界面如下图所示:…

    2022年8月22日
    9
  • Ubuntu卸载软件:3种卸载方式

    Ubuntu卸载软件:3种卸载方式1.使用Synaptic软件包管理器进行卸载打开软件包管理器。Ubuntu自带了一个GUI(GraphicalUserInterface,图形化用户界面)软件包管理器,它可以让你在一个可视化窗口中卸载程序。如果你不习惯使用命令行,这一工具将非常有用。点击系统,然后选择管理。在管理菜单中,选择Synaptic软件包管理器。某些较新版本的Ubuntu没有预装Synaptic。要安装它,打…

    2022年5月7日
    691
  • GoLand中报错package xxx is not in GOROOT

    GoLand中报错package xxx is not in GOROOT问题我在导入 gopath 目录下的包时报错 packagexxxis 编译器没有去 gopath 下找包 查了一下原因是 GO111MODULE 没有关 gomod 和 gopath 两个包管理方案 并且相互不兼容 在 gopath 查找包 按照 goroot 和多 gopath 目录下 src xxx 依次查找 在 gomod 下查找包 解析 go mod 文件查找包 mod 包名就是包的前缀 里面的目录就后续路径了 在 gomod 模式下 查找包就不会去 gopath 查找

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号