看題目:
題目給了乙個壓縮包,有乙個.py檔案和乙個key檔案。
.py:
from flag import flag
assert flag.startswith(
"flag"
)assert
len(flag)
==27
deflfsr
(r,mask)
: output =
(r <<1)
&0xffffff
i=(r&mask)
&0xffffff
lastbit=
0while i!=0:
lastbit^
=(i&1)
i=i>>
1 output^
=lastbit
return
(output,lastbit)
r=int
(flag[5:
-1],
2)mask=
0x100002
f=open
("key"
,"ab"
)for i in
range(12
):tmp=
0for j in
range(8
):(r,out)
=lfsr(r,mask)
tmp=
(tmp <<1)
^out
f.write(
chr(tmp)
)f.close(
)
看起來好像不怎麼難。
key檔案,老樣子,拖入16進製制編輯器檢視:
分析**:
先是讀入flag,去掉flag和大括號之後再經過一系列的轉化再存入key檔案。
這裡有乙個關鍵的地方,r = int(flag[5:-1],2),這句話不報錯的唯一前提就是flag是由1和0構成的二進位制數,這瞬間就簡單了,其中mask的大小大概在2的21次方左右,所以flag的範圍也是差不多。其中lfst函式很難理解,所以我選擇直接爆破,這樣子很快可以做出來。
爆破指令碼:
def
lfsr
(r,mask)
: output =
(r <<1)
&0xffffff
i=(r&mask)
&0xffffff
lastbit=
0while i!=0:
lastbit^
=(i&1)
i=i>>
1 output^
=lastbit
return
(output,lastbit)
flags=
[178
,233,14
,19,160
,106,27
,252,64
,230
,125,83
]r=0mask=
0x100002x=0
while1:
rs=r
for i in
range(12
):tmp=
0for j in
range(8
):(rs,out)
=lfsr(rs,mask)
tmp=
(tmp <<1)
^out
if tmp!=flags[i]
: x=
0 r+=
1break
;if x:
print
(bin
(r))
breakx=1
跑了3分鐘大概就出來了:
包上flag{}提交即可。
第一次做出來這種題型,以前總覺得很難做不出來,現在發現也不是那麼的難,還是可以做一做的。
密碼學 密碼學基礎
密碼學是研究編制密碼和破譯密碼的技術科學。密碼學的安全目標至少包含三個方面 保密性 完整性 可用性。完整性 資源只有授權方以授權的方式進行修改,所有資源沒有授權則不能修改。可用性 資源只有在適當的時候被授權方訪問,並按需求使用。密碼系統由5部分組成 1 明文空間m 全體明文的集合 2 密文空間c 全...
密碼學 柵欄密碼
使用的時候通過設定解密的偏移量不一樣的話,會得出不同的解碼內容 一直設定不同的偏移位數 直到找到帶有cyberpeace 開頭的解碼內容 偏移量也就是分組的數字長度 一般就是flag了 有時候它也會全部的解碼都沒有flag的標誌,這時候一定仔細看題目給出的條件 還有的情況就是在題目裡面它會提示給你數...
密碼學 密碼學中幾種攻擊模式
本科畢業設計做完之後,一直覺得自己需要系統來學習一下密碼學,密碼學是乙個古老的學科,前人已經研究了太多太多,而伴隨著量子計算的逐漸發展,之前制定出來的密碼演算法都面臨著被淘汰的危險。今天記錄一下根據密碼分析者知道資訊的多少,密碼學中分為常見的幾種攻擊模式,以及它們主要用於什麼場合。在介紹攻擊模式之前...