加密101 異或(xor)

2021-06-29 06:01:46 字數 2902 閱讀 4100

異或(xor)是邏輯運算子,符號是⊕。當輸入同時為真或同時為假時,輸出為假。否則,輸出為真。

xor可以叫做「可程式設計反向器」:乙個輸入bit位決定要不要對另乙個輸入bit位取反。

異或(xor)操作的圖示如上,在圖示左邊pi是明文文字(plaintext)的bit位,i是bit位的索引,因為我們要處理不止乙個bit位。在圖示上方是ki,代表金鑰(key)的bit位,用來決定是否反轉pi。在右側生成密文(ciphertext)ci,也就是異或操作生成的結果。

當有乙個輸入為1而另乙個輸入不為1,輸出為1。

可以從上圖推出一些運算性質:

xor運算符合交換率,a ⊕ b = b ⊕ a;

如果輸入相同,輸出0。a ⊕ a = 0;   0 ⊕ 0 = 0,1 ⊕ 1 = 0;

和0做異或運算,輸出為它本身。 a ⊕ 0 = a; 0 ⊕ 0 = 0, 1 ⊕ 0 = 1;

計算 a ⊕ b ⊕ a =  b?

a ⊕ b ⊕ a = 

a⊕a⊕b(性質1)

= 0⊕b(性質2)

= b(性質3)  

以上性質通常用來xor加密,第一步是加密過程,對b進行加密。第二步是解密過程。

假設你要加密的內容為a,金鑰為b,則可以用異或加密:

c=a ⊕ b

在資料中儲存c就行了。

用的時候:

a=b ⊕ c

即可取得原加密的內容,所以只要知道金鑰,就可以完成加密和解密。

我們已經定義了乙個bit的異或運算,通常我們需要處理多個bit。大部分程式語言都提供了異或執行符(^)。

在19世紀發明的一次性密碼本(one-time pad)可以用異或實現。一次性密碼本的金鑰由隨機選擇的二進位制串組成,該金鑰串與明文訊息有相等的長度。該金鑰與明文訊息做異或運算以生成密文訊息。

正確使用一次性密碼本進行加密,在理論上是無法破解的。需要注意的是,許多對稱式加密演算法本質上是通過一定的演算法來將金鑰作為偽隨機數發生器的種子來產生(近似於)一次性密碼本的序列,因此類似的問題也需要予以重視:不要重複使用同乙個一次性密碼本(或金鑰)來加密不同的明文資料。

假設我們有明文文字的二進位制序列,並且隨機密碼本的二進位制序列在傳送者和接受者中共享。我們可以通過異或取得密文(ci)。

如果攻擊者看到密文,他們在沒有密碼本(ki)是不可能解密出明文的。(eve:監聽者)

一次性密碼本安全的兩個必要條件:

使用真隨機數作為金鑰;

不要反覆使用同乙個密碼本,或者同乙個對稱金鑰;

假設攻擊者截獲了兩個用同樣密碼本加密的密文,攻擊者可以對兩個密文進行異或運算,相當於對兩個明文進行了異或運算。

最終結果並不能單獨得到p1和p2,而是p1^p2。為了單獨得到p1或p2,你需要抵消異或運算,也就是必須知道其中乙個明文,這是不可能的。但是我們可以知道兩個明文共同的一些資訊。如下圖所示:

a,b代表明文資訊,c,d是a,b分別用同乙個金鑰e生成的密文,f是兩個密文進行異或運算的結果。

假設我們有一些用同乙個金鑰k生成的密文ci。如果我們能正確的猜出其中乙個cj密文對應的明文pj,就可以求出共享金鑰k。

因為共享金鑰k已知,我們現在可以解密其他所有密文:

不幸的是我們並不能猜出整個密文,但是可以猜出其中一小部分密文(hard work)。

假設我們猜出了部分明文bit位pi

k=ci ⊕ pi

所有密文處在同乙個偏移位置的金鑰都是k,求出同一偏移位置的所有明文:

pi = ci⊕ k。

猜中一部分明文文字要比猜中所有明文文字要簡單的多,假設我們的明文文字是英文,下面是找一組常見的英文單詞。

通常來說,the, to, then 這樣的單詞出現的頻率非常高,因此,以它們作為突破口。如果我們更了解加密的文字就可以進行更靠譜的猜測,例如,html,要猜content-type等等。

那怎麼知道我們猜的是正確的呢?如果我們的猜測是正確的,那麼看密文在同一偏移位置解密出來的明文是否有意義。

對於每一條明文的同乙個位置的內容,假定明文內容是空格,可以得到金鑰可能是(密文)xor(0x20),然後用這個可能的金鑰去解其它的密文。假如解出來的明文都是字母,數字,標點或空格的話,則說明這個金鑰很可能就是真正的金鑰。用程式可以迅速對此作出判斷。

假設成功猜出了5個字母 ␣the␣ ,在另乙個文字中解出了對應 t␣thr ,可以查字典查詢以thr開始的單詞,例如through。重複過程。

一次性密碼本在正確使用時很安全,但在現實中確很少使用,因為它是不切實際的:

金鑰key和需要加密傳輸的資料一樣長,而且還要保證金鑰key交換的方便和安全。

即使有這些缺陷,它還是有用武之地的。

@斗大的熊貓

XOR (異或)加密簡單實現

參考 一 xor 運算 邏輯運算之中,除了 and 和 or,還有一種 xor 運算,中文稱為 異或運算 它的定義是 兩個值相同時,返回false,否則返回true。也就是說,xor可以用來判斷兩個值是否不同。true xortrue false false xo lse false true xo...

php 使用異或(XOR)加密 解密檔案

php 使用異或 xor 加密 解密檔案 原理 將檔案每乙個位元組與key作位異或運算 xor 解密則再執行一次異或運算。如下 檔案加密,使用key與原文異或生成密文,解密則再執行一次異或即可 param string source 要加密或解密的檔案 param string dest 加密或解密...

C 使用異或 xor 加密 解密檔案

c 使用異或 xor 加密 解密檔案 之前寫過一篇 php 使用異或 xor 加密 解密檔案 但php執行的速度很慢,因此這次使用c重寫,速度有很大的提高。xor encrypt.c xor 加密 解密檔案 define true 1 define false 0 include include i...