美文网首页
RSA破解作业

RSA破解作业

作者: qzuser_f77d | 来源:发表于2017-11-09 19:38 被阅读0次

题目:

Alice decides to use RSA with the public key N = 1889570071. In order to guard against transmission errors, Alice has Bob encrypt his message twice, once using the encryption exponent e1 = 1021763679 and once using the encryption exponent e2 = 519424709. Eve intercepts the two encrypted messages
c1 = 1244183534 and c2 = 732959706. Assuming that Eve also knows N and the two encryption exponents e1 and e2. Please help Eve recover Bob’s plaintext without finding a factorization of N.

由于两次加密,只是公钥的指数e变化,而公钥和私钥的模数N没有变化,此时,就可能出现共模攻击。
共模攻击利用的大前提就是,RSA体系在生成密钥的过程中使用了相同的模数N。
题中的Bob用公钥加密了同一条信息M,就是
c1 = M^e1 % N
c2 = M^e2 % N
此时,Alice可以通过私钥来解密
M = c1^d1 % N
M = c2^d2 % N
得到明文M。
如果攻击者获得了c1,c2,知道密钥中的N,e1,e2,则可以在不知道d1,d2的情况下,解出M。
首先由于e1,e2都是质数,所以两者互质,即
gcd(e1, e2) = 1
此时则有
e1*t1 + e2*t2 = 1
式中,t1、t2皆为整数,但是一正一负。
通过扩展欧几里得算法,我们可以得到该式子的一组解(t1, t2),假设t1为正数,t2为负数。因为:
c1 = M^e1 % N
c2 = M^e2 % N
所以
(c1^t1 * c2^t2) % N = ((M^e1 % N)^t1 * (M^e2 % N)^t2) % N
根据模运算性质,可以化简为
(c1^t1 * c2^t2) % N = ((M^e1)^t1 * (M^e2)^t2) % N

(c1^t1 * c2^t2) % N = (M^(e1^t1 + e2^t2)) % N
又前面提到
e1*t1 + e2*t2 = 1
所以
(c1^t1 * c2^t2) % N = (M^1) % N
(c1^t1 * c2^t2) = M
不过,M是小于N的数值,所以
M = (c1^t1 *c2^t2) % N
就是说,当N不变时,知道n,e1,e2,c1,c2可以在不知道d1,d2情况下,解密得到明文M。
由于t2是负数,而在数论模运算中,要求一个数的负数次幂,与常规方法并不一样。比如此处要求c2的t2次幂,就要先计算c2的模反元素c2r,然后求c2r的-t2次幂。
Python程序解法如下:

def egcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = egcd(b % a, a)
    return (g, x - (b // a) * y, y)
def modinv(a, m):
    g, x, y = egcd(a, m)
    if g != 1:
        raise Exception('modular inverse does not exist')
    else:
        return x % m
def main():
    n = int(input("input n:"))
    c1 = int(input("input c1:"))
    c2 = int(input("input c2:"))=
    e1 = int(input("input e1:"))
    e2 = int(input("input e2:"))
    s = egcd(e1, e2)
    s1 = s[1]
    s2 = s[2]
    # 求模反元素
    if s1<0:
        s1 = - s1
        c1 = modinv(c1, n)
    elif s2<0:
        s2 = - s2
        c2 = modinv(c2, n)
    m = (pow(c1, s1, n) * pow(c2, s2, n)) % n #m = (c1**s1)*(c2**s2)%n
    print (m)
if __name__ == '__main__':
    main()

其中,代入数值:
n = 1889570071
c1 = 1244183534
c2 = 732959706
e1 = 1021763679
e2 = 519424709
由此得到最后的明文M为1054592380。

相关文章

  • RSA破解作业

    Alice decides to use RSA with the public key N = 18895700...

  • RSA破解作业

    算法思想: 加密过程:c=M^e mod N。解密过程:M=c^d mod N。取c1=2^e mod N,将c和...

  • RSA破解作业

    截至:11月07日23:59提交作业 Alice decides to use RSA with the publ...

  • RSA破解作业

    题目: Alice decides to use RSA with the public key N = 1889...

  • RSA破解作业

    题目 Alice decides to use RSA with the public key N = 18895...

  • RSA破解作业

    Problem: Alice decides to use RSA with the public key N =...

  • RSA破解

    问题: Alice decides to use RSA with the public key N = 1889...

  • RSA破解

    转载请注明出处:http://www.jianshu.com/p/64dcc0133394 题目: You are...

  • 密码学初见

    最早的密码学: 密码本加密 持续到了上世纪的70年代 RSA加密 只能通过因式分解的方式来破解,破解难度巨大rsa...

  • 简单RSA破解

    问题描述 Alice decides to use RSA with the public key N = 188...

网友评论

      本文标题:RSA破解作业

      本文链接:https://www.haomeiwen.com/subject/mscumxtx.html