小屋創作

日誌2015-09-01 04:04

利用 XOR 對資料加密的原理淺談

作者:解凍豬腳


ㄤ骯

最近各種懶惰,

決定來發個延續上次那篇 什麼是布林代數?邏輯閘又是啥? 的文章。
(靠,這樣就過一年了喔

不知道大家還記不記得邏輯閘是什麼呢?來複習一下:

我們先前提到,對於 "AND" 這個邏輯閘來說,
(註:「X AND Y」用符號可以記為「X.Y」)

如果 "AND" 運算子左邊的東西成立,右邊也成立的話,那麼這整個式子就成立。

用口語來說的話,「我有姊姊,也有妹妹」這件事情,

我們可以寫成: ( 我有姊姊 AND 我有妹妹 )

這時候倘若左邊「我有姊姊」是成立的(1),右邊「我有妹妹」也是成立的(1)

那麼「我有姊姊 AND 我有妹妹」這件事情就是成立的(1)對吧?
(1 AND 1) = 1

反之如果我有姊姊(1),但是我沒有妹妹(0)

那麼「我有姊姊 AND 我有妹妹」這件事情就會是錯的(0),沒問題吧?
(1 AND 0) = 0

因此我們將 AND 的邏輯運算歸納出(1是成立,0是不成立)

1 AND 1 = 1
1 AND 0 = 0
0 AND 1 = 0
0 AND 0 = 0

這個就是 AND 邏輯閘的運算,我想應該是再簡單不過的了。

實際上,那些研究電子元件的科學家,為了因應各個不同情況的需求,

在這些東西的發展過程中,慢慢分別研究並定義出了:

NOT 、 OR 、 AND 、 NAND 、 NOR 、 XOR 、 XNOR……等等的邏輯閘,

其中我們剛剛提到的 AND 就是讓電腦來判斷「是不是兩件事情都成立」的幫手。

當然,聰明的人就會發現:

「那,OR 這個邏輯閘是不是用來讓電腦判斷『兩件事情是否有至少一件成立』的呢?」

沒錯!"OR" 這個邏輯閘就是被拿來作這樣的用途,

也因此大家可以猜得到,OR 邏輯閘會有這樣的性質:

1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0

那麼,今天我們來談談邏輯閘裡面的 XOR 運算吧~~

XOR 這個邏輯運算子相對於 AND 及 OR 兩種邏輯閘來說,算是比較特別的一種,

它主要被用來當作「檢查兩個數值的『成立狀態』是不是一樣」的幫手:

1 XOR 1 = 0
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0

如果左邊的東西跟右邊的東西一樣,那就會得出 0 ;

但如果兩邊只有剛好其中一個條件成立的話,那就會得出 1。



後來隨著邏輯閘這種東西的發展,科學家讓這東西的用途慢慢延伸,

使得邏輯閘不再只能對最簡單的 1 跟 0 去作運算,

而是連那些比 1 還要大的數字也能參與運算——

但是,電腦只能認得出 0 跟 1,所以電腦仍然要基於 0 跟 1 的系統達成這件事。



譬如 182 這個數字,我們把它轉換成二進位會得到:

182 = ( 1 0 1 1 0 1 1 0 )

再隨便挑另外一個數字來舉例……假設我們挑 99 好了。

99 轉換成二進位會得到:

99 = ( 0 1 1 0 0 0 1 1 )

這時候,我們讓電腦計算「182 AND 99」這個玩意吧!

如何計算呢?我們把它寫成直式,並且每一位個別依照 AND 的性質作計算會得到:

1 0 1 1 0 1 1 0
AND 0 1 1 0 0 0 1 1
= 0 0 1 0 0 0 1 0

也就是說,

( 1 0 1 1 0 1 1 0 ) AND ( 0 1 1 0 0 0 1 1 ) = ( 0 0 1 0 0 0 1 0 )

我們把剛剛的計算結果轉換成十進位(我們平常的數字系統)會得到

( 0 0 1 0 0 0 1 0 ) =  34

也就是說,我們可以寫成 182 AND 99 = 34

聽起來很奇怪、你們一定會覺得豬腳我在嚎洨你們吧

不信你們可以打開電腦裡面的小算盤,調為「程式設計師」模式

接著算算看 182 AND 99 ,能發現按了等號會得出 34

其實,計算機裡面 "AND" 按鈕的實際運算過程,就是這麼算的

當然,我們剛剛提到的 XOR 對於數字的運算也同理,

每一位個別依照 XOR 的定義作計算:

57 XOR 42 = (00111001) XOR (00101010) = (00010011) = 19



後來,科學家不斷研究 XOR 這個邏輯閘,想知道它到底能不能有什麼用處,

發現到 XOR 這個東西居然會有這樣的性質:

( A XOR B ) XOR B = A

MAGIC!這個就好像我手上有一段原文 A,然後我拿一把鑰匙 B,

讓 A 對 B 進行 XOR 運算以後會得到加密過的數據 C,

這時候再把加密過的數據 C 對鑰匙 B 進行 XOR 運算,又可以得到原來的 A。

這看起來沒什麼,但在密碼學家的眼中可是一個大發現!



註:以下文章將出現大量數字,請小心脫窗!

我們以下會用藍色代表「原文」紫色代表「密碼」橘色代表「加密過的原文」



回歸正題。

舉例來說,我們依照自己喜好做編碼(我只挑前面 16 個字母比較好舉例):

A=0 B=1 C=2 D=3 E=4 F=5 G=6 H=7
I=8 J=9 K=10 L=11 M=12 N=13 O=14 P=15

接著,假設我們手上有需要加密的資料內容是 "BANANA"

對照編碼的表,資料內容轉換為數字變成 [ 1, 0, 13, 0, 13, 0 ]

寫成二進位就是 (0001), (0000), (1101), (0000), (1101), (0000)

那如果我們拿了一把鑰匙內容是 "MON"

我們可以把 MON 對照上面的編碼表得出 M=12, O=14, N=13

也就是 MON = (1100), (1110), (1101)

這時候我們就可以拿來利用 "MON""BANANA" 加密了!

怎麼做?跟剛剛一樣,不過因為 "MON" 的字符長度太短,跟 "BANANA" 不一樣

所以我們把密碼改成 "MONMON" 這樣就可以跟 "BANANA" 做 XOR 運算了:

B A N A N A
XOR M O N M O N

當然用英文字母我們不能直接算,那就對照編碼表並改成二進位再做計算:

0001 0000 1101 0000 1101 0000
XOR 1100 1110 1101 1100 1110 1101
= 1101 1110 0000 1100 0011 1101

得到 [ 1, 0, 13, 0, 13, 0 ] XOR [ 12, 14, 13, 12, 14, 13 ] = [ 13, 14, 0, 12, 3, 13 ]

也就是 "BANANA" XOR "MONMON" = "NOAMDN"

當然如果我們要再把「加密過的原文」(簡稱密文)給還原回來

就會需要用正確、一樣的鑰匙(密碼),才能得到正確的原文

1101 1110 0000 1100 0011 1101
XOR 1100 1110 1101 1100 1110 1101
= 0001 0000 1101 0000 1101 0000

以上的直式代表 [ 13, 14, 0, 12, 3, 13 ] XOR [ 12, 14, 13, 12, 14, 13 ] = [ 1, 0, 13, 0, 13, 0 ]

也就是 "NOAMDN" XOR "MONMON" = "BANANA" , 原文就這麼出來了~



當然,這裡如果我們把密文 "NOAMDN"錯誤的鑰匙(密碼)來做計算

譬如我們嘗試拿 "LAG"(因為長度要一樣,所以改成"LAGLAG"

當作鑰匙來試圖解開 "NOAMDN" 這個密文,就會發生以下情況:

"LAGLAG" 對照編碼:[ 11, 0, 6, 11, 0, 6 ]

然後改寫成二進位:(1011), (0000), (0110), (1011), (0000), (0110)

列成直式計算 "NOAMDN" XOR "LAGLAG"

1101 1110 0000 1100 0011 1101
XOR 1011 0000 0110 1011 0000 0110
= 0110 1110 0110 0111 0011 1011

得到的結果是 (0110), (1110), (0110), (0111), (0011), (1011)

改成十進位是:[ 6, 14, 6, 7, 3, 11 ]

回顧一下剛剛的編碼表:

A=0 B=1 C=2 D=3 E=4 F=5 G=6 H=7
I=8 J=9 K=10 L=11 M=12 N=13 O=14 P=15

對照回來會發現得到的結果內容居然是 "GOGHDL",而不是我們想要的 "BANANA" !

也就是說,這代表如果我們善加利用 ( A XOR B ) XOR B = A 的性質,就可以視為:

「原文 XOR 密碼 = 密文」,而且「密文 XOR 密碼 = 原文」的性質就會存在;

但我們如果是「密文 XOR 錯誤的密碼」就會得到「不正確的原文」,

就好像我們一定要拿一樣的鑰匙,才能把寶箱打開一樣。

對此,因為原理很容易理解,又可以利用它達到一定的加密安全強度,

因此許多電腦資料的加密算法依賴於「XOR」這個邏輯閘,

密碼學家也對於這種「一個同樣的鑰匙,可以做到加密也可以做到解密」的加密算法,

稱為「對稱金鑰加密」;當然其他依賴不同性質進行加密的,就稱為「非對稱金鑰加密」。



除此之外,當然如果每一筆資料都用不同的密碼來進行加密,

那麼安全強度就會高出許多,因為這樣就比較不容易被破解。

這裡我想各位會有很大的疑問:為什麼用一樣的密碼進行加密會很容易被破解?

豬腳就在這裡舉個例子吧:

假設我們有 "BANANA"、"CANADA"、"MIDADC" 這三筆資料,

密碼全都是用 "MONMON" 來進行加密

(下面兩筆我懶得一個一個算了,我用XXXXXX和YYYYYY來代替):

"BANANA" XOR "MONMON" = "NOAMDN"
"CANADA" XOR "MONMON" = "XXXXXX"
"MIDADC" XOR "MONMON" = "YYYYYY"

假設以上這三筆是加密的過程。

毫無疑問地,密文是公開的、大家都能看得見的內容(不然怎麼傳送資料呢?)

那麼,如果有駭客經由其他手段,好不容易偷取到其中一筆原文 "BANANA",

而且這名駭客得知 "BANANA" 是 "NOAMDN" 的原文,

他就能列出以下的關係(問號是未知,XXXXXX 和 YYYYYY 是已知):

"BANANA" XOR ??? = "NOAMDN"
??? XOR ??? = "XXXXXX"
??? XOR ??? = "YYYYYY"

這樣他就可以利用 XOR 的運算性質

將 "NOAMDN" XOR "BANANA" 得到密鑰是 "MONMON"

(XOR的運算性質:若 A XOR B = C,那麼 C XOR A = B 會成立)

接著推論出關係:

"BANANA" XOR "MONMON" = "NOAMDN"
??? XOR ??? = "XXXXXX"
??? XOR ??? = "YYYYYY"

倘若不巧,今天這個負責加密的那一端全都用 "MONMON" 來加密的話

這名駭客就可以拿 "MONMON" 來解密其他密文 "XXXXXX" 和 "YYYYYY"

如此,他便能利用一把同樣的金鑰來得取其他原文,並且輕鬆列出:

「"BANANA" XOR "MONMON" = "NOAMDN"

"CANADA" XOR "MONMON" = "XXXXXX"

"MIDADC" XOR "MONMON" = "YYYYYY"」的相互關係。

這個方法,在駭客眼裡就稱為「明文攻擊」。

因此,大家都需要一個安全、簡單又可靠的加密方式,

之後便發展出了 RC4、RC5、RC6、DES、AES、3DES 等等的加密標準,

來讓 XOR 的運算性質得以發揮效用,這就是 XOR 在資料加密方面的應用以及隱憂。



話說到這裡,我以前對於壓縮檔的加密方式一直很好奇,但是卻沒有研究

其實我原先一直以為是這樣:

「正確的密碼會藏在 zip/rar 檔案裡的某個地方,

等到使用者輸入密碼、點選確定的時候,rar 的程式會核對密碼是否正確,

接著才決定要不要把壓縮檔裡面的內容給解壓出來。」

但等到我研究了一些常見的加密標準算法以後,才知道這是完完全全錯誤的概念。

也因此,網路上絕對不可能存在「可以繞過壓縮檔的密碼而直接解壓縮的工具」,

那個絕對都是跟你嚎洨的,因為裡面的資料早就藉由密碼跟固定的算法給大洗牌了,

只有暴力破解(把所有可能的密碼組合都拿來試)才有機會把壓縮檔給破解——

而且暴力破解的速度非常慢……用超級電腦才「有機會」在你有生之年破解大型資料。

今天對於加密的部分就上到這裡,下課~



 

40

27

LINE 分享

相關創作

Tea time

【行星】

【呼吸法】

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】