1. 程式人生 > >BitcoinChallenge第一關解密程式碼

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
或關注飛久微信公眾號:
在這裡插入圖片描述