zoukankan      html  css  js  c++  java
  • 给我一对公钥和私钥,我就能破解此RSA

    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之间的整数来测试
    
  • 相关阅读:
    sql语句游标的写法
    oracle的安装与plsql的环境配置
    oracle中创建表时添加注释
    jsp中Java代码中怎么获取jsp页面元素
    sql模糊查询
    jQuery循环给某个ID赋值
    Codeforces Round #671 (Div. 2)
    TYVJ1935 导弹防御塔
    Educational Codeforces Round 95 (Rated for Div. 2)
    Codeforces Round #670 (Div. 2)
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/7896285.html
Copyright © 2011-2022 走看看