ㄤ骯
最近各種懶惰,
(靠,這樣就過一年了喔)
不知道大家還記不記得邏輯閘是什麼呢?來複習一下:
我們先前提到,對於 "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 的程式會核對密碼是否正確,
接著才決定要不要把壓縮檔裡面的內容給解壓出來。」
但等到我研究了一些常見的加密標準算法以後,才知道這是完完全全錯誤的概念。
也因此,網路上絕對不可能存在「可以繞過壓縮檔的密碼而直接解壓縮的工具」,
那個絕對都是跟你嚎洨的,因為裡面的資料早就藉由密碼跟固定的算法給大洗牌了,
只有暴力破解(把所有可能的密碼組合都拿來試)才有機會把壓縮檔給破解——
而且暴力破解的速度非常慢……用超級電腦才「有機會」在你有生之年破解大型資料。
今天對於加密的部分就上到這裡,下課~