數學算法一向都是密碼加密的核心,但在一般的軟件加密中,它似乎並不太為人們所關心,因為大多數時候軟件加密本身實現的都是一種編程上的技巧。但近幾年來隨著序列號加密程序的普及,數學算法在軟件加密中的比重似乎是越來越大了。
我們先來看看在互聯網絡上大行其道的序列號加密的工作原理。當用戶從網絡上下載某個 Shareware -- 共享軟件後,一般都有使用時間上的限製,當過了共享軟件的試用期後,你必須到這個軟件的公司去注冊後方能繼續使用。注冊過程一般是用戶把自己的私人信息(一般主要指名字)連同信用卡號碼告訴給軟件公司,軟件公司會根據用戶的信息計算出一個序列碼出來,在用戶得到這個序列碼後,按照注冊需要的步驟在軟件中輸入注冊信息和注冊碼,其注冊信息的合法性由軟件驗證通過後,軟件就會取消掉本身的各種限製。這種加密實現起來比較簡單,不需要額外的成本,用戶購買也非常方便,在互聯網上的軟件 80% 都是以這種方式來保護的。
我們可以注意到軟件驗證序列號的合法性過程,其實就是驗證用戶名與序列號之間的換算關係是否正確的過程。其驗證最基本的有兩種,一種是按用戶輸入的姓名來生成注冊碼,再同用戶輸入的注冊碼相比較,公式表示如下:
序列號 = F(用戶名稱)
但這種方法實際上等於在用戶軟件中再現了軟件公司生成注冊碼的過程,實際上是非常不安全的,不論其換算過程多麽複雜,解密者隻需把你的換算過程從程序中提出來就可以編製一個通用的注冊程序。
另外一種是通過注冊碼來驗證用戶名的正確性,公式表示如下:
用戶名稱 = F逆(序列號)
這其實是軟件公司注冊碼計算過程的反算法,如果正向算法與反向算法不是對稱算法的化,對於解密者來說的確有些困難,但這種算法相當不好設計。
於是有人考慮到了以下的算法:
F1(用戶名稱) = F2(序列號)
F1、F2 是兩種完全不同的算法,但用戶名通過 F1 算法計算出的特征字等於用序列號通過 F2 算法計算出的特征字,這種算法在設計上比較簡單,保密性相對以上兩種算法也要好得多。如果能夠把F1、F2 算法都設計成不可逆算法的化,保密性相當的好,但一旦解密者找到其中一個的反算法的化序列號 = F2逆(F1(用戶名稱))這種算法就不安全了。一元算法的設計看來再如何努力也很難有太大的突破,那麽二元呢?
特定值 = F(用戶名稱,序列號)
這個算法看上去相當不錯,用戶名稱與序列號之間的關係不再是那麽清晰了,但同時也失去了用戶名稱與序列號的一一對應關係,軟件開發者必須自己維護用戶名稱與序列號之間的唯一性,但這似乎也不是難以辦到的事,建個數據庫就好了。
當然你也可以根據這一思路把用戶名稱或序列號分為幾個部分來構造更多元的算法。
特定值 = F(用戶名1, 用戶名2,..., 序列號1, 序列號2, ...)
現有的序列號加密算法大多是軟件開發者自行設計的,大部分相當簡單。而且有些算法作者雖然下了很大的工夫,但效果往往達不到它所希望的結果。其實現在有很多現成的加密算法可以使用,如 RSADES、MD4、MD5...隻不過這些算法是為了加密密文或密碼用的,同序列號加密多少有些不同,如果希望使用這些加密算法的化多少需要動點腦筋。我在這裏試舉一例,希望有拋磚引玉的作用:
1、在軟件程序中有一段加密過的密文 S
2、密鑰 = F(用戶名稱,序列號) 用上麵的二元算法得到密鑰
3、明文D = F-DES(密文S, 密鑰) 用得到的密鑰來解密密文得到明文 D
4、CRC = F-CRC(明文D) 對得到的明文應用各種 CRC 統計。
5、檢查 CRC 是否正確。最好多設計幾種 CRC 算法,檢查多個 CRC 結果是否 都正確。
用這種方法,在沒有一個已知正確的序列號的情況下是永遠推算不出正確的序列號的。
彩神彩票 © 1998-2024。
京ICP備34881403號
京公網安備11010802041807號