机器码、序列号、认证码、注册码的生成算法(四)

机器码、序列号、认证码、注册码的⽣成算法(四)
青梅1H
⽣成注册码(⾮对称加解密)
我们再列出⼏种⽣成注册码的情况:
(1)软件⽣成⼀个机器码,交给开发者,开发者提供⼀个注册码。
(2)把⽤户名交给开发者,开发者提供⼀个注册码。
(3)直接向开发者索取⼀个注册码。
在算法上,这⼏种情况并⽆太⼤区别。如果我们有⼀个原始的码(机器码或⽤户名),我们把它设为x,那么注册码就是x的⼀个函数
y=f(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个字符。所以,这种⽅法是没办法⽤在⼿抄注册码的场合的,可以⽤在注册证书,也就是⽂件存放注册码。

本文发布于:2024-09-22 19:27:35,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/105928.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:注册码   开发者   密钥
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议