声明:该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。
0x00 前言
week1还是比较简单的,但是古典密码我是真的头疼,有些卡了好久。
0X01 题目详解
brainfuck
题目:++++++++[>>++>++++>++++++>++++++++>++++++++++>++++++++++++>++++++++++++++>++++++++++++++++>++++++++++++++++++>++++++++++++++++++++>++++++++++++++++++++++>++++++++++++++++++++++++>++++++++++++++++++++++++++>++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>++++++.>----.<-----.>-----.>-----.<<<-.>>++..<.>.++++++.....------.<.>.<<<<<+++.>>>>+.<<<+++++++.>>>+.<<<-------.>>>-.<<<+.+++++++.--..>>>>---.-.<<<<-.+++.>>>>.<<<<-------.+.>>>>>++.
没啥说的,随波一把梭
Caesar's Secert
题目:kqfl{hf3x4w'x_h1umjw_n5_a4wd_3fed}
凯撒加密,随波一把梭了
Fence
题目:fa{ereigtepanet6680}lgrodrn_h_litx#8fc3
w型栅栏,随波梭了
古典密码还是建议大家自己去看看加解密原理,不然遇到梭不动的,就头疼了
Vigenère
题目:
维吉尼亚加密,这种没有key的,可以去专门的网站上爆破
https://www.guballa.de/vigenere-solver
但是没直接爆破出来,查看备选的key挨个试
发现kyc这个key很像,猜测key为kfc进行尝试,得到正确结果
babyrsa
题目:
from Crypto.Util.number import *
from flag import flag
def gen_prime(n):
res = 1
for i in range(15):
res *= getPrime(n)
return res
if __name__ == '__main__':
n = gen_prime(32)
e = 65537
m = bytes_to_long(flag)
c = pow(m,e,n)
print(n)
print(c)
# 17290066070594979571009663381214201320459569851358502368651245514213538229969915658064992558167323586895088933922835353804055772638980251328261
# 14322038433761655404678393568158537849783589481463521075694802654611048898878605144663750410655734675423328256213114422929994037240752995363595
n很小,尝试进行分解,可以使用在线网站
http://factordb.com/index.php
分解出10多个素数,根据欧拉定理,phi等于每个素数-1的乘积。
解题脚本:
from Crypto.Util.number import *
import gmpy2
c = 14322038433761655404678393568158537849783589481463521075694802654611048898878605144663750410655734675423328256213114422929994037240752995363595
e = 65537
n = 17290066070594979571009663381214201320459569851358502368651245514213538229969915658064992558167323586895088933922835353804055772638980251328261
p = [2217990919,2338725373, 2370292207,2463878387,2706073949,2794985117,2804303069,2923072267,2970591037,3207148519, 3654864131, 3831680819, 3939901243, 4093178561, 4278428893]
phi = 1
for p1 in p:
phi *= (p1-1)
d = gmpy2.invert(e, phi)
m = pow(c,d,n)
print(long_to_bytes(m))
Small d
题目:
from secret import flag
from Crypto.Util.number import *
p = getPrime(1024)
q = getPrime(1024)
d = getPrime(32)
e = inverse(d, (p-1)*(q-1))
n = p*q
m = bytes_to_long(flag)
c = pow(m,e,n)
print(c)
print(e)
print(n)
# c = 6755916696778185952300108824880341673727005249517850628424982499865744864158808968764135637141068930913626093598728925195859592078242679206690525678584698906782028671968557701271591419982370839581872779561897896707128815668722609285484978303216863236997021197576337940204757331749701872808443246927772977500576853559531421931943600185923610329322219591977644573509755483679059951426686170296018798771243136530651597181988040668586240449099412301454312937065604961224359235038190145852108473520413909014198600434679037524165523422401364208450631557380207996597981309168360160658308982745545442756884931141501387954248
# e = 8614531087131806536072176126608505396485998912193090420094510792595101158240453985055053653848556325011409922394711124558383619830290017950912353027270400567568622816245822324422993074690183971093882640779808546479195604743230137113293752897968332220989640710311998150108315298333817030634179487075421403617790823560886688860928133117536724977888683732478708628314857313700596522339509581915323452695136877802816003353853220986492007970183551041303875958750496892867954477510966708935358534322867404860267180294538231734184176727805289746004999969923736528783436876728104351783351879340959568183101515294393048651825
# n = 19873634983456087520110552277450497529248494581902299327237268030756398057752510103012336452522030173329321726779935832106030157682672262548076895370443461558851584951681093787821035488952691034250115440441807557595256984719995983158595843451037546929918777883675020571945533922321514120075488490479009468943286990002735169371404973284096869826357659027627815888558391520276866122370551115223282637855894202170474955274129276356625364663165723431215981184996513023372433862053624792195361271141451880123090158644095287045862204954829998614717677163841391272754122687961264723993880239407106030370047794145123292991433
高加密指数e,小解密指数d,维纳攻击,板子题。RSAwienerHacker是第三方包,网上可以找到
import gmpy2
import binascii
import RSAwienerHacker
c = 6755916696778185952300108824880341673727005249517850628424982499865744864158808968764135637141068930913626093598728925195859592078242679206690525678584698906782028671968557701271591419982370839581872779561897896707128815668722609285484978303216863236997021197576337940204757331749701872808443246927772977500576853559531421931943600185923610329322219591977644573509755483679059951426686170296018798771243136530651597181988040668586240449099412301454312937065604961224359235038190145852108473520413909014198600434679037524165523422401364208450631557380207996597981309168360160658308982745545442756884931141501387954248
e = 8614531087131806536072176126608505396485998912193090420094510792595101158240453985055053653848556325011409922394711124558383619830290017950912353027270400567568622816245822324422993074690183971093882640779808546479195604743230137113293752897968332220989640710311998150108315298333817030634179487075421403617790823560886688860928133117536724977888683732478708628314857313700596522339509581915323452695136877802816003353853220986492007970183551041303875958750496892867954477510966708935358534322867404860267180294538231734184176727805289746004999969923736528783436876728104351783351879340959568183101515294393048651825
n = 19873634983456087520110552277450497529248494581902299327237268030756398057752510103012336452522030173329321726779935832106030157682672262548076895370443461558851584951681093787821035488952691034250115440441807557595256984719995983158595843451037546929918777883675020571945533922321514120075488490479009468943286990002735169371404973284096869826357659027627815888558391520276866122370551115223282637855894202170474955274129276356625364663165723431215981184996513023372433862053624792195361271141451880123090158644095287045862204954829998614717677163841391272754122687961264723993880239407106030370047794145123292991433
d = RSAwienerHacker.hack_RSA(e, n)
m = gmpy2.powmod(c, d, n)
print(d)
print(binascii.unhexlify(hex(m)[2:]))
babyxor
题目:
from secret import *
ciphertext = []
for f in flag:
ciphertext.append(f ^ key)
print(bytes(ciphertext).hex())
# e9e3eee8f4f7bffdd0bebad0fcf6e2e2bcfbfdf6d0eee1ebd0eabbf5f6aeaeaeaeaeaef2
看题目,是用一个key和flag的每个字符异或。那么解题就是应该找到key,然后再和密文每个字段异或回来。
根据之前的flag,发现flag格式为:flag{xxxx}。所以我们先取密文前四位和flag异或,得到key为x8f,然后就能解密
from pwn import *
m = bytes.fromhex('e9e3eee8f4f7bffdd0bebad0fcf6e2e2bcfbfdf6d0eee1ebd0eabbf5f6aeaeaeaeaeaef2')
print(m)
print(xor(m[0:4], b'flag'))
print(xor(m, b'x8f'))
babyencoding
题目:part 1 of flag: ZmxhZ3tkYXp6bGluZ19lbmNvZGluZyM0ZTBhZDQ= part 2 of flag: MYYGGYJQHBSDCZJRMQYGMMJQMMYGGN3BMZSTIMRSMZSWCNY= part 3 of flag: =8S4U,3DR8SDY,CS-F5F-C(S,S<R-C
Q9F8S87T`
第一段是base64,第二段是base32,随波可以梭
但是第三段UUencode,随波梭出来有问题,找个在线网站能梭出来末尾}
flag{dazzling_encoding#4e0ad4 f0ca08d1e1d0f10c0c7afe422fea7 c55192c992036ef623372601ff3a}
flag{dazzling_encoding#4e0ad4f0ca08d1e1d0f10c0c7afe422fea7c55192c992036ef623372601ff3a}
Affine
题目:
from flag import flag, key
modulus = 256
ciphertext = []
for f in flag:
ciphertext.append((key[0]*f + key[1]) % modulus)
print(ciphertext)
print(bytes(ciphertext).hex())
# dd4388ee428bdddd5865cc66aa5887ffcca966109c66edcca920667a88312064
仿射密码,最后输出的结果是十六进制字符串,先要还原成ascii码数组,前四位对应的ascii码为[221, 67, 136, 238]
然后根据之前的提示,flag前四位就是flag,所以先进行a,b值的爆破,爆破出a=17,b=23时,能把flag加密成对应的ascii码数组
然后根据解密公式套入a,b值就可以进行解密,注意求a在模数256上的乘法逆元
import gmpy2
from Crypto.Util.number import *
c = 'dd4388ee428bdddd5865cc66aa5887ffcca966109c66edcca920667a88312064'
c=[int(c[i:i+2],16) for i in range(0,len(c),2)]
print(c)
modulus = 256
flag_ = b'flag'
for a in range(100):
for b in range(100):
ciphertext = []
for f in flag_:
ciphertext.append((a * f + b) % modulus)
print(ciphertext)
if ciphertext == [221, 67, 136, 238]:
print('a=',a)
print('b=',b)
break
a = 17
b = 23
ni=gmpy2.invert(a,modulus)
flag=''
for i in c:
f = ni*(i - b) % modulus
flag+=chr(f)
print(flag)
babyaes
题目:
from Crypto.Cipher import AES
import os
from flag import flag
from Crypto.Util.number import *
def pad(data):
return data + b"".join([b'x00' for _ in range(0, 16 - len(data))])
def main():
flag_ = pad(flag)
key = os.urandom(16) * 2
iv = os.urandom(16)
print(bytes_to_long(key) ^ bytes_to_long(iv) ^ 1)
aes = AES.new(key, AES.MODE_CBC, iv)
enc_flag = aes.encrypt(flag_)
print(enc_flag)
if __name__ == "__main__":
main()
# 3657491768215750635844958060963805125333761387746954618540958489914964573229
# b'>]xc1xe5x82/x02x7ftxf1Bx8dnxc1x95i'
ACTF新生赛2020的一道原题(9成原题,多了个异或1)
整体观察一下,发现是CBC模式下的AES。key是32字节(256bits),iv是16字节(128bits),所以两者异或的结果其实是key的低128bits与iv异或,再加上key的高128bits。即输出结果的高128bits就是key的高128bits,从而能得到key。
这里需要注意的一点是,输出的结果的高位部分在左侧,低位部分在右侧
得到了key之后,取低128bits再与输出结果的低128bits进行异或得到iv
from Crypto.Cipher import AES
from Crypto.Util.number import *
enc_flag = b'>]xc1xe5x82/x02x7ftxf1Bx8dnxc1x95i'
xor = 3657491768215750635844958060963805125333761387746954618540958489914964573229 ^ 1
print(xor)
key = long_to_bytes(xor)[:16] * 2
iv = bytes_to_long(key[16:]) ^ bytes_to_long(long_to_bytes(xor)[16:])
iv = long_to_bytes(iv)
aes = AES.new(key, AES.MODE_CBC, iv)
flag = aes.decrypt(enc_flag)
print(flag)
flag为flag{firsT_cry_Aes}
原文始发于微信公众号(夜安团队SEC):buuctf newstar 2023 公开赛-ctrpto-week1-writeup
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论