encrypt
from base64 import b64encode as b32encode
from gmpy2 import invert,gcd,iroot
from Crypto.Util.number import *
from binascii import a2b_hex,b2a_hex
import random
flag = "******************************"
nbit = 128
p = getPrime(nbit)
q = getPrime(nbit)
n = p*q
print p
print n
phi = (p-1)*(q-1)
e = random.randint(50000,70000)
while True:
if gcd(e,phi) == 1:
break;
else:
e -= 1;
c = pow(int(b2a_hex(flag),16),e,n)
print b32encode(str(c))[::-1]
# 2373740699529364991763589324200093466206785561836101840381622237225512234632
decrypt
这道题有个坑:from base64 import b64encode as b32encode
把b64encode 取别名b32encode 了。
p = 177077389675257695042507998165006460849
n = 37421829509887796274897162249367329400988647145613325367337968063341372726061
q=n//p
phi=(p-1)*(q-1)
import gmpy2
li=[]
for i in range(50000,70000):
e=i
while True:
if gmpy2.gcd(e, phi) == 1:
break
else:
e -= 1
li.append(e)
c ='==gMzYDNzIjMxUTNyIzNzIjMyYTM4MDM0gTMwEjNzgTM2UTN4cjNwIjN2QzM5ADMwIDNyMTO4UzM2cTM5kDN2MTOyUTO5YDM0czM3MjM'
c=c[::-1]#字符串求反
import base64
c=int(base64.b64decode(c))
from Crypto.Util import number
for e in li:
d=gmpy2.invert(e,phi)
try:
print(number.long_to_bytes(gmpy2.powmod(c,d,n)).decode())
except:
continue
#flag{rs4_1s_s1mpl3!#}