一個菜鳥對密碼學的理解 (4千字)

看雪資料發表於2015-11-15

前言:

就在菜鳥們正為破了一個明碼比較的軟體而歡欣鼓舞時,各位大大都在研究密碼學了,本菜鳥我也不自量力地緊跟其後,怎奈各種介紹密碼學的書都太專業了,而且不是針對CRACK的.一上來就是一堆公鑰,私鑰,HASH之類的東東,大概不少菜鳥一看到這些都被嚇回去了.這裡我把密碼學在軟體加密上的大體思路向各位菜鳥同胞們介紹一下.如果你是菜鳥,你會發現,密碼學不是你想象中的那麼難;如果你是大俠,最好跳過這篇文章,不然就要把大牙捂好,當心笑掉了. :)

好了,廢話少說,我先來講講軟體加密中的基本思想.

我們知道,不管形式怎樣複雜,各種共享軟體都是把使用者名稱和註冊碼經過一定的計算後進行比較.現在假設有一個軟體,作者採用的註冊演算法是把註冊名的每一位都+1而得到註冊碼(當然實際中不可能這麼簡單).我是一個使用者,我想註冊這個軟體,於是我把我的名字RoBa和SOME MONEY給作者送去,作者那裡肯定有一個序號產生器的,作者的序號產生器經過計算('R'+1='S','o'+1='p','B'+1='C','a'+1='b')後把註冊碼SpCb發給我,然後我把使用者名稱RoBa註冊碼SpCb輸入軟體中,點選"OK",這時候軟體該怎麼辦呢?如何進行註冊判斷才安全呢?

一種很常見的方法是,軟體把使用者名稱經過計算後與註冊碼比較,也就是判斷
if 註冊碼==F(使用者名稱) then 成功 else 失敗
現在我是Cracker,我不想給作者MONEY,那麼我跟蹤這個軟體,輸入使用者名稱RoBa,假碼5678,然後可以發現,它把'R'+1,把'o'+1,把'B'+1,把'a'+1,再把結果'SpCb'組合起來與'5678'進行比較.也就是說,軟體實際上把作者手裡的序號產生器的功能再現了一遍,其實這個軟體本身就包含一個序號產生器,破解者甚至不必看懂註冊演算法,只要把軟體中計算註冊碼的那一部分提取出來就是序號產生器了.這顯然是非常不安全的,一些CRACK初學者只要到處亂D,就可能把註冊碼D出來(我以前經常這樣做^_^).

那麼正確的做法應該怎樣呢?我假設仍然是這個註冊演算法,作者手中的序號產生器也不變,只是要把軟體中判斷註冊的部分變一下.不去根據使用者名稱計算註冊碼,而是根據註冊碼反算使用者名稱,即
if 使用者名稱==F'(註冊碼) then 成功 else 失敗
我又來跟蹤這個軟體了,輸入使用者名稱RoBa,假碼5678,然後開始跟蹤,結果發現軟體計算'5'-1,'6'-1,'7'-1,'8'-1,然後把結果'4567'與'RoBa'比較,這樣就給人一種莫名其妙的感覺.如果我是一個初學者,我會在記憶體中發現一個字串'4567',但這個字串卻不是使用者名稱RoBa所對應的正確註冊碼,這樣就防止軟體被破解和寫出序號產生器.當然在上面這種情況下我可以在使用者名稱輸入'4567',然後在註冊碼輸入'5678',但這樣會給人的感覺很不爽,而且大多數情況下胡亂輸入的假碼經過反算後得到的使用者名稱含有不可顯示字元,這樣就給破解帶來了麻煩.

還有一點是非常需要注意的,採用第二種方法時,註冊演算法必須是可逆的,也就是說作者必須有方法透過使用者名稱算出註冊碼來,而軟體也必須能透過註冊碼算出註冊名.

各位菜鳥同志可能有疑問了,這樣只是不讓初學者把註冊碼亂D出來,如果遇上高手呢,軟體中那個減1的運算不是很容易就會被識破嗎?所以說,這時候我們的密碼學就派上用場了.(終於來到正題了*_*)

下面我把三類常見的加密演算法介紹一下: (按看雪書上的順序)

(一)單向雜湊演算法,也叫Hash演算法

呵呵,別被這個名字嚇住哦!其實說通俗一些,就是把一個字串A亂七八糟計算一通,得到一個亂七八糟的字串B,不管你有多大本事,你也不可能從字串B反算出原來字串A,也就是說是一個不可逆的計算.
各位可能又問了,你前邊說了半天註冊演算法必須可逆,這種不可逆的計算有什麼用呢?完全正確,這種演算法在軟體註冊中其實並沒有什麼實際作用,最多隻是作為一箇中間過程而己,所以不詳細介紹了.

這一類的常見演算法:MD5,SHA等

(二)非對稱演算法

根據前面所講的,軟體的計算實際上是兩個互逆的運算:
在作者的序號產生器上計算: F(使用者名稱),在上面的例子中即為 註冊碼=使用者名稱+1   (計算1)
在釋出的軟體中計算:  F'(註冊碼),在上面的例子中即為 使用者名稱=註冊碼-1   (計算2)
CRACKER只能得到計算2,但是在一般的可逆計算中,透過計算2可以很容易用數學知識求出計算1,比方上面的例子,有小學數學知識的人就會吧?只要把計算1研究出來,序號產生器也就寫成了.

那麼有沒有雖然存在逆運算但不能被隨意求逆的演算法呢?這就是非對稱演算法了.
這種演算法是可逆的,但它的計算有點特別,需要兩個關鍵的KEY(金鑰),而且這兩個KEY不同,如果沒有KEY就無法計算.軟體作者經過一定的規則設定這兩個KEY,然後用下面的方法:
作者的序號產生器上: 註冊碼=F(使用者名稱,KEY1)
釋出的軟體中:   使用者名稱=F'(註冊碼,KEY2)
這樣CRACKER跟蹤時可以發現KEY2,也知道使用者名稱是怎樣計算出來的,但他不知道KEY1,無法把這個運算逆回去,很奇妙吧?這裡面有許多高等數學中數論的知識,各位可以研究一下.(不要來找我,我高中還沒畢業 :))
這樣的演算法怎樣破解呢?雖然KEY1和KEY2不同,但它們是有一定的關係的,只是這樣的關係很難求解(比如大數分解等一些數學上的難題),如果KEY設計得足夠大,由KEY2求出KEY1幾乎是不可能的.但因為演算法要用在註冊判斷上,如果KEY太大的話要浪費很多時間,在實際中不可取,所以這就給我們CRACKER提供了機會,用相應的工具可以在較短的時間間由KEY2解出KEY1來,從而寫出序號產生器.

這一類的常見的演算法有RSA,ECC等

(三)對稱演算法

對稱演算法和上面的非對稱演算法最大的不同就是兩個關鍵的KEY是相同的,這樣的演算法用在通訊上當然沒有問題,但在軟體加密上就很不安全了,因為你釋出的軟體中要進行解密運算,必定會包括這個KEY,而軟體只要在別人的機器上執行,軟體中包含的一切對高手來講都沒有安全性可言,這個KEY一旦被跟蹤出來,軟體就被破解了.

這一類的常見演算法有BlowFish等

後記:鑼濾盜蘇餉炊,也不知道各位聽懂了沒有,本文並沒有涉及到各種演算法的具體實現過程(其實我也不會),只是想把各類演算法簡要介紹一下,消除菜鳥對密碼學的恐懼感,如果你想了解更詳細的內容,請參考各位大俠的文章,讓我們共同提高吧.

相關文章