simpleBabyEasyRSA
基础的rsa解密,按要求进行md5加密即可,代码如下:
from gmpy2 import *
from Crypto.Util.number import *
import hashlib
p = 59
q = 97
e = 37
c = 3738
n = p*q
phi_n = (p-1)*(q-1)
d = invert(e,phi_n)
m = pow(c,d,n)
print(d)
#301
print(m)
#5499
flag = 3015499
print(hashlib.md5(str(flag).encode()).hexdigest())
简单套娃
第一步,核心价值编码:
第二步,一开始以为是摩斯,就 这 ¿和不 会 吧 ?代表.和-,但每个字符间都有空格,经大佬提示才知道是阴阳怪气编码,确实够阴阳怪气的,长见识了。
第三步,摩斯密码,空格作为分隔符
注意%u7b代表"{",%u7d代表"}",即得到:0W_1QIN4WN_D_FR{DL1C_JYLPDNA3GCY}X1S3J
观察发现,左右括号的位置不太对,大概率是被移动换位了,故猜想栅栏,但试不出来,后来想到有栅栏的变体,W型,试一下,发现可以,拜大佬:
观察左括号前面的刚好与0xGame的长度一样,故猜测是凯撒加密,利用脚本:
Vigenère
基础维吉尼亚加密,利用在线工具:
Factor
from Crypto.Util.number import *
from secret import flag
m = bytes_to_long(flag)
n = 177726843226591634556244030635816071333
assert m < n
e = 0x10001
c = pow(m, e, n)
print(c)
# 49549088434190402681586345733724247189
题目提示分解,用yafu工具将n分解即可,基础rsa题:
from gmpy2 import *
from Crypto.Util.number import *
e = 65537
n = 177726843226591634556244030635816071333
c = 49549088434190402681586345733724247189
p = 18254685097880877413
q = 9735957770491659841
phi_n = (p-1)*(q-1)
d = invert(e,phi_n)
m = pow(c,d,n)
print(long_to_bytes(m))
ext_Affine
from secret import flag
import random
import gmpy2
def gen_key():
while True:
x = random.randint(1, 128)
if gmpy2.gcd(x, 128) == 1:
break
y = random.randint(1, 128)
return x, y
cipher = ""
a, b = gen_key()
for i in flag:
tmp = (ord(i) * a + b) % 128
cipher += chr(tmp)
with open("cipher.txt", "w") as f:
f.write(cipher)
with open("key.txt", "w") as f:
f.write("a = {}".format(str(a)))
f.write("\n")
f.write("b = {}".format(str(b)))
仿射加密,a、b直接给了,直接解就行:
from gmpy2 import *
from Crypto.Util.number import bytes_to_long, long_to_bytes
a = 27
b = 121
a_1 = invert(a,128)
c = ""
with open("C:\\Users\\lenovo\\Desktop\\cipher.txt") as f:
c += f.read()
res = ""
for i in range(len(c)):
m = a_1 * (ord(c[i])-b) % 128
res += chr(m)
print(res)
#0xGame{U_kn0wC@^1ot_4bout~Pyth0n}
去提交却不对,怎么也搞不懂,难道和密文格式有关?问了出题人,提示用16进制来解密,再试一试:
from gmpy2 import *
from Crypto.Util.number import bytes_to_long, long_to_bytes
a = 27
b = 121
a_1 = invert(a,128)
c = ['09', '21', '76', '34', '78', '20', '72', '70', '7E', '42', '13', '09', '06', '0D', '39', '63', '24', '2E', '35', '7E', '75', '4F', '2E', '50', '35', '43', '69', '3C', '35', '71', '09', '13', '28']
res = ""
for i in c:
m = a_1 * (int(i,16)-b) % 128
res += chr(m)
print(res)
#0xGame{U_kn0w|@^1ot_4bout~Pyth0n}
成功了
总结
题目都是基础题,但还是有难住的地方,例如见识少了,简单套娃里没见过阴阳怪气编码导致卡核,最后一题里密文格式问题。