0xGame Crypto 复现(Week1)

simpleBabyEasyRSA

f4f6834af8be45d4850a6c0b17eb638a.png

基础的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())

简单套娃

49c8fdebddc24ab396a64e2cecb7f0d6.png

 第一步,核心价值编码:

f075410326b6416d8568e8483b83a2bf.png

第二步,一开始以为是摩斯,就 这 ¿和不 会 吧 ?代表.和-,但每个字符间都有空格,经大佬提示才知道是阴阳怪气编码,确实够阴阳怪气的,长见识了。

518575ee901c4e3f849777d80e1bc1e9.png

第三步,摩斯密码,空格作为分隔符

a7f0581e598f4a27b175de4272f886f8.png注意%u7b代表"{",%u7d代表"}",即得到:0W_1QIN4WN_D_FR{DL1C_JYLPDNA3GCY}X1S3J

观察发现,左右括号的位置不太对,大概率是被移动换位了,故猜想栅栏,但试不出来,后来想到有栅栏的变体,W型,试一下,发现可以,拜大佬:

7a1774e16bca41d6a04f68b8a1c01495.png

观察左括号前面的刚好与0xGame的长度一样,故猜测是凯撒加密,利用脚本:

be4e8233b75b4669924e217143e7f5f0.png

Vigenère

8a4044c30e764a14bd648aa6de0c0d96.png

基础维吉尼亚加密,利用在线工具:

04b7d57e064c4cec852bc6cca1338834.png

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

0049a20bd55a431d9d72939639e4ce59.png

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}

成功了

总结

题目都是基础题,但还是有难住的地方,例如见识少了,简单套娃里没见过阴阳怪气编码导致卡核,最后一题里密文格式问题。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值