RSA笔记

来源:互联网 发布:c语言经典编程282例txt 编辑:程序博客网 时间:2024/06/07 05:11

      RSA属于非对称加密算法,因为RSA使用了两个不同的密钥分别用于加密和解密,这两个密钥称之为公私钥对,其中公钥用于加密,且公钥是公开的,而私钥用于解密,私钥是私有的。

      RSA的计算过程如下:

      1. 找到两个大素数p和q,计算出n = pq;

      2. 计算出φ(n) = (p-1)*(q-1),选择一个e,满足1 < e <φ(n),且gcd(φ(n), e) = 1;

      3. 计算出d,使得d满足ed % φ(n) = 1;

          此时,已经生成了公私钥对,其中(e, n)为公钥,(d, n)为私钥。

      4. 对于明文M,有密文C = M^e % n,此为加密过程;

      5. 对于密文C,有明文M = C^d % n,此为解密过程;

练习 :

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

题目描述:

      给定RSA密文[971,922,605,1446,1704,889,2090,605,1899,1915,2088,1988,1235,1032,65,922,958,1988,2144,591,1988,2270,2088,1032,65,958,2233],已知RSA的公钥为{7,2449},请还原出对应的明文。

考察意图:

      考察选手对RSA加密算法的了解,以及基本的RSA算法攻击方法。

质因数分解

      RSA面临的一种攻击方式为数学攻击,实质上就是试图分解两个素数的乘积,给定RSA的公钥{e, n},根据RSA的定义,如果能够将n分解为两个素数的乘积,即n = pq,那么就可以计算出d了,也就是得到私钥{d, n}。

      需要指出的是,如果n非常大,那么这样的攻击基本上是不可行的,以Gmail为例,其n的长度为256字节,即所说的2048位,就目前的计算条件而言,在私钥不泄露的情况下是安全的。对于本题给定的n=2449而言,我们可以轻易的将其分解为两个素数的乘积

------------------------------------------------------------

私钥获取 

      在实验步骤一中,我们已经将2449分解为31与79的乘积,即p=31,q=79,因此可以计算出φ(n) = (p-1)*(q-1) = 30*78 = 2340,现在已经给定了e=7,只需要找到一个d,使得ed % φ(n) = 1即可。在数据量很小的情况下,这里直接枚举也是可以求出d的,但是更加正式的方法是使用扩展欧几里得算法进行求解。

      对于扩展欧几里得算法的具体求解过程,因为篇幅原因这里不进行讲解,有兴趣的同学可以查阅相关资料。这里主要讲解为什么通过扩展欧几里得算法可以求出d。

      对于给定的两个数a和b,扩展欧几里得可以求出最大公约数gcd(a,b)以及x,y使得:

      ax + by = gcd(a, b)

      在RSA中,已知φ(n)和e,要求求出d,使得ed % φ(n) = 1。应用到扩展欧几里得算法中,另a=φ(n),b=e,已知            gcd(φ(n), e) = 1,则有:

      φ(n)*x + e*y = 1

      因为φ(n)*x %φ(n) = 0,所以自然有ey %φ(n) = 1,即扩展欧几里得求出的y就是我们所要的d。需要注意的是,求出来的y可能是负数,因此y需要不断的加上φ(n),直到大于0,因为φ(n)*x + e*y =φ(n)*(x-e) + e*(y+φ(n))

-----------------------------------------------

RSA解密

      经过前面的推导分析,我们已经成功计算出了RSA的私钥{d, n},现在只需要执行解密操作即可,解密过程为C^d % n。但是现在面临的一个问题是,在计算C^d时可能存在一些问题,比如当C和d都非常大时,C^d的计算可能非常耗时且结果非常大,实际上并不需要计算出完整的C^d,这里可以在数学上做一些优化,具体不进行讲解,有兴趣请自行查阅了解。Python自带的pow函数可以快速计算出C^d % n,即pow(C, d, n)



对于学习理解RSA    我想这些应该是最主要的内容了  精炼~~~~~~~~~~~~~~~~~~~~~~脚本不附上 可自行练习编写~

1 0