原文:http://blog.csdn.net/eagleking012/article/details/7099900
平常我們都接觸過軟件注冊,輸入序列號、激活碼、注冊碼、授權碼;對於這些字符碼到底代表什么含義不甚了解,但一般來說,這些字符碼中都有幾個特點:
1、唯一性,肯定是一個唯一的序列號,否則就會存在濫用的問題。
2、加密性,肯定是經過加密或者混亂的,防止大家自己生成序列號。
3、解密性,軟件自身肯定可以解密,否則無法驗證合法性。
4、可讀性,序列號一般都比較標准,方便書寫和記憶,所以一般都為數字和字母。
這些特征是如何保證的呢?
1、唯一性,我們可以引用一些動態因子,如時間、IP、串號等信息,這就保證了軟件環境的唯一性。
2、加密性,有很多方法,可以用DES、AES進行對稱加密,也可以用RSA進行非對稱加密。
3、解密性,這時候就不能用MD5加密了,否則序列號內的信息是不可逆的,一般軟件和注冊碼都是分開的,軟件中事先設定好密鑰才可以解密。
4、可讀性,可以通過hex算法將字符串都轉換為字母。
前三個特征有很多方法可以參考,第4點雖然簡單,但是對於新手可能不怎么了解,以下給出簡單示例:
- /**
- * byte轉哈希
- * @param b
- * @return
- */
- public static String byte2hex(byte[] b) {
- String hs = "";
- String stmp = "";
- for (int n = 0; n < b.length; n++) {
- stmp = Integer.toHexString(b[n] & 0xFF);
- if (stmp.length() == 1)
- hs += ("0" + stmp);
- else
- hs += stmp;
- }
- return hs.toUpperCase();
- }
- /**
- * 哈希轉byte
- * @param b
- * @return
- */
- public static byte[] hex2byte(byte[] b) {
- if ((b.length % 2) != 0)
- throw new IllegalArgumentException("長度不是偶數");
- byte[] b2 = new byte[b.length / 2];
- for (int n = 0; n < b.length; n += 2) {
- String item = new String(b, n, 2);
- b2[n / 2] = (byte) Integer.parseInt(item, 16);
- }
- return b2;
- }
