warm_up
题目如下
1 | from Crypto.Util.number import * |
encode.py
如下:
1 | from flag import flag |
由题目可知c1
、n1
、n2
、key_encode
,由于n1、n2存在相同的因子p,因此可以计算出p、q、r,那么就要先计算出s再求n3,才能计算出Key从而求出flag
令phi1 = (p-1)*(q-1)
,由于gcd(e1,phi1)=2
因此不能直接求出
参考https://www.anquanke.com/post/id/164575
可以求出s^2 mod n1
的值
那么接下来就是 e=2,n1可被分解的rsa求解,求出n3之后就可以轻松地求出Key
,利用z3求出原始dec的值就可以得到flag了
脚本如下
1 | # -*- coding:utf8 -*- |
simple_math
由题目可知,要想求出M那就要先求出P、Q,要求P就要先知道N1、N2
1 | def gen_p(): |
由gen_N()函数可知,result = B! % A
1 | def gen_N(A,B): |
看到阶层就可以联想到wilson定理,在之前的博客中也大概写了一下wilson定理,即对于质数p,有
1 | (p-1)! mod p = -1 |
N1推导过程
1 | A为质数,B = ((A-1)//2 )! mod A , |
N2推导过程
1 | A为质数,存在 (A-2)! = 1 mod A |
求出N1、N2,P就求出来了,接下来求Q
1 | def gen_q(): |
已知ed,n,求p、q,参考如下文章
[http://soreatu.com/ctf/writeups/Writeup%20for%20easyRSA%20in%202019%E7%A5%9E%E7%9B%BE%E6%9D%AF.html#writeup-for-easyrsa-in-2019%E7%A5%9E%E7%9B%BE%E6%9D%AF](http://soreatu.com/ctf/writeups/Writeup for easyRSA in 2019神盾杯.html#writeup-for-easyrsa-in-2019神盾杯)
最终脚本如下
1 | # -*- coding:utf8 -*- |
easy_RSA
题目如下
1 | #!/usr/bin/env python |
容易得知BIT=1024,这里有一点需要注意的是异或(p+65537),不是异或p再加65537
1 | q = (2 ** bit - 1) ^ p + 65537 = (2 ** bit - 1) ^ (p + 65537) |
由于(2 ** bit - 1)的二进制全是1,因此
1 | q = (2 ** bit - 1) ^ p + 65537 = (2 ** bit - 1) - (p + 65537) |
然后通过z3求出p,就可以解出了
1 | from z3 import * |
EasyRSA
普通的共模攻击
1 | import gmpy2 |