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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[NCTF2019]Reverse

發布時間:2025/3/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [NCTF2019]Reverse 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[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->包含加密密鑰的字節。DES為8字節,16或24字節

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

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

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

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

每輪循環左移的位數不一定相同
泄露的d.Kn[10] 說明已經進行了11輪了(每一輪生成一個子密鑰),因此要做sum(movnum[:11])次逆運算

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}

總結

以上是生活随笔為你收集整理的[NCTF2019]Reverse的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。