码迷,mamicode.com
首页 > 其他好文 > 详细

给我一对公钥和私钥,我就能破解此RSA

时间:2017-11-25 21:38:15      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:加密   logs   test   div   int   code   证明   公钥   过程   

RSA密码系统如果暴露了一套公钥和私钥,那么这套密码系统就全部失效了。因为根据公钥和私钥可以完成大整数的分解、暴露了两个质数。
记公钥为e,私钥为d,因为ed%phi=1,所以就得到了一个k=ed-1,它是phi的整数倍。
随机选择一个2~n之间的整数x,当x的k次幂模n等于1并且k为偶数时,k/=2。
最终求x^k-1和n的最大公约数,此值即为两个质数中的一个。

至于如何证明,我天资愚钝,不需要强行明白此理。

"""
在RSA中,给我一对公钥和私钥,我就可以完成n的大整数分解
RSA过程:
* 先求出两个大质数p,q
* 计算n=pq和phi=(p-1)(q-1)
* 找一个公钥e(e必须和phi互质才行),根据ed%phi=1找出d来
* 加密时:y=x^e%n
* 解密时:y=x^d%n
"""


def gcd(x, y):
    return x if y == 0 else gcd(y, x % y)


def pow(a, x, n):
    #模幂乘法
    ans = 1
    for i in range(x):
        ans = (ans * a) % n
    return ans
def extend_gcd(x,n):
    #扩展欧几里得法:求x关于n的逆元
    if n==0:return 1,0,x
    b,a,d=extend_gcd(n,x%n)
    b-=x//n*a
    return a,b,d

p, q = 7, 13
n = p * q
phi = (p - 1) * (q - 1)
e=7
d=extend_gcd(e,phi)[0]
k = e*d-1 #已知e,d,求p,q



def test(a):
    x = k 
    while pow(a, x, n) % n == 1 and x % 2 == 0: x //= 2
    print(gcd(pow(a, x, n) - 1, n), a, x)


import random

for i in range(2, n):
    test(random.randint(2, n))#使用随机产生的2~n之间的整数来测试

给我一对公钥和私钥,我就能破解此RSA

标签:加密   logs   test   div   int   code   证明   公钥   过程   

原文地址:http://www.cnblogs.com/weidiao/p/7896285.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!