一文搞懂 RSA 算法

一文搞懂 RSA 算法

地球上最重要的算法

如果没有 RSA 算法,现在的网络世界毫无安全可言,也不可能有现在的网上交易。上一篇文章 ssh 协议为什么安全 中的 ssh 协议也是基于 RSA 加密算法才能确保通讯是加密的,可靠的。

1976年以前,所有的加密方法都使用对称加密算法:加密和解密使用同一套规则。例如:甲使用密钥 A 加密,将密文传递给乙,乙仍使用密钥 A 解密。如果密钥 A 在甲传递给乙的过程中泄露,或者根据已知的几次密文和明文推导出密钥 A,则甲乙之间的通讯将毫无秘密。

1976年,两位美国计算机学家 Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不传递密钥的情况下,完成解密。这被称为 Diffie-Hellman密钥交换算法
假如甲要和乙通讯,甲使用公钥 A 加密,将密文传递给乙,乙使用私钥 B 解密得到明文。其中公钥在网络上传递,私钥只有乙自己拥有,不在网络上传递,这样即使知道了公钥 A 也无法解密。反过来通讯也一样。只要私钥不泄漏,通信就是安全的,这就是非对称加密算法。

1977年,三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。算法用他们三个人的名字命名,叫做RSA 算法。直到现在,RSA 算法仍是最广泛使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有 RSA 算法。

下面我以一个简单的例子来描述 RSA 算法。

生成密钥对,即公钥和私钥。

第一步:随机找两个质数 P 和 Q ,P 与 Q 越大,越安全。

比如 P = 67 ,Q = 71。计算他们的乘积 n = P * Q = 4757 ,转化为二进为 1001010010101,该加密算法即为 13 位,实际算法是 1024 位 或 2048 位,位数越长,算法越难被破解。

第二步:计算 n 的欧拉函数 φ(n)。

φ(n) 表示在小于等于 n 的正整数之中,与 n 构成互质关系的数的个数。例如:在 1 到 8 之中,与 8 形成互质关系的是1、3、5、7,所以 φ(n) = 4。
如果 n = P * Q,P 与 Q 均为质数,则 φ(n) = φ(P * Q)= φ(P - 1)φ(Q - 1) = (P - 1)(Q - 1) 。
本例中 φ(n) = 66 * 70 = 4620,这里记为 m, m = φ(n) = 4620

第三步:随机选择一个整数 e,条件是1< e < m,且 e 与 m 互质。

公约数只有 1 的两个整数,叫做互质整数,这里我们随机选择 e = 101
请注意不要选择 4619,如果选这个,则公钥和私钥将变得相同。

第四步:有一个整数 d,可以使得 e*d 除以 m 的余数为 1。

即找一个整数 d,使得 (e * d ) % m = 1。
等价于 e * d - 1 = y * m ( y 为整数)
找到 d ,实质就是对下面二元一次方程求解。
e * x - m * y =1 ,其中 e = 101,m = 4620
101x - 4620y =1
这个方程可以用"扩展欧几里得算法"求解,此处省略具体过程。 总之算出一组整数解(x,y )= ( 1601,35),即 d = 1601。
到此密钥对生成完毕。不同的 e 生成不同的 d,因此可以生成多个密钥对。

本例中公钥为 (n,e) = (4757 , 101),私钥为 (n,d) = (4757 ,1601) ,仅(n,e) = (4757 , 101) 是公开的,其余数字均不公开。可以想像如果只有 n 和 e,如何推导出 d,目前只能靠暴力破解,位数越长,暴力破解的时间越长。

加密生成密文 。

比如甲向乙发送汉字“中”,就要使用乙的公钥加密汉字 "中", 以 utf-8 方式编码为 [e4 b8 ad],转为 10 进制为 [228,184,173]。要想使用公钥(n,e) = (4757 , 101)加密,要求被加密的数字必须小于 n,被加密的数字必须是整数,字符串可以取 ascii 值或unicode值,因此将“中”字折为三个字节 [228,184,173],分别对三个字节加密。
假设 a 为明文,b 为密文,则按下列公式计算出 b

a^e % n = b

计算 [228,184,173]的密文:
228^101 % 4757 = 4296
184^101 % 4757 = 2458
173^101 % 4757 = 3263
即 [228,184,173]加密后得到密文 [4296,2458,3263] ,如果没有私钥 d ,神仙也无法从 [4296,2458,3263]中恢复 [228,184,173]。

解密生成明文。

乙收到密文 [4296,2458,3263],并用自己的私钥(n,d) = (4757 ,1601) 解密。解密公式如下:
假设 a 为明文,b 为密文,则按下列公式计算出 a

a^d % n = b

密文 [4296,2458,3263]的明文如下:
4296^1601% 4757 = 228
2458^1601% 4757 = 184
3263^1601% 4757 = 173
即密文 [4296,2458,3263] 解密后得到 [228,184,173]
将[228,184,173] 再按 utf-8 解码为汉字 "中",至此解密完毕。

加密和解密的过程使用了费尔马小定理的两种等价的描述。

最后,问题来了,有没有可能在已知 (n,e) 的情况下,推导出 d。
根据以上密钥生成过程:
如果想知道 d 需要知道欧拉函数 φ(n)
如果想知道欧拉函数 φ(n) 需要知道 P 和 Q
要知道 P 和 Q 需要对 n 进行因数分解。
对于本例中的 4757 你可以轻松进行因数分解,但对于大整数的因数分解,是一件很困难的事情,目前除了暴力破解,还没有更好的办法,如果以目前的计算速度,破解需要50年以上,则这个算法就是安全的。 维基百科这样描述:

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

目前已经破解的最大整数:

1230186684530117755130494958384962720772853569595334792197322452151726400507263657518745202199786469389956474942774063845925192557326303453731548268507917026122142913461670429214311602221240479274737794080665351419597459856902143413
=
33478071698956898786044169848212690817704794983713768568912431388982883793878002287614711652531743087737814467999489
x
36746043666799590428244633799627952632279158164343087642676032283815739666511279233373417143396810270092798736308917

即(232个十进制位,768个二进制位),目前被破解的最长RSA密钥就是768位。实际应用中 RSA 的密钥长度为 1024 位,重要场合 2048 位,未来半个世纪不可能破解。
(完)
参考文档:
RSA算法原理(二)(阮一峰)(http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
数学之美:谈谈密码学的数学原理(吴军)

如果您对文章感兴趣,请关注微信公众号搜索 somenzz 关注,或扫下方二维码关注

原文地址:https://www.cnblogs.com/tianqiang/p/11254424.html

时间: 2024-11-10 13:45:21

一文搞懂 RSA 算法的相关文章

【Data Visual】一文搞懂matplotlib数据可视化

一文搞懂matplotlib数据可视化 作者:白宁超 2017年7月19日09:09:07 摘要:数据可视化主要旨在借助于图形化手段,清晰有效地传达与沟通信息.但是,这并不就意味着数据可视化就一定因为要实现其功能用途而令人感到枯燥乏味,或者是为了看上去绚丽多彩而显得极端复杂.为了有效地传达思想概念,美学形式与功能需要齐头并进,通过直观地传达关键的方面与特征,从而实现对于相当稀疏而又复杂的数据集的深入洞察.然而,设计人员往往并不能很好地把握设计与功能之间的平衡,从而创造出华而不实的数据可视化形式,

一文搞懂蓝绿发布、灰度发布和滚动发布(转)

应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系统不间断提供服务. 长期以来,业务升级渐渐形成了几个发布策略:蓝绿发布.灰度发布和滚动发布,目的是尽可能避免因发布导致的流量丢失或服务不可用问题. 一. 蓝绿发布 项目逻辑上分为AB组,在项目系统时,首先把A组从负载均衡中摘除,进行新版本的部署.B组仍然继续提供服务. 当A组升级完毕,负载均衡重新接入A组,再把B组从负载列表中摘除,进行新版本的部署.A组重新提供服务. 最后,B组也升级完成,负载均衡重新接入B

一文搞懂vim复制粘贴

转载自本人独立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/ 概述 复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻烦的,有一点学习成本.本文总结了使用vim复制粘贴的典型场景和使用方法,希望对读者有帮助. vim内部复制.粘贴.剪切 选择文本 v+光标移动 (按字符选择)高亮选中所要的文本,然后进行各种操作(比如,d表示删除). V (按行选择) v+选中的内容+c 更改选中的文字 复制:y(ank) y 用v

一文搞懂*argv和**kwargs

大多刚接触Python的学员,会对*argv和**kwargs这两个魔法变量的用法产生困惑,今天本文将全面梳理下这两个小可爱的使用方法,让各位同学彻底搞懂它们的规则. 这两个变量主要用户函数定义,有了它俩你可以将不定数量的参数传递给一个函数.这里,需要申明下:在写Python代码时,我们习惯将它俩写成*argv和**kwargs,这只是一个书写习惯,你也可以任性地用*var和**kvars来代替它们,要注意的是符号*和**是必须写的. 函数在实际执行时,编程人员无法预先知道会被传入多少实参,这是

一文搞懂HMM(隐马尔可夫模型)

本文转自于:http://www.cnblogs.com/skyme/p/4651331.html 隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程.其难点是从可观察的参数中确定该过程的隐含参数.然后利用这些参数来作进一步的分析,例如模式识别. 是在被建模的系统被认为是一个马尔可夫过程与未观测到的(隐藏的)的状态的统计马尔可夫模型. 下面用一个简单的例子来阐述: 假设我手里有三个不同的骰子.第一个骰子是我们平常见的骰子(称这

Java基础-一文搞懂位运算

在日常的Java开发中,位运算使用的不多,使用的更多的是算数运算(+.-.*./.%).关系运算(<.>.<=.>=.==.!=)和逻辑运算(&&.||.!),所以相对来说对位运算不是那么熟悉,本文将以Java的位运算来详细介绍下位运算及其应用. 1. 位运算起源 位运算起源于C语言的低级操作,Java的设计初衷是嵌入到电视机顶盒内,所以这种低级操作方式被保留下来.所谓的低级操作,是因为位运算的操作对象是二进制位,但是这种低级操作对计算机而言是非常简单直接,友好高效

一文搞懂 Java 线程中断

在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分享的--线程中断. 下面的这断代码大家应该再熟悉不过了,线程休眠需要捕获或者抛出线程中断异常,也就是你在睡觉的时候突然有个人冲进来把你吵醒了. try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }

夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!

目录 抽象类介绍 为什么要用抽象类 一个抽象类小故事 一个抽象类小游戏 接口介绍 接口与类相似点: 接口与类的区别: 接口特性 抽象类和接口的区别 接口的使用: 接口最佳实践:设计模式中的工厂模式 接口与抽象类的本质区别是什么? 基本语法区别 设计思想区别 如何回答面试题:接口和抽象类的区别? 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl

一文搞懂基因融合(gene fusion)的定义、产生机制及鉴定方法

欢迎关注微信公众号:AIPuFuBio和使用生物信息学平台AIPuFu:www.aipufu.com. [基因融合的定义] 基因融合(gene fusion)是指由于某种机制(如基因组变异)使得两个不同基因的部分序列或全部序列融合到一起,形成了一个新的基因.如下图所示: 基因融合示意图(图片来源:https://www.tumorfusions.org/) 一般来说,基因融合是指基因组层面的融合.但转录组层面也可能发生融合,主要是由于两个不同基因转录产生的RNA,由于某种原因融合在了一起,形成新