序列號加密中的數學算法

序列號加密中的數學算法

數學算法一項都是密碼加密的核心,但在一般的軟件加密中,它似乎並不太爲人們關心,因爲大多數時候軟件加密本身實現的都是一種編程的技巧。但近幾年來隨着序列號加密程序的普及,數學算法在軟件加密中的比重似乎是越看越大了。
  我們先來看看在網絡上大行其道的序列號加密的工作原理。當用戶從網路上下載某個Shareware-共享軟件後,一般都有使用時間上的限制,當過了共享軟件的試用期後,您必須到這個軟件的公司去註冊後方能繼續使用。註冊過程一般是用戶把自己的私人信息(一般主要指名字)連同信用卡號碼告訴軟件公司,軟件公司會根據用戶的信息計算出一個序列碼,在用戶得到這個序列號後,按照註冊需要的步驟在軟件中輸入註冊信息和註冊碼,其註冊信息的合法性由軟件驗證通過後,軟件就會取消掉本身的各種限制,這種加密實現起來比較簡單,不需要額外的成本,用戶購買也非常方便,在互聯網上的軟件80%都是以這種方式來保護的。
  我們注意到軟件驗證序列號的合法性過程,其實就是驗證用戶名和序列號之間的換算關係是否正確的過程。其驗證最基本的有兩種,一種是按用戶輸入的姓名老生成註冊碼,再同用戶輸入的註冊碼比較,公式表示如下:
  序列號=F(用戶名)
  但這種方法等於在用戶軟件中再現了軟件公司生成註冊碼的過程,實際上是非常不安全的,不論其換算過程多麼複雜,解密者只需把您的換算過程從程序中提取出來就可以編制一個通用的註冊程序。
  另外一種是通過註冊碼來驗證用戶名的正確性,公式表示如下:
  用戶名稱=F逆(序列號)(如ACDSee)
  這其實是軟件公司註冊碼計算過程的反算法,如果正向算法與反向算法不是對稱算法的話,對於解密者來說,的確有些困難,但這種算法相當不好設計。
  於是有人考慮到以下的算法:
  F1(用戶名稱)=F2(序列號)
  F1、F2是兩種完全不同的算法,但用戶名通過F1算法的計算出的特徵等於序列號通過F2算法計算出的特徵字,這種算法在設計上比較簡單,保密性相對以上兩種算法也要好的多。如果能夠把F1、F2算法設計成不可逆算法的話,保密性相當好;可一旦解密者找到其中之一的反算法的話,這種算法就不安全了。一元算法的設計看來再如何努力也很難有太大的突破,那麼二元呢?
  特定值=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結果是否都正確
  用這種方法,在沒有一個已知正確的序列號情況下是永遠推算不出正確的序列號的。
  mp,lstrlen,memcpy(限於NT)。

發佈了81 篇原創文章 · 獲贊 33 · 訪問量 3552
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章