Cryptanalysis

如何異或兩個十六進制值,我是否正確拖動嬰兒床?(一次性密碼)

  • November 22, 2018

假設我有兩個密文

7ECC555AB95BF6EC605E5F22B772D2B34FF4636340D32FABC29B 73CB4855BE44F6EC60594C2BB47997B60EEE303049CD3CABC29B

根據這個網站http://xor.pw/?異或的結果是

d071d0f071f000000071309030b4505411a5353091e13000000

這個對嗎?我不知道,因為我不知道如何對兩個十六進制數字進行異或運算(我假設您將它們轉換為二進制,但這會很快變得非常乏味)

為了進一步提出我的問題,這是拖拽嬰兒床的正確方法嗎?

746865 XOR d071d0

給出 a419b5,它是一個非 ASCII 字元

然後我會繼續向下移動一個字元

746865 XOR 071d0f 給出 73756a 在 ASCII 中變成 ‘suj’ 但可能是亂碼

等等。

我是否正確執行該程序?

異或這個“十六進制”值

7ECC555AB95BF6EC605E5F22B772D2B34FF4636340D32FABC29B

十六進制值

73CB4855BE44F6EC60594C2BB47997B60EEE303049CD3CABC29B

將導致:

0D071 …..正如頁面告訴你的那樣。

Xoring 是所謂的模 2 加法,沒有進位位傳播。您正在將每個位與另一個字元串的相應位相加。首先,您將十六進製表示轉換為二進制。然後執行模 2 加法。(點是為了更好的可讀性)

7ECC5 becomes 0111.1110.1100.1100.0101
73CB4 becomes 0111.0011.1100.1011.0100
--------------------------------------
XOR
--------------------------------------
             0000.1101.0000.0111.0001
which is converted into
             0    D    0    7    1

PS:

應用以下規則來添加每個位。

0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0

Thepacker已經描述了十六進制數字的按位異或的工作原理。我只想添加一個實用的建議:與其嘗試手動拖動嬰兒床,不如學習一門程式語言並讓它為您完成工作。

幾乎任何程式語言都可以;我個人會建議將Python作為學習第一語言的好選擇,但例如 Ruby 或 Perl 或 Java 甚至 C 或 C++ 也可以工作,就像其他幾十種語言一樣。您可能想要為新程序員挑選一本關於 Python(或其他語言)的優秀入門書(或電子書或線上課程),例如本頁列出的其中一本。顯然,甚至還有一本專門為新程序員編寫的關於用 Python 破解簡單密碼的書!

是的,你需要幾天、幾週或幾個月的時間來加快程式速度,但你仍然應該這樣做。主要原因是,隨著您對加密貨幣研究的深入,您將遇到越來越多您真正想要自動化的東西,而且不會總是(甚至通常)有任何預製完全符合您要求的工具。而且,當然,一旦你進入現代加密貨幣,程式就成為其中必不可少的一部分。


附言。作為一個預告,這裡有一個快速的 Python 程序來做你的嬰兒床拖動練習:

ciphertextA = bytearray.fromhex("7ECC555AB95BF6EC605E5F22B772D2B34FF4636340D32FABC29B")
ciphertextB = bytearray.fromhex("73CB4855BE44F6EC60594C2BB47997B60EEE303049CD3CABC29B")
xored = bytearray(a^b for a,b in zip(ciphertextA, ciphertextB))
crib = bytearray(b" the ")

for offset in range(0, len(xored) - len(crib) + 1):
 piece = xored[offset : offset + len(crib)]
 piece = bytearray(a^b for a,b in zip(crib, piece))
 if all(32 <= c <= 126 for c in piece):
   piece = ("." * offset) + piece.decode('ascii') + ("." * (len(xored) - len(crib) - offset))
   print("%3d %s" % (offset, piece))

及其輸出:

 0 -suj'.....................
 1 .'igb?....................
 2 ..={oz ...................
 3 .../swe ..................
 4 ....'khe .................
 5 .....?the'................
 6 ...... thb3...............
 7 ....... tov)..............
 8 ........ s{l#.............
 9 .........'gaf+............
10 ..........3}kne...........
11 ...........)wc %..........
13 .............+1m$:........
15 ...............%5r6s......
16 ................an;6).....
17 .................:';l>....
18 ..................s'a{3...
19 ...................s}vv ..
20 ....................)j{e .
21 .....................>ghe 

順便說一句,正如您從上面的輸出中可以看出的那樣,如果您只有上面給出的兩個密文,您將很難完全解碼這些消息。那是因為密文的多個連續字節有幾個部分是相同的,所以你所能知道的明文的這些部分也必須是相同的。然而,在不知道密鑰的情況下,可能很難或不可能準確地知道明文的那些相同部分實際上應該包含什麼。

引用自:https://crypto.stackexchange.com/questions/33428