Simple RSA

We are given a simple_rsa.py

This is just a typical RSA factorization attack, just fancier and forces you to either be amazing at getting code from github and/or know how RSA works

First we notice that N isn’t just made from 2 primes, it actually is 4 primes multiplied together. These 4 primes satisfy the relation

p2=10p1+c1
p3=10p2+c2
p4=10p3+c3

where c1,2,3 are some small constants so that p2,3,4 are prime and p1 is 251 bits long.

Factoring

Using p1*p4≈1000p1^2=(100p1)*(10p1)≈p2*p3, we see that this is a basic setup for fermat factorization, thus I just went to github to grab some fermat factorization code to find p1*p4 and p2*p3

p1*p4=24556891073418994576751524607635760117996811894972202516187698043229292302109114380884247668494990605537878648233446996676371523211326680052450374168750431
p2*p3=24556891073418994576751524607635760117996811894972202516187698043229292302185592473522031534536176858756163591603824821794497153855658790721132779232081801

We know that p4≈1000p1 and p3≈10p2, thus we can use coppersmith attack on it. MeePwn recently had a similar challenge where 7331q≈1337p but the last 512 bits are scrambled. For here, after some approximation using Daniel Goldston, János Pintz and Cem Yıldırım’s estimation of prime gaps(2007), I chose the error to be 17 bits, then I used p4’s code, modified a little, ran on sagecell, and got all 4 primes.

Decrypting message

Ok so we got all 4 primes, how do we decrypt?

We know that m^e mod N=c, thus we need to find a number d such that m^(ed) mod N=m=c^d

Using Euler’s theorem, we know that ed mod φ(N)=1, and since N is just a product of 4 primes, φ(n)=(p1-1)(p2-1)(p3-1)(p4-1)

With this we can easily decrypt and get the flag

p.s. I believe that p1 is 251 bits long to emulate 512-bit RSA. Notice how N=p1*p2*p3*p4≈(1000p1^2)^2, 1000p1^2 is likely to be 512 bits long(log2(10)^3+251*3=511.965784...)

Flag: ISITDTU{f6b2b7472273aacf803ecfe93607a914}