我爱Aspx >> VC.Net >> <b>如何用非对称密码算法制作共享软件的注册码</b>网上大多数共享软件的注册码(又称为序列号)的设计都不是很好,比较容易被破解者做出注册机来。下面介绍一种利用公钥算法(又称为非对称算法)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以上。但这样注册码的长度也变长了,可能给用户带来不方便。一般要采用大数运算库来实现RSA。
2、随机生成密钥对时,要采用尽可能好的随机数生成算法,否则N还是很有可能被分解。
3、也可以在注册机中用公钥E对用户名加密得到注册码,在软件中对用户输入的注册码用私钥D进行解密得到用户名。此时公钥E就不能取常用的3、65537等固定值,否则一旦被猜出E,则也可以写出注册机,因为此时破解者可以从你的软件中得到私钥D。
【我对这篇文章有话说?】
<b>有关注册表API函数<..[05-21]
<b>用VC++6.0的Sockets AP..[05-21]
<b>VC编程中如何操作数据库..[05-21]
<b>一个键盘程序的开发实例..[05-21]
<b>浅谈内存泄漏(三)<..[05-21]
<b>浅谈内存泄漏(二)<..[05-21]
<b>浅谈内存泄漏(一)</..[05-21]
<b>以原始套接字的方式 截..[05-21]
<b>MFC窗口位置管理详细分..[05-21]
<b>在Visual Studio 6.0集..[05-21]