当前位置:首页 » 操作系统 » 机算法分解素因数

机算法分解素因数

发布时间: 2025-07-31 14:25:52

Ⅰ rsa加密和解密的理论依据是什么

以前也接触过RSA加密算法,感觉这个东西太神秘了,是数学家的事,和我无关。但是,看了很多关于RSA加密算法原理的资料之后,我发现其实原理并不是我们想象中那么复杂,弄懂之后发现原来就只是这样而已..
学过算法的朋友都知道,计算机中的算法其实就是数学运算。所以,再讲解RSA加密算法之前,有必要了解一下一些必备的数学知识。我们就从数学知识开始讲解。
必备数学知识
RSA加密算法中,只用到素数、互质数、指数运算、模运算等几个简单的数学知识。所以,我们也需要了解这几个概念即可。
素数
素数又称质数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。这个概念,我们在上初中,甚至小学的时候都学过了,这里就不再过多解释了。
互质数
网络上的解释是:公因数只有1的两个数,叫做互质数。;维基网络上的解释是:互质,又称互素。若N个整数的最大公因子是1,则称这N个整数互质。
常见的互质数判断方法主要有以下几种:
两个不同的质数一定是互质数。例如,2与7、13与19。
一个质数,另一个不为它的倍数,这两个数为互质数。例如,3与10、5与 26。
相邻的两个自然数是互质数。如 15与 16。
相邻的两个奇数是互质数。如 49与 51。
较大数是质数的两个数是互质数。如97与88。
小数是质数,大数不是小数的倍数的两个数是互质数。例如 7和 16。
2和任何奇数是互质数。例如2和87。
1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。
辗转相除法。
指数运算
指数运算又称乘方计算,计算结果称为幂。nm指将n自乘m次。把nm看作乘方的结果,叫做”n的m次幂”或”n的m次方”。其中,n称为“底数”,m称为“指数”。
模运算
模运算即求余运算。“模”是“Mod”的音译。和模运算紧密相关的一个概念是“同余”。数学上,当两个整数除以同一个正整数,若得相同余数,则二整数同余。
两个整数a,b,若它们除以正整数m所得的余数相等,则称a,b对于模m同余,记作: a ≡ b (mod m);读作:a同余于b模m,或者,a与b关于模m同余。例如:26 ≡ 14 (mod 12)。
RSA加密算法
RSA加密算法简史
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
公钥与密钥的产生
假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥:
随意选择两个大的质数p和q,p不等于q,计算N=pq。
根据欧拉函数,求得r = (p-1)(q-1)
选择一个小于 r 的整数 e,求得 e 关于模 r 的模反元素,命名为d。(模反元素存在,当且仅当e与r互质)
将 p 和 q 的记录销毁。
(N,e)是公钥,(N,d)是私钥。Alice将她的公钥(N,e)传给Bob,而将她的私钥(N,d)藏起来。
加密消息
假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。用下面这个公式他可以将n加密为c:

ne ≡ c (mod N)
计算c并不复杂。Bob算出c后就可以将它传递给Alice。
解密消息
Alice得到Bob的消息c后就可以利用她的密钥d来解码。她可以用以下这个公式来将c转换为n:
cd ≡ n (mod N)
得到n后,她可以将原来的信息m重新复原。
解码的原理是:
cd ≡ n e·d(mod N)
以及ed ≡ 1 (mod p-1)和ed ≡ 1 (mod q-1)。由费马小定理可证明(因为p和q是质数)
n e·d ≡ n (mod p) 和 n e·d ≡ n (mod q)
这说明(因为p和q是不同的质数,所以p和q互质)
n e·d ≡ n (mod pq)
签名消息
RSA也可以用来为一个消息署名。假如甲想给乙传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message digest),然后用她的密钥(private key)加密这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。乙获得这个消息后可以用甲的公钥解密这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么他就可以知道发信人持有甲的密钥,以及这个消息在传播路径上没有被篡改过。

RSA加密算法的安全性

当p和q是一个大素数的时候,从它们的积pq去分解因子p和q,这是一个公认的数学难题。然而,虽然RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。
1994年彼得·秀尔(Peter Shor)证明一台量子计算机可以在多项式时间内进行因数分解。假如量子计算机有朝一日可以成为一种可行的技术的话,那么秀尔的算法可以淘汰RSA和相关的衍生算法。(即依赖于分解大整数困难性的加密算法)
另外,假如N的长度小于或等于256位,那么用一台个人电脑在几个小时内就可以分解它的因子了。1999年,数百台电脑合作分解了一个512位长的N。1997年后开发的系统,用户应使用1024位密钥,证书认证机构应用2048位或以上。
RSA加密算法的缺点

虽然RSA加密算法作为目前最优秀的公钥方案之一,在发表三十多年的时间里,经历了各种攻击的考验,逐渐为人们接受。但是,也不是说RSA没有任何缺点。由于没有从理论上证明破译RSA的难度与大数分解难度的等价性。所以,RSA的重大缺陷是无法从理论上把握它的保密性能如何。在实践上,RSA也有一些缺点:
产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密;
分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,。

Ⅱ 用C语言编1到100之间的素数程序

程序及解释如下:

首先判断素数的算法:用一个数分别去除以2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。

则有如下程序

{ int m,k,i;

for(m=1;m<=100;m=m+2) //m=m+2,因为偶数都不是素数,不用考虑,所以每次m+2.

{ k=sqrt(m) //先求这个数的平方跟

for(i=2;i<=k;i++) //然后用i(从2到k,即m的平方跟)去除m,

if(m%i==0) break; //如果能被整除, 则不是素数,break

if(i>=k+1) pritnf("%d",m); //如果i>k+1,则说明没有数能整除m.则m是素数

}
}

(2)机算法分解素因数扩展阅读:

素数被利用在密码学上,所谓的公钥就是将想要传递的信息在编码时加入质数,编码之后传送给收信人,任何人收到此信息后,若没有此收信人所拥有的密钥,则解密的过程中(实为寻找素数的过程),将会因为找质数的过程(分解质因数)过久,使即使取得信息也会无意义。

在汽车变速箱齿轮的设计上,相邻的两个大小齿轮齿数设计成质数,以增加两齿轮内两个相同的齿相遇啮合次数的最小公倍数,可增强耐用度减少故障。

在害虫的生物生长周期与杀虫剂使用之间的关系上,杀虫剂的质数次数的使用也得到了证明。实验表明,质数次数地使用杀虫剂是最合理的:都是使用在害虫繁殖的高潮期,而且害虫很难产生抗药性。

以质数形式无规律变化的导弹和鱼雷可以使敌人不易拦截。

多数生物的生命周期也是质数(单位为年),这样可以最大程度地减少碰见天敌的机会。

参考资料:网络 素数



Ⅲ Hello,密码学:第三部分,公钥密码(非对称密码)算法

在 《Hello,密码学:第二部分,对称密码算法》 中讲述了对称密码的概念,以及DES和AES两种经典的对称密码算法原理。既然有对称密码的说法,自然也就有非对称密码,也叫做公钥密码算法。 对称密码和非对称密码两种算法的本质区别在于,加密密钥和解密密钥是否相同

公钥密码产生的初衷就是为了解决 密钥配送 的问题。

Alice 给远方的 Bob 写了一封情意慢慢的信,并使用强悍的 AES-256 进行了加密,但她很快就意识到,光加密内容不行,必须要想一个安全的方法将加密密钥告诉 Bob,如果将密钥也通过网络发送,很可能被技术高手+偷窥癖的 Eve 窃听到。

既要发送密钥,又不能发送密钥,这就是对称密码算法下的“密钥配送问题”

解决密钥配送问题可能有这样几种方法:

这种方法比较高效,但有局限性:

与方法一不同,密钥不再由通信个体来保存,而由密钥分配中心(KDC)负责统一的管理和分配。 双方需要加密通信时,由 KDC 生成一个用于本次通信的通信密钥交由双方,通信双方只要与 KDC 事先共享密钥即可 。这样就大大减少密钥的存储和管理问题。

因此,KDC 涉及两类密钥:

领略下 KDC 的过程:

KDC 通过中心化的手段,确实能够有效的解决方法一的密钥管理和分配问题,安全性也还不错。但也存在两个显着的问题:

使用公钥密睁衡码,加密密钥和解密密钥不同,只要拥有加密密钥,所有人都能进行加密,但只有拥有解密密钥的人才能进行解密。于是就出现了这个过程:

密钥配送的问题天然被解决了。当然,解密密钥丢失而导致信息泄密,这不枯脊属于密钥配送的问题。

下面,再详细看下这个过程。

公钥没早渗密码流程的核心,可以用如下四句话来概述:

既然加密密钥是公开的,因此也叫做 “公钥(Public Key)”
既然解密密钥是私有的,因此也叫做 “私钥(Private Key)

公钥和私钥是一一对应的,称为 “密钥对” ,他们好比相互纠缠的量子对, 彼此之间通过严密的数学计算关系进行关联 ,不能分别单独生成。

在公钥密码体系下,再看看 Alice 如何同 Bob 进行通信。

在公钥密码体系下,通信过程是由 Bob 开始启动的:

过程看起来非常简单,但为什么即使公钥被窃取也没有关系?这就涉及了上文提到的严密的数学计算关系了。如果上一篇文章对称密钥的 DES 和 AES 算法进行概述,下面一节也会对公钥体系的数学原理进行简要说明。

自从 Diffie 和 Hellman 在1976年提出公钥密码的设计思想后,1978年,Ron Rivest、Adi Shamir 和 Reonard Adleman 共同发表了一种公钥密码算法,就是大名鼎鼎的 RSA,这也是当今公钥密码算法事实上的标准。其实,公钥密码算法还包括ElGamal、Rabin、椭圆曲线等多种算法,这一节主要讲述 RSA 算法的基本数学原理。

一堆符号,解释下,E 代表 Encryption,D 代表 Decryption,N 代表 Number。

从公式种能够看出来,RSA的加解密数学公式非常简单(即非常美妙)。 RSA 最复杂的并非加解密运算,而是如何生成密钥对 ,这和对称密钥算法是不太一样的。 而所谓的严密的数学计算关系,就是指 E 和 D 不是随便选择的

密钥对的生成,是 RSA 最核心的问题,RSA 的美妙与奥秘也藏在这里面。

1. 求N

求 N 公式:N = p × q

其中, p 和 q 是两个质数 ,而且应该是很大又不是极大的质数。如果太小的话,密码就容易被破解;如果极大的话,计算时间就会很长。比如 512 比特的长度(155 位的十进制数字)就比较合适。

这样的质数是如何找出来的呢? 需要通过 “伪随机数生成器(PRNG)” 进行生成,然后再判断其是否为质数 。如果不是,就需要重新生成,重新判断。

2. 求L

求 L 公式:L = lcm(p-1, q-1)

lcm 代表 “最小公倍数(least common multiple)” 。注意,L 在加解密时都不需要, 仅出现在生成密钥对的过程中

3. 求E

E 要满足两个条件:
1)1 < E < L
2)gcd(E,L) = 1

gcd 代表 “最大公约数(greatest common divisor)” 。gcd(E,L) = 1 就代表 “E 和 L 的最大公约数为1,也就是说, E 和 L 互质 ”。

L 在第二步已经计算出来,而为了找到满足条件的 E, 第二次用到 “伪随机数生成器(PRNG)” ,在 1 和 L 之间生成 E 的候选,判断其是否满足 “gcd(E,L) = 1” 的条件。

经过前三步,已经能够得到密钥对种的 “公钥:{E, N}” 了。

4. 求D

D 要满足两个条件:
1)1 < D < L
2)E × D mod L = 1

只要 D 满足上面的两个条件,使用 {E, N} 进行加密的报文,就能够使用 {D, N} 进行解密。

至此,N、L、E、D 都已经计算出来,再整理一下

模拟实践的过程包括两部分,第一部分是生成密钥对,第二部分是对数据进行加解密。为了方便计算,都使用了较小的数字。

第一部分:生成密钥对

1. 求N
准备两个质数,p = 5,q = 7,N = 5 × 7 = 35

2. 求L
L = lcm(p-1, q-1) = lcm (4, 6) = 12

3. 求E
gcd(E, L) = 1,即 E 和 L 互质,而且 1 < E < L,满足条件的 E 有多个备选:5、7、11,选择最小的 5 即可。于是,公钥 = {E, N} = {5, 35}

4. 求D
E × D mod L = 1,即 5 × D mod 12 = 1,满足条件的 D 也有多个备选:5、17、41,选择 17 作为 D(如果选择 5 恰好公私钥一致了,这样不太直观),于是,私钥 = {D, N} = {17, 35}

至此,我们得到了公私钥对:

第二部分:模拟加解密

明文我们也使用一个比较小的数字 -- 4,利用 RSA 的加密公式:

密文 = 明文 ^ E mod N = 4 ^ 5 mod 35 = 9
明文 = 密文 ^ D mod N = 9 ^ 17 mod 35 = 4

从这个模拟的小例子能够看出,即使我们用了很小的数字,计算的中间结果也是超级大。如果再加上伪随机数生成器生成一个数字,判断其是否为质数等,这个过程想想脑仁儿就疼。还好,现代芯片技术,让计算机有了足够的运算速度。然而,相对于普通的逻辑运算,这类数学运算仍然是相当缓慢的。这也是一些非对称密码卡/套件中,很关键的性能规格就是密钥对的生成速度

公钥密码体系中,用公钥加密,用私钥解密,公钥公开,私钥隐藏。因此:

加密公式为:密文 = 明文 ^ E mod N

破译的过程就是对该公式进行逆运算。由于除了对明文进行幂次运算外, 还加上了“模运算” ,因此在数学上, 该逆运算就不再是简单的对数问题,而是求离散对数问题,目前已经在数学领域达成共识,尚未发现求离散对数的高效算法

暴力破解的本质就是逐个尝试。当前主流的 RSA 算法中,使用的 p 和 q 都是 1024 位以上,这样 N 的长度就是 2048 位以上。而 E 和 D 的长度和 N 差不多,因此要找出 D,就需要进行 2048 位以上的暴力破解。即使上文那个简单的例子,算出( 蒙出 ) “9 ^ D mod 35 = 4” 中的 D 也要好久吧。

因为 E 和 N 是已知的,而 D 和 E 在数学上又紧密相关(通过中间数 L),能否通过一种反向的算法来求解 D 呢?

从这个地方能够看出,p 和 q 是极为关键的,这两个数字不泄密,几乎无法通过公式反向计算出 D。也就是说, 对于 RSA 算法,质数 p 和 q 绝不能被黑客获取,否则等价于交出私钥

既然不能靠抢,N = p × q,N是已知的,能不能通过 “质因数分解” 来推导 p 和 q 呢?或者说, 一旦找到一种高效的 “质因数分解” 算法,就能够破解 RSA 算法了

幸运的是,这和上述的“离散对数求解”一样,当下在数学上还没有找到这种算法,当然,也无法证明“质因数分解”是否真的是一个困难问题 。因此只能靠硬算,只是当前的算力无法在可现实的时间内完成。 这也是很多人都提到过的,“量子时代来临,当前的加密体系就会崩溃”,从算力的角度看,或许如此吧

既不能抢,也不能算,能不能猜呢?也就是通过 “推测 p 和 q 进行破解”

p 和 q 是通过 PRNG(伪随机数生成器)生成的,于是,又一个关键因素,就是采用的 伪随机数生成器算法要足够随机

随机数对于密码学极为重要,后面会专门写一篇笔记

前三种攻击方式,都是基于 “硬碰硬” 的思路,而 “中间人攻击” 则换了一种迂回的思路,不去尝试破解密码算法,而是欺骗通信双方,从而获取明文。具体来说,就是: 主动攻击者 Mallory 混入发送者和接收者之间,面对发送者伪装成接收者,面对接收者伪装成发送者。

这个过程可以重复多次。需要注意的是,中间人攻击方式不仅能够针对 RSA,还可以针对任何公钥密码。能够看到,整个过程中,公钥密码并没有被破译,密码体系也在正常运转,但机密性却出现了问题,即 Alice 和 Bob 之间失去了机密性,却在 Alice 和 Mallory 以及 Mallory 和 Bob 之间保持了机密性。即使公钥密码强度再强大 N 倍也无济于事。也就是说,仅仅依靠密码算法本身,无法防御中间人攻击

而能够抵御中间人攻击的,就需要用到密码工具箱的另一种武器 -- 认证 。在下面一篇笔记中,就将涉及这个话题。

好了,以上就是公钥密码的基本知识了。

公钥密码体系能够完美的解决对称密码体系中 “密钥配送” 这个关键问题,但是抛开 “中间人攻击” 问题不谈,公钥密码自己也有个严重的问题:

公钥密码处理速度远远低于对称密码。不仅体现在密钥对的生成上,也体现在加解密运算处理上。

因此,在实际应用场景下,往往会将对称密码和公钥密码的优势相结合,构建一个 “混合密码体系” 。简单来说: 首先用相对高效的对称密码对消息进行加密,保证消息的机密性;然后用公钥密码加密对称密码的密钥,保证密钥的机密性。

下面是混合密码体系的加解密流程图。整个体系分为左右两个部分:左半部分加密会话密钥的过程,右半部分是加密原始消息的过程。原始消息一般较长,使用对称密码算法会比较高效;会话密钥一般比较短(十几个到几十个字节),即使公钥密码算法运算效率较低,对会话密钥的加解密处理也不会非常耗时。

着名的密码软件 PGP、SSL/TLS、视频监控公共联网安全建设规范(GB35114) 等应用,都运用了混合密码系统。

好了,以上就是公钥密码算法的全部内容了,拖更了很久,以后还要更加勤奋一些。

为了避免被傻啦吧唧的审核机器人处理,后面就不再附漂亮姑娘的照片(也是为了你们的健康),改成我的摄影作品,希望不要对收视率产生影响,虽然很多小伙儿就是冲着姑娘来的。

就从喀纳斯之旅开始吧。

热点内容
sqlifnotexists 发布:2025-08-02 02:02:14 浏览:127
如何制作服务器的悬空标题字 发布:2025-08-02 01:57:49 浏览:843
唱吧上传撤销 发布:2025-08-02 01:48:11 浏览:693
局域网服务器不能用ip访问 发布:2025-08-02 01:47:20 浏览:540
c语言日志 发布:2025-08-02 01:39:14 浏览:489
详细编程 发布:2025-08-02 01:17:13 浏览:349
怎么查看wifi的密码 发布:2025-08-02 00:46:24 浏览:929
linux工具开发 发布:2025-08-02 00:44:52 浏览:688
c语言编程我爱你 发布:2025-08-02 00:40:12 浏览:946
车铣复合加工编程 发布:2025-08-02 00:39:21 浏览:49