机器码和注册码算法_机器码怎么算出注册码

(2) 2024-07-11 17:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
机器码和注册码算法_机器码怎么算出注册码,希望能够帮助你!!!。

生成注册码(非对称加解密)

我们再列出几种生成注册码的情况:

(1)软件生成一个机器码,交给开发者,开发者提供一个注册码。

(2)把用户名交给开发者,开发者提供一个注册码。

(3)直接向开发者索取一个注册码。

在算法上,这几种情况并无太大区别。如果我们有一个原始的码(机器码或用户名),我们把它设为x,那么注册码就是x的一个函数y=f(x)。如果是第三种情况,那么x可能是一个随机数(也可能是有效期信息等),同样使用f(x)生成注册码,然后把x-f(x)同时给到软件。

那其实,这里的重点就是f(x)。我们以机器码为例,生成注册码的流程如下:

机器码和注册码算法_机器码怎么算出注册码_https://bianchenghao6.com/blog__第1张

在上图中,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个字符。所以,这种方法是没办法用在手抄注册码的场合的,可以用在注册证书,也就是文件存放注册码。

 

 

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复