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}