考試大編輯整理C++編程知識
網上大多數共享軟件的注冊碼(又稱為序列號)的設計都不是很好,比較容易被*者做出注冊機來。下面介紹一種利用公鑰算法(又稱為非對稱算法)RSA制作注冊碼的方法。采用這種方法,不知道密鑰的話時很難寫出注冊機來。實際上有部分軟件已經使用了這類方法。
大家都知道RSA采用一對密鑰,即公鑰和私鑰,從公鑰難于推出私鑰,反之亦然,這個難度是基于大數分解的難度。利用RSA生成共享軟件注冊碼的思路如下:
1、先隨機生成一對公鑰E和私鑰D;
2、軟件作者自己寫一個注冊機,注冊機完成的工作就是把用戶名M用私鑰D加密,密文C就是注冊碼。由于密文往往包含不可顯示字符,所以把密文進行編碼,變成可顯示字符,比如采用base64、uuencode編碼等。
密文C = (M ^ D) mod N
其中^表示乘冪,mod表示求余,N為RSA的模數。
3、共享軟件將用戶輸入的注冊碼先進行解碼(如base64解碼等),得到密文,然后用公鑰E對密文進行解密,得到明文M\',如果明文和用戶名相同(即滿足M\' = M),則說明注冊碼正確,否則就是非法的注冊碼。*者可以通過跟蹤你的軟件得到公鑰E,但無法得到私鑰D。
明文M\' = (C ^ E) mod D
有幾點需要說明:
1、模數N太短時不安全,容易被分解。以目前的計算能力,建議N取值在512-bit以上。但這樣注冊碼的長度也變長了,可能給用戶帶來不方便。一般要采用大數運算庫來實現(xiàn)RSA。
2、隨機生成密鑰對時,要采用盡可能好的隨機數生成算法,否則N還是很有可能被分解。
3、也可以在注冊機中用公鑰E對用戶名加密得到注冊碼,在軟件中對用戶輸入的注冊碼用私鑰D進行解密得到用戶名。此時公鑰E就不能取常用的3、65537等固定值,否則一旦被猜出E,則也可以寫出注冊機,因為此時*者可以從你的軟件中得到私鑰D。
4、這種方法只是為了防止被人寫出注冊機,它無法防止通過修改程序中跳轉指令的方法來*你的軟件。為了防止別人修改你的程序文件,可以用注冊碼中的一部分來加密你的程序代碼或數據。
5、這種方法稍加改動即可防止正版用戶散發(fā)注冊碼,即采用一機一碼的方法,將用戶名替換成用戶機器的硬軟件信息即可,這個硬軟件信息應能地表示用戶的機器,否則也容易被偽造。
6、采用了上面的方法之后,只有知道至少一個合法注冊碼的人才能將程序*。
下面舉一個例子,采用大數運算庫Freelip(http://www.und.nodak.edu/org/crypto/crypto/numbers/programs/freelip/freelip_1.1.tar.gz)來實現(xiàn)RSA。該庫是用C寫的,商業(yè)使用需要許可證。
1、首先隨機生成密鑰對??梢宰约壕幊屉S機搜索大素數。此處由于是舉例,我們采用RSATool(http://www.secretashell.com/TMG/RSATool2v15.zip)生成64-bit RSA的參數:
大素數P = A57F2B33, 大素數Q = E7C441B3, 模數N = 95D49FD119EF27A9, 私鑰D = 76D2A6E2AC86CC99, 公鑰E = 65537
2、制作注冊機。將用戶名用私鑰D進行加密,得到的密文作為注冊碼:
首先定義宏WIN32(VC自帶,但BCB中需要自己定義),然后包含頭文件\"lip.h\":
#ifndef WIN32
#define WIN32
#endif
網上大多數共享軟件的注冊碼(又稱為序列號)的設計都不是很好,比較容易被*者做出注冊機來。下面介紹一種利用公鑰算法(又稱為非對稱算法)RSA制作注冊碼的方法。采用這種方法,不知道密鑰的話時很難寫出注冊機來。實際上有部分軟件已經使用了這類方法。
大家都知道RSA采用一對密鑰,即公鑰和私鑰,從公鑰難于推出私鑰,反之亦然,這個難度是基于大數分解的難度。利用RSA生成共享軟件注冊碼的思路如下:
1、先隨機生成一對公鑰E和私鑰D;
2、軟件作者自己寫一個注冊機,注冊機完成的工作就是把用戶名M用私鑰D加密,密文C就是注冊碼。由于密文往往包含不可顯示字符,所以把密文進行編碼,變成可顯示字符,比如采用base64、uuencode編碼等。
密文C = (M ^ D) mod N
其中^表示乘冪,mod表示求余,N為RSA的模數。
3、共享軟件將用戶輸入的注冊碼先進行解碼(如base64解碼等),得到密文,然后用公鑰E對密文進行解密,得到明文M\',如果明文和用戶名相同(即滿足M\' = M),則說明注冊碼正確,否則就是非法的注冊碼。*者可以通過跟蹤你的軟件得到公鑰E,但無法得到私鑰D。
明文M\' = (C ^ E) mod D
有幾點需要說明:
1、模數N太短時不安全,容易被分解。以目前的計算能力,建議N取值在512-bit以上。但這樣注冊碼的長度也變長了,可能給用戶帶來不方便。一般要采用大數運算庫來實現(xiàn)RSA。
2、隨機生成密鑰對時,要采用盡可能好的隨機數生成算法,否則N還是很有可能被分解。
3、也可以在注冊機中用公鑰E對用戶名加密得到注冊碼,在軟件中對用戶輸入的注冊碼用私鑰D進行解密得到用戶名。此時公鑰E就不能取常用的3、65537等固定值,否則一旦被猜出E,則也可以寫出注冊機,因為此時*者可以從你的軟件中得到私鑰D。
4、這種方法只是為了防止被人寫出注冊機,它無法防止通過修改程序中跳轉指令的方法來*你的軟件。為了防止別人修改你的程序文件,可以用注冊碼中的一部分來加密你的程序代碼或數據。
5、這種方法稍加改動即可防止正版用戶散發(fā)注冊碼,即采用一機一碼的方法,將用戶名替換成用戶機器的硬軟件信息即可,這個硬軟件信息應能地表示用戶的機器,否則也容易被偽造。
6、采用了上面的方法之后,只有知道至少一個合法注冊碼的人才能將程序*。
下面舉一個例子,采用大數運算庫Freelip(http://www.und.nodak.edu/org/crypto/crypto/numbers/programs/freelip/freelip_1.1.tar.gz)來實現(xiàn)RSA。該庫是用C寫的,商業(yè)使用需要許可證。
1、首先隨機生成密鑰對??梢宰约壕幊屉S機搜索大素數。此處由于是舉例,我們采用RSATool(http://www.secretashell.com/TMG/RSATool2v15.zip)生成64-bit RSA的參數:
大素數P = A57F2B33, 大素數Q = E7C441B3, 模數N = 95D49FD119EF27A9, 私鑰D = 76D2A6E2AC86CC99, 公鑰E = 65537
2、制作注冊機。將用戶名用私鑰D進行加密,得到的密文作為注冊碼:
首先定義宏WIN32(VC自帶,但BCB中需要自己定義),然后包含頭文件\"lip.h\":
#ifndef WIN32
#define WIN32
#endif