日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[NCTF2019]Reverse

發(fā)布時(shí)間:2025/3/21 编程问答 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [NCTF2019]Reverse 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[NCTF2019]Reverse

題目

汮S賳!Ⅳ?Z_l,?漋& hDa蕕&5匼?oZ€|U€骸%#}巴 import os import pyDesflag = "NCTF{******************************************}" key = os.urandom(8)d = pyDes.des(key) cipher = d.encrypt(flag.encode())with open('cipher', 'wb') as f:f.write(cipher)# Leak: d.Kn[10] == [0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1]

解題

讀程序

pyDes模塊:
pyDes.des(key, [mode], [IV], [pad], [padmode])
pyDes.triple_des(key, [mode], [IV], [pad], [padmode])

key->包含加密密鑰的字節(jié)。DES為8字節(jié),16或24字節(jié)

三重DES
mode -> 加密類型的可選參數(shù),可以是pyDes.ECB(電子碼本)或pyDes.CBC(密碼區(qū)塊鏈)
IV -> 可選初始值字節(jié),如果使用CBC模式,則必須提供。長(zhǎng)度必須為8字節(jié)。
pad -> Optional參數(shù),將pad字符(pad\u NORMAL)設(shè)置為在使用此實(shí)例完成的所有加密/解密操作。
padmode -> 可選參數(shù),設(shè)置填充模式(PAD_NORMAL或PAD_PKCS5)在對(duì)此實(shí)例執(zhí)行的所有加密/解密操作期間使用。

encrypt(data, [pad], [padmode])
decrypt(data, [pad], [padmode])

data -> 要加密/解密的字節(jié)
pad -> 可選參數(shù)。僅當(dāng)使用PAD_NORMAL的padmode時(shí)。對(duì)于加密時(shí),將此字符添加到數(shù)據(jù)塊的末尾數(shù)據(jù)不是8字節(jié)的倍數(shù)。對(duì)于解密,將刪除最后8個(gè)字符中與此填充字符匹配的尾隨字符未加密數(shù)據(jù)塊的字節(jié)數(shù)。
padmode -> 可選參數(shù),設(shè)置填充模式,必須是PAD\u NORMAL之一或PAD_PKCS5)。默認(rèn)為PAD_NORMAL

os.urandom(n)返回一個(gè)有n個(gè)byte那么長(zhǎng)的一個(gè)string,然后很適合用于加密。

每輪循環(huán)左移的位數(shù)不一定相同
泄露的d.Kn[10] 說(shuō)明已經(jīng)進(jìn)行了11輪了(每一輪生成一個(gè)子密鑰),因此要做sum(movnum[:11])次逆運(yùn)算

from base64 import b64decode from itertools import product from DES import * # https://github.com/soreatu/Cryptography/blob/master/DES.pyguess_8bit = list(product(range(2), repeat=8)) not_in_PC2 = [9,18,22,25,35,38,43,54]def re_PC2(sbkey):# 48-bit -> 56-bitres = [0]*56for i in range(len(sbkey)):res[PC_2_table[i]-1] = sbkey[i]return res # okdef guess_CiDi10(sbkey, t):res = re_PC2(sbkey)for i in range(8):res[not_in_PC2[i]-1] = guess_8bit[t][i]return res # okdef guess_allsbkey(roundkey, r, t):sbkey = [[]]*16sbkey[r] = roundkeyCiDi = guess_CiDi10(roundkey, t)Ci, Di = CiDi[:28], CiDi[28:]for i in range(r+1,r+16):Ci, Di = LR(Ci, Di, i%16)sbkey[i%16] = PC_2(Ci+Di)return sbkey # okdef long_des_enc(c, k):assert len(c) % 8 == 0res = b''for i in range(0,len(c),8):res += DES_enc(c[i:i+8], k)return resdef try_des(cipher, roundkey):for t in range(256):allkey = guess_allsbkey(roundkey, 10, t)plain = long_des_enc(cipher, allkey[::-1])if plain.startswith(b'NCTF'):print(plain)if __name__ == "__main__":cipher = b64decode(b'm0pT2YYUIaL0pjdaX2wsxwedViYAaBkZA0Rh3bUmNYVclBlvWoB8VYC6oSUjfbDN')sbkey10 = [0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1]try_des(cipher, sbkey10) # b'NCTF{1t_7urn3d_0u7_7h47_u_2_g00d_@_r3v3rs3_1snt}'

參考
答案
flag{1t_7urn3d_0u7_7h47_u_2_g00d_@_r3v3rs3_1snt}

總結(jié)

以上是生活随笔為你收集整理的[NCTF2019]Reverse的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。