本文 將要跟大家分享如何製作Product key認證方法
以及如何 產生大量的Product key
很多時候 我們需要製作產品序號 來驗證是否使用者
為正版的使用者
有幾種認證的方法 常常看見的
1. user name/key
2. 程式會出現一段碼 要使用者去購買這個碼的認證
3. 直接打入序號 EX:314KT-CYJ4V-T05FG-4YWZK 這樣的格式
基本上 原理都是差不多的
都是利用 編碼的原理去製作的
一般來說 就是把編碼後"認證碼"給使用者去輸入
我們的程式再轉回明碼 檢查是否為正確的認證碼
例如: 認證碼"0000family00000"
我們當然不會 把"0000family00000"明白的寫出來
所以 會用編碼程式例如AES 把"0000family00000"編碼
以AES為例子 Key有128,192,256bits 編碼區塊都是16bytes
例如把"0000family00000"編碼
會得到一個16bytes encryption block
這樣還是不行的 因為encryption block是人眼無法辨識的
我們還是需要把bytes 變成使用者可以看得懂的文字
所以 還需要一個步驟 把bytes編碼成一般的文字 才有辦法給使用者使用
編碼成一般的文字 有很多方法 大多是Base-N編碼
用Hex(base16)編碼 就是需要32 chars來存放
如果用Base32來編碼 就是16*1.6 = 26 chars
Base64就需要更少了 但是Base64出來的碼 是有大小寫之分 所以 不是很建議使用
Base32 會輸出26各字 看起來會很不對稱
這個時候 很多程式會多加兩個字(ex:JS)
讓整個碼變成4*7 =28各字 變得比較對稱
EX: "DYWS YQK7 V25E YA6M 3G8M HXNY CN"
"DYWS YQK7 V25E YA6M 3G8M HXNY CNJS"
認證流程:
就是把編碼流程反過來 把暗碼解成明碼
1. Base32 decode
2. AES decode
3. Check auth codes
EX:
Key(str)=TestKey12345678
Key(hex)=546573744B6579313233343536373800
encrypt string:0000family00000
encrypted result: 1D A9 0B 39 5D 9E 36 4B 03 8B C9 BC B3 D5 96 13
Base32 Encode
DYWS YQK7 V25E YA6M 3G8M HXNY CN
Base32 Encode(padding JS at the end)
DYWS YQK7 V25E YA6M 3G8M HXNY CNJS
--->解碼過程
DYWS YQK7 V25E YA6M 3G8M HXNY CNJS (拿掉padding)
Base32 code: DYWS YQK7 V25E YA6M 3G8M HXNY CN
Base32 Decode: 1D A9 0B 39 5D 9E 36 4B 03 8B C9 BC B3 D5 96 13
AES decrypted string: 0000family00000
========================================
接下來 那我們要如何產生大量的認證碼
基本上 我們不需要整個字串都是明碼
我們只需要檢查幾個字元即可
例如: 字元[5-10]為"family"即可 (Magic string)
前五個字元亂數產生 (salt string)
字元[11-12]可以用來當作產品類別用途 (data string)
字元[13-15]reserved保留不用
然後把字串拿去編碼
就可以產生需要的大量的產品碼了
這邊提供base32 encode/decode原始碼
加上之前AES encrytion相信大家就可以做出自己的Product key了
參考文章:
Product Keys Based on the Advanced Encryption Standard (AES)
By Jeffrey Walton
2009年4月1日 星期三
AES原始碼 & 加/解密檔案心得
很多程式 為了機密或是不想被使用者改設定
需要加密自己的檔案 這邊提供一個AES的source codes
我利用AES 作一個加解密程式
我是利用 http://www.hoozi.com/Articles/AESEncryption.htm 上的source codes
去整合出我的AES的pure c code module
AES module API list
1. SetKey API
2. Encrypt/Decrypt Memory to memory API
3. Encrypt memory to File API
4. Decrypt file to memory API
5. Encrypt/Decrypt File to File API
這邊 舉出要設計一個加解密程式的一點心得
因為AES是屬於block encryption
所以 在實作上 必須要注意 (適用在所有加密的檔案)
加密後的檔案 必須要有一個自己定義的header
header內容
1. signature (用來比對 檔案 是否為我們的定義的)
2. encrypted data size (比對 檔案size)
3. original data size (因為AES是block encryption,所以 原始檔案size必須要記錄下來)
4. Hash key(EX: MD5, SHA1 用來判斷 內容是否有問題)
5. flag(例如 有沒有compress等等的狀態的描述)
6. version (為了以後擴充用)
7. reserved buffer
PS. Header 的設計
1. 要考慮到 padding issue.
2. size要考慮到big-endian/ little endian issue(cross platform)
附上的 是簡易的版本(win32 only/VS2005) 提供
1. SetKey API
2. Encrypt/Decrypt Memory to memory API
Sample code
需要加密自己的檔案 這邊提供一個AES的source codes
我利用AES 作一個加解密程式
我是利用 http://www.hoozi.com/Articles/AESEncryption.htm 上的source codes
去整合出我的AES的pure c code module
AES module API list
1. SetKey API
2. Encrypt/Decrypt Memory to memory API
3. Encrypt memory to File API
4. Decrypt file to memory API
5. Encrypt/Decrypt File to File API
這邊 舉出要設計一個加解密程式的一點心得
因為AES是屬於block encryption
所以 在實作上 必須要注意 (適用在所有加密的檔案)
加密後的檔案 必須要有一個自己定義的header
header內容
1. signature (用來比對 檔案 是否為我們的定義的)
2. encrypted data size (比對 檔案size)
3. original data size (因為AES是block encryption,所以 原始檔案size必須要記錄下來)
4. Hash key(EX: MD5, SHA1 用來判斷 內容是否有問題)
5. flag(例如 有沒有compress等等的狀態的描述)
6. version (為了以後擴充用)
7. reserved buffer
PS. Header 的設計
1. 要考慮到 padding issue.
2. size要考慮到big-endian/ little endian issue(cross platform)
附上的 是簡易的版本(win32 only/VS2005) 提供
1. SetKey API
2. Encrypt/Decrypt Memory to memory API
Sample code
訂閱:
文章 (Atom)