怎么做带数据库的网站,网页编辑器dw,设计手机网站,建设网站有哪些生成注册码#xff08;非对称加解密#xff09;
我们再列出几种生成注册码的情况#xff1a;
#xff08;1#xff09;软件生成一个机器码#xff0c;交给开发者#xff0c;开发者提供一个注册码。
#xff08;2#xff09;把用户名交给开发者#xff0c;开发者提…生成注册码非对称加解密
我们再列出几种生成注册码的情况
1软件生成一个机器码交给开发者开发者提供一个注册码。
2把用户名交给开发者开发者提供一个注册码。
3直接向开发者索取一个注册码。
在算法上这几种情况并无太大区别。如果我们有一个原始的码机器码或用户名我们把它设为x那么注册码就是x的一个函数yf(x)。如果是第三种情况那么x可能是一个随机数也可能是有效期信息等同样使用f(x)生成注册码然后把x-f(x)同时给到软件。
那其实这里的重点就是f(x)。我们以机器码为例生成注册码的流程如下 在上图中G(x)是F(x)的一个逆运算。
为了安全起见我们可以使用RSA实现F(x)和G(x)。我们在注册机一端使用私钥加密然后在软件一端使用公钥解密。有几个问题要在这里说一下
1如果我们使用C#开发的话我们会发现系统的RSACryptoServiceProvider类只能公钥加密私钥解密。我们可以使用一个名为BouncyCastle的第三库。加密解密代码如下
//RSA密钥对的构造器
RsaKeyPairGenerator keyGenerator new RsaKeyPairGenerator();//RSA密钥构造器的参数
RsaKeyGenerationParameters param new RsaKeyGenerationParameters(Org.BouncyCastle.Math.BigInteger.ValueOf(3),new SecureRandom(),192, //密钥长度 25);
//用参数初始化密钥构造器
keyGenerator.Init(param);
//产生密钥对
AsymmetricCipherKeyPair keyPair keyGenerator.GenerateKeyPair();
//获取公钥和密钥
AsymmetricKeyParameter publicKey keyPair.Public;
AsymmetricKeyParameter privateKey keyPair.Private;SubjectPublicKeyInfo subjectPublicKeyInfo SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey);
Asn1Object asn1ObjectPublic subjectPublicKeyInfo.ToAsn1Object();
byte[] publicInfoByte asn1ObjectPublic.GetEncoded(UTF-8);PrivateKeyInfo privateKeyInfo PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKey);
Asn1Object asn1ObjectPrivate privateKeyInfo.ToAsn1Object();
byte[] privateInfoByte asn1ObjectPrivate.GetEncoded(UTF-8);byte[] data new byte[] { 2, 3, 5, 7, 1, 2, 5, 8, 4, 2, 4 };
byte[] encrypt null;
{AsymmetricKeyParameter priKey PrivateKeyFactory.CreateKey(privateInfoByte);IAsymmetricBlockCipher engine new Pkcs1Encoding(new RsaEngine());engine.Init(true, priKey);encrypt engine.ProcessBlock(data, 0, data.Length);
}byte[] decrypt null;
{Asn1Object pubKeyObj Asn1Object.FromByteArray(publicInfoByte);AsymmetricKeyParameter pubKey PublicKeyFactory.CreateKey(publicInfoByte);IAsymmetricBlockCipher engine new Pkcs1Encoding(new RsaEngine());engine.Init(false, pubKey);decrypt engine.ProcessBlock(encrypt, 0, encrypt.Length);
}
2有人说这样的方法只要对软件进行反编译把公钥替换成自己生成的公钥就能破解。是的这并没有错。但如果能对软件反编译的话我们可以直接把判断的语句改掉例如把if(valid)改成if(true)就可以了。所以我们这里有一个假设就是破解者无法对软件进行反编译。我们可以用加壳或混淆的方式来做这里不涉及。
3最大的问题就是RSA的密钥长度很长。C#自带的RSA类要求密钥最短是384位转成16进制有96个字符太长了。即使是用上面的第三方库最短也要192位也就是48个字符。所以这种方法是没办法用在手抄注册码的场合的可以用在注册证书也就是文件存放注册码。