2009年4月7日 星期二

如何製作產品序號(Product key) 用AES為例

本文 將要跟大家分享如何製作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

沒有留言:

張貼留言