BitcoinChallenge第一關解密程式碼
最近有一幅畫特別火,不是因為這幅畫有多美,而是因為這幅畫裡藏有310個比特幣的私鑰!
遊戲地址:BitcoinChallenge
實際上這幅圖裡藏有4個私鑰,對應的賬號裡分別有0.1, 0.2, 0.31和310個比特幣,當然難度肯定也是對應成比例的。已經有牛人破解了第一個私鑰,轉走了賬號裡的0.1個比特幣,那麼他是怎麼做到的呢?
首先,這幅圖中最明顯的線索就是圖片下方的表格,裡面有18個16進位制數字:
那麼這些數字跟私鑰有什麼關係呢?祕密就在於表格上方不遠處的一串日期OCT2 2018:
這兩部分結合起來,就是一個移位密碼問題,也稱凱撒密碼,因為是凱撒大帝率先在軍隊中使用的~
那麼什麼是凱撒密碼呢?其實很簡單:假設原始資料是ABC,每個字母移動1位,就得到了加密後的資料BCD,移動2位就變成CDE,以此類推。另外移位是迴圈進行的,比如Z再移動1位就變成了A。
好,回到這幅畫上來,表裡的數字就是原始資料,而’20181002’就是需要移動的位數。據此可以寫出解密的Python指令碼:
import re
key = '20181002'
encrypted = '511B2033232841053022B0FE52ED0F7A165B52C7E75112F656FC4B'
decrypted = ''
for i in range(len(encrypted)):
h = hex((int(encrypted[i], 16) - int(key[i%len(key)])) % 16)
decrypted += h[2]
# print numbers
num = re.findall(r'.{3}', decrypted)
print(num)
看到了嗎?先做減法實現移位,再取餘實現迴圈移位,最後轉成16進位制(去掉前面的0x標識)。
那麼解密出來的資料是什麼樣子的呢?我們看一下列印結果:
[‘310’, ‘310’, ‘310’, ‘310’, ‘310’, ‘310’, ’1aa’, ‘0fc’, ‘32d’, ‘5ff’, ‘78f’, ‘643’, ‘42c’, ‘5c7’, ‘490’, ‘2f4’, ‘36e’, '43b’]
前面6個數字都是310,暗示了大獎的金額310個比特幣。後面的12個數字才是重點,它們標識了私鑰助記詞的索引號。助記詞一共有2048個,
把上面的列表下載下來儲存成english.txt,然後根據上面的12個索引值找到對應的助記詞:
# print mnemonic
with open('english.txt', 'r') as f:
mnemonic = f.readlines()
for i in range(len(num)):
m = mnemonic[int(num[i], 16) - 1]
print(m[:-1], end=' ')
print('')
列印結果:
giggle giggle giggle giggle giggle giggle cry buyer grain save vault sign lyrics rhythm music fury horror mansion
通過這12個單詞就可以進入賬號了,當然現在裡面已經是空空如也,早在10月4號就被一位地址為1AuSap3Z9NhmhQEe3y1ByxuNFY1S35YtZ3 的牛人破解了~
P.S. 截止發稿,第4關已經被破解了,310個比特幣被分別轉到了3個賬號中,大家又痛失一個賺錢的機會啊。。。
更多文章歡迎關注“鑫鑫點燈”專欄:https://blog.csdn.net/turkeycock
或關注飛久微信公眾號: