`

跨越千年的RSA算法

 
阅读更多

     个人心得:
     核心定律为费马定律:当 n = p · q(p,q为质数) , m = (p - 1)(q - 1) ,a为小于n任意自然数,则a1+m mod n = a mod n = a
     RSA扩展:当e 乘以 d 的结果除以 m 余 1时,ae*d mod n = a mod n,即ae*d mod n = a,应用于运算e算为公钥给外界,外界加密时使用数据ae mod n = y,将原文a加密为y。私钥持有者将(y)d  mod n 即为a。
     举例:p:3,q:5,n=15,m=8,e=3(公钥),d=11(私钥)
     原文:7,公钥加密:13(Excel: =MOD(7^3,15)),解密:7(Excel:=MOD(13^11,15))

 

     转载自:http://www.matrix67.com/blog/archives/5100
     数论,数学中的皇冠,最纯粹的数学。早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的思维游戏中。直到计算机诞生之后,几千年来的数论研究成果突然有了实际的应用,这个过程可以说是最为激动人心的数学话题之一。 
    ......
     首先,找两个质数,比如说 13 和 17 。实际使用时,我们会选取大得多的质数。把它们乘在一起,得 221 。再计算出 (13 - 1) × (17 - 1) = 192。根据前面的结论,任选一个数 a ,它的 i 次方除以 221 的余数将会呈现长度为 192 的周期(虽然可能存在更短的周期)。换句话说,对于任意的一个 a,a, a193, a385, a577, ... 除以 221 都拥有相同的余数。注意到, 385 可以写成 11 × 35 ……嘿嘿,这下我们就又能变数学小魔术了。叫一个人随便想一个不超过 221 的数,比如 123 。算出 123 的 11 次方除以 221 的余数,把结果告诉你。如果他的计算是正确的,你将会得到 115 这个数。看上去,我们似乎很难把 115 还原回去,但实际上,你只需要计算 115 的 35 次方,它除以 221 的余数就会变回 123 。这是因为,对方把他所想的数 123 连乘了 11 次,得到了一个数 X ;你再把这个 X 乘以自身 35 次,这相当于你们合作把 123 连乘了 385 次,根据周期性现象,它除以 221 的余数仍然是 123 。然而,计算 35 个 X 连乘时,反正我们要取乘积除以 221 的余数,因此我们不必完整地获知 X 的值,只需要知道 X 除以 221 的余数就够了。因而,让对方只告诉你 X 取余后的结果,不会造成信息的丢失。
    不过这一次,只知道加密方法后,构造解密方法就难了。容易看出, 35 之所以能作为解密的钥匙,是因为 11 乘以 35 的结果在数列 193, 385, 577, ... 当中,它除以 192 的余数正好是 1 。因此,攻击者可以求解 11x mod 192 = 1 ,找出满足要求的密钥 x 。但关键是,他怎么知道 192 这个数?要想得到 192 这个数,我们需要把 221 分解成 13 和 17 的乘积。当最初所选的质数非常非常大时,这一点是很难办到的。
    根据这个原理,我们可以选择两个充分大的质数 p 和 q ,并算出 n = p · q 。接下来,算出 m = (p - 1)(q - 1) 。最后,找出两个数 e 和 d ,使得 e 乘以 d 的结果除以 m 余 1 。怎么找到这样的一对 e 和 d 呢?很简单。首先,随便找一个和 m 互质的数(这是可以做到的,比方说,可以不断生成小于 m 的质数,直到找到一个不能整除 m 的为止),把它用作我们的 e 。然后,求解关于 d 的方程 e · d mod m = 1(就像刚才攻击者想要做的那样,只不过我们有 m 的值而他没有)。 Bézout 定理将保证这样的 d 一定存在。
    好了,现在, e 和 n 就可以作为加密钥匙公之于众, d 和 n 则是只有自己知道的解密钥匙。因而,加密钥匙有时也被称作公钥,解密钥匙有时也被称作私钥。任何知道公钥的人都可以利用公式 c = ae mod n 把原始数据 a 加密成一个新的数 c ;私钥的持有者则可以计算 cd mod n ,恢复出原始数据 a 来。不过这里还有个大问题: e 和 d 都是上百位的大数,怎么才能算出一个数的 e 次方或者一个数的 d 次方呢?显然不能老老实实地算那么多次乘法,不然效率实在太低了。好在,“反复平方”可以帮我们快速计算出一个数的乘方。比方说,计算 a35 相当于计算 a34 · a ,也即 (a17)2 · a ,也即 (a16 · a)2 · a,也即 ((a8)2 · a)2 · a……最终简化为 ((((a2)2)2)2 · a)2 · a ,因而 7 次乘法操作就够了。在简化的过程中, a 的指数以成半的速度递减,因而在最后的式子当中,所需的乘法次数也是对数级别的,计算机完全能够承受。不过,减少了运算的次数,并没有减小数的大小。 a 已经是一个数十位上百位的大数了,再拿 a 和它自己多乘几次,很快就会变成一个计算机内存无法容纳的超级大数。怎么办呢?别忘了,“反正最后都要对乘积取余,相乘之前事先对乘数取余不会对结果造成影响”,因此我们可以在运算过程中边算边取余,每做一次乘法都只取乘积除以 n 的余数。这样一来,我们的每次乘法都是两个 n 以内的数相乘了。利用这些小窍门,计算机才能在足够短的时间里完成 RSA 加密解密的过程。
    RSA 算法实施起来速度较慢,因此在运算速度上的任何一点优化都是有益的。利用中国剩余定理,我们还能进一步加快运算速度。我们想要求的是 a35 除以 n 的余数,而 n 是两个质数 p 和 q 的乘积。由于 p 和 q 都是质数,它们显然也就互质了。因而,如果我们知道 a35 分别除以 p 和 q 的余数,也就能够反推出它除以 n 的余数了。因此,在反复平方的过程中,我们只需要保留所得的结果除以 p 的余数和除以 q 的余数即可,运算时的数字规模进一步降低到了 p 和 q 所在的数量级上。到最后,我们再借助“今有物,不知其数”的求解思路,把这两条余数信息恢复成一个 n 以内的数。更神的是,别忘了, ai 除以 p 的余数是以 p - 1 为周期的,因此为了计算 a35 mod p ,我们只需要计算 a35 mod (p-1) mod p 就可以了。类似地,由于余数的周期性现象,计算 a35 mod q 就相当于计算 a35 mod (q-1) mod q 。这样一来,连指数的数量级也减小到了和 p 、 q 相同的水平, RSA 运算的速度会有明显的提升。
     ...... 

分享到:
评论

相关推荐

    VC++实现RSA算法

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因其发明者的名字首字母而得名。在VC++中实现RSA算法需要理解其核心原理,包括大整数运算、素数检测、欧拉函数以及模逆运算...

    RSA算法工具 RSA算法

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。这种算法在信息安全领域扮演着重要角色,广泛应用于数据加密、数字签名和密钥交换等领域。 在RSA算法中,主要...

    RSA算法演示.rar

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是目前最广泛使用的公钥加密算法。它结合了大整数因子分解的数学难题,为数据传输提供了强大的安全保护。在此RAR压缩包中,...

    RSA实现算法报告关于RSA算法的实现代码

    ### RSA算法实现报告 #### 实验环境 - **硬件配置**:处理器:Intel(R) Core(TM) i5-2430M CPU @ 2.40GHz (4CPUs), ~2.4GHz;内存:2048MB RAM - **软件工具**: - 操作系统:Windows 7 旗舰版 - 开发工具:...

    RSA算法加解密

    RSA算法加解密 RSA算法是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和 Leonard Adleman。但RSA 的安全性一直未能得到...

    RSA.rar_RSA算法_寻找大素数 rsa_数论算法_简单数论

    RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。...

    RSA算法的纯Python实现(源码)

    RSA算法的纯Python实现,压缩包内共4个文件,分别是 1、大整数的运算库(当然不是算加减乘除的,这个python本身就有)。这个库是计算乘模运算,幂模运算(蒙哥马利算法),最大公约数算法及扩展最大公约数算法(扩展...

    密码学RSA算法实现代码

    RSA算法是一种非对称加密算法,它在信息安全领域扮演着重要的角色,特别是在数据加密和数字签名方面。由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。这个算法基于两个数学难题:大整数因子...

    RSA算法的C实现

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是现代密码学的基石之一。它的主要特点是使用一对密钥,即公钥和私钥,来进行加密和解密。在C语言中实现RSA算法需要理解其...

    RSA算法实验报告 通过对RSA算法的实现,深入了解RSA原理及应用

    RSA算法是一种非对称加密算法,它在信息安全领域扮演着重要的角色,特别是在数据加密和数字签名方面。由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,RSA的名字就是他们三人姓氏的首字母组合。 实验目的...

    RSA算法演示RSA算法演示

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。这种算法在信息安全领域有着广泛的应用,如数字签名、数据加密和密钥交换等。在本演示中,我们将深入探讨RSA...

    rsa.rar_RSA  C语言_RSA算法C++_RSA解密 C语言_rsa

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。这种算法基于大整数因子分解的困难性,是现代密码学的基石之一。在C语言中实现RSA算法,可以帮助我们理解其...

    RSA算法的C++实现

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,例如数字签名、数据加密等。这个压缩包文件提供了RSA算法的C++实现,包括头文件和源代码,是学习和理解RSA算法的一种实用资源。 RSA算法的核心原理...

    RSA算法试验报告

    ### RSA算法试验报告知识点概述 #### 一、引言与背景 随着信息技术的快速发展和互联网应用的日益广泛,数据安全和个人隐私保护变得尤为重要。在这一背景下,加密技术成为了确保信息在网络上传输过程中不被非法窃取...

    RSA算法原理.doc

    RSA 算法原理 RSA 算法是非对称加密算法的代表,广泛应用于计算机网络安全领域。该算法的原理基于数论,主要包括互质关系、欧拉函数、模指数运算和中国剩余定理等概念。 一、互质关系 互质关系是指两个正整数除了...

    rsa算法流程图

    rsa是密钥算法中非常著名的一种算法,在pki中非对称密钥算法的最重要的一种

    关于RSA算法的演示程序

    RSA算法是一种非对称加密算法,它是现代密码学的基石之一,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年共同提出,因此得名RSA。这种算法基于大数因子分解的困难性,是网络安全中广泛使用的加密技术,常用于...

    易语言RSA算法演示

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它在信息安全领域有着广泛的应用,如数字签名、数据加密和安全通信等。在易语言中实现RSA算法,可以帮助开发者...

    Delphi中的经典RSA算法源码示例

    **Delphi中的经典RSA算法源码示例** RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于信息安全领域,包括数据加密、数字签名等。在Delphi编程环境中,理解并实现RSA算法对于开发安全相关的应用至关...

Global site tag (gtag.js) - Google Analytics