# crypto

## BABY RSA

Solved BY : Avantika

We are given a connection to server, where we are presented with some options as follows options do as their description says, we will jump right into the quiz

Quiz #1 is pretty simple RSA challenge, here is the script to solve that

``````from Crypto.Util.number import inverse
c = ciphertext
e = e
n = n
#find p and q using factordb.com
p = p
q = q
phi = (p - 1) * (q - 1)
d = inverse(e, phi)
m = pow(c, d, n)
print(m)
``````

Quiz #2 is small e attack, we just need to take cube-root of the cipher-text and we get the plain-text

``````from decimal import Decimal
import decimal
def cube_root(x):
return Decimal(x) ** (Decimal(1) / Decimal(3))
with decimal.localcontext() as context:
context.prec = 150
print(cube_root(ciphertext))
``````

Quiz #3 is fermat-attack as the primes chosen were too close

``````import gmpy2
import math
n = n

def fermat_factor(n):
assert n % 2 != 0

a = gmpy2.isqrt(n)
b2 = gmpy2.square(a) - n

while not gmpy2.is_square(b2):
a += 1
b2 = gmpy2.square(a) - n

p = a + gmpy2.isqrt(b2)
q = a - gmpy2.isqrt(b2)

return int(p), int(q)

(p, q) = fermat_factor(n)

print("p = {}".format(p))
print("q = {}".format(q))
``````

Solving these two gives us our flag.

## UNIMOD

Solved By : Avantika

In this challenge we are given the following script along with the cipher text

unimod.py

``````import random

flag = open('flag.txt', 'r').read()
ct = ''
k = random.randrange(0,0xFFFD)
for c in flag:
ct += chr((ord(c) + k) % 0xFFFD)

open('out', 'w').write(ct)
``````

output.txt

``````饇饍饂饈饜餕饆餗餙饅餒餗饂餗餒饃饄餓饆饂餘餓饅餖饇餚餘餒餔餕餕饆餙餕饇餒餒饞飫
``````

Looking at the script we can see that a random integer is being assigned to the variable `k` , to find this integer, we can do a simple trick, as we know that first letter of flag, is going to be `f` i.e 102 in ASCII chart , we can brute-force to find `k`, here is the brute-force script

``````ct = '饇饍饂饈饜餕饆餗餙饅餒餗饂餗餒饃饄餓饆饂餘餓饅餖饇餚餘餒餔餕餕饆餙餕饇餒餒饞飫'

for k in range(0, 65533):
goal = ct
goal = ord(goal)
num = (102 - k) % 65533
if goal == num:
print(k)
break
``````

Script simple takes the first character of cipher-text, gets the ASCII value to and assigns that to `goal`then just “reverses” what the `unimod.py` script did

Next part is pretty easy, we just perform the same operation again on the cipher-text and we would get the flag

``````k = 26396
for char in ct:
print(chr((ord(char) + k) % 65533), end='')
``````

This prints out our flag.