Crypto
[HNCTF 2022 Week1]A dictator
题目:
from random import randint
from secret import flagoffset = randint(1,100) % 26
# print(offset)assert flag.startswith('NSSCTF{')
assert all([ord(c) not in range(ord('A'),ord('Z')) for c in flag[7:-1]])for char in flag[7:-1]:if ord('a') <= ord(char) <= ord('z'):index = ord(char)-ord('a')new_char = chr((index+offset)%26 + ord('a'))print(new_char,end='')else:print(char,end='')# lzw_uswksj_uahzwj_ak_gfw_gx_lzw_egkl_tskau_udskkausd_uahzwjk
对字母进行循环偏移,即凯撒加密
[SWPUCTF 2022 新生赛]小明文
题目task.py
from gmpy2 import invert
from Crypto.Util.number import getPrime, bytes_to_long
from flag import getflage = 3
p = getPrime(1024)
q = getPrime(1024)
n = p * q
phiN = (p - 1) * (q - 1)
d = invert(e, phiN)
m = bytes_to_long(getflag().encode())
c = pow(m, e, n)
print("c=" + str(c))
#c=128198926274489803523728445192921664
#flag=NSSCTF{c}
e=3,则有c+kn=m^3
由于只知道c,不知道n,尝试直接开三次方
c=128198926274489803523728445192921664
e = 3
k=0
while True:if gmpy2.iroot(c+k,e)[1]:m = gmpy2.iroot(c+k,e)[0]print(long_to_bytes(m))breakk+=1
#b'ufind'
[HNCTF 2022 Week1]XXXOOORRR
题目:
from flag import flag
from Crypto.Util.number import *
import osrandBytes = [bytes_to_long(os.urandom(64)) for _ in range(3)]
m = bytes_to_long(flag)print(f'a = {randBytes[0]}')
print(f'b = {randBytes[0] ^ randBytes[1]}')
print(f'c = {randBytes[1] ^ randBytes[2]}')
print(f'd = {m ^ randBytes[0] ^ randBytes[1] ^ randBytes[2]}')'''
a = 1215421974111272707828609697064234072332368362928440865251897449605952163161176359366553487776268706107760670434157083936287598207881176904763353849369234
b = 10533604054267448009117468094542127075826310122733511023911022436253583775790861879410728001403728088545946257902341417532648419689212361977221573357292618
c = 6401236597601556248960570084212025183497657335932789785351897915858852832577623776212842429736547820800219382515052263929074210010546149322465536545021479
d = 5711309307698496426409561761492698639489294806611133698231840146911562848869711567477706456972659368849642409039245400981517493100724067475248620536111560
'''
根据 与自己本身异或为0,任何数与0异或都不变
a = 1215421974111272707828609697064234072332368362928440865251897449605952163161176359366553487776268706107760670434157083936287598207881176904763353849369234
b = 10533604054267448009117468094542127075826310122733511023911022436253583775790861879410728001403728088545946257902341417532648419689212361977221573357292618
c = 6401236597601556248960570084212025183497657335932789785351897915858852832577623776212842429736547820800219382515052263929074210010546149322465536545021479
d = 5711309307698496426409561761492698639489294806611133698231840146911562848869711567477706456972659368849642409039245400981517493100724067475248620536111560r0 = a
r1 = a^b
m = d^a^c
print(long_to_bytes(m))
#b'NSSCTF{XOR_ha5_many_propertie5_and_thi5_i5_ju5t_one_of_them}'
[FSCTF 2023]兔帽的奇妙冒险
题目描述
有一只名叫贝斯64先生的兔子。它戴着一顶古老的兔帽子,帽子上绣着奇异的符文,传说这是一种能与神秘力量连接的魔法帽子。
OFR3c05RTEFKM2Q3QkxqRGlTbWthWExxSXhrZFo3SU5DVWRkOTVFQ2JUSE1VcXpRQk9hc3hqMzRrbHRJMD0=
先base64解码
根据题目的兔子 可以推测是Rabbit编码
加上Rabbit的固定头,进行解码
[HUBUCTF 2022 新生赛]baby_encrypt
题目描述
加法?一眼破解!
baby_encrypt.txt:
781612443113954655886887407898899451044114412011257135914071455155316031651170318041861191719652013207021272183228423832485254125932643269827992924
解密:
- 提示的加法,我们已知flag的开头是NSSCTF
s='NSSCTF{'
for i in s:print(ord(i),end=' ')
#78 83 83 67 84 70 123
- 解题思路:分割前缀和+逐项相减取ASCLL码
参考WP代码
#1.分割数据
str = "1612443113954655886887407898899451044114412011257135914071455155316031651170318041861191719652013207021272183228423832485254125932643269827992924"
ls = [0, 78] # 前补0方便加密,把第一个78加进来方便分割
s = ""
for ch in str:s += chif int(s) > ls[-1]: # 因为是前缀和,取第一个比前一个大的数即可ls.append(int(s))s = ""
# print(ls)
#2.还原数据
flag = ""
for i in range(len(ls) - 1):flag += chr(ls[i + 1] - ls[i])
print(flag)
#NSSCTF{d41d8cd98f00b204e9800998ecf8427e}