机器码、序列号、认证码、注册码的生成算法(四)
生成注册码(非对称加解密)
我们再列出几种生成注册码的情况:
(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个字符。所以,这种方法是没办法用在手抄注册码的场合的,可以用在注册证书,也就是文件存放注册码。
机器码、序列号、认证码、注册码的生成算法(四)相关推荐
- 机器码、序列号、认证码、注册码的生成算法(二)
设备动态密码设计 我们再把需求列出来: (1)密码只能是阿拉伯数字,而且不能太长,一般要求10位以下,否则记不住,或让人感觉厌烦. (2)密码包含用户信息,系统能知道是谁对设备进行了操作. (3)密码 ...
- adb 判断imei_获取设备序列号 SN码(对应:设置-关于手机-状态-序列号 )
本文 前情提要 我们通过 SN 码和 IMEI 码来混合确定一个唯一的 android 手机. SN码是Serial Number的缩写,有时也叫SerialNo,也就是产品序列号,产品序列是为了验证 ...
- HMAC(1)消息认证码MAC算法
1. 定义 MAC(Message Authentication Code) 算法是以消息本身和密钥作为输入,经过一系列计算产生一个消息哈希的算法,用来保证消息的数据完整性和消息的数据源认证. 2. ...
- 【转】HMAC哈希消息认证码及算法原理
HMAC算法原理 HMAC算法是一种基于密钥的报文完整性的验证方法 ,其安全性是建立在Hash加密算法基础上的.它要求通信双方共享密钥.约定算法.对报文进行Hash运算,形成固定长度的认证码.通信双方 ...
- mysql序列号生成_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法
今天我们来拆解 Snowflake 算法,同时领略百度.美团.腾讯等大厂在全局唯一 ID 服务方面做的设计,接着根据具体需求设计一款全新的全局唯一 ID 生成算法.这还不够,我们会讨论到全局唯一 ID ...
- JAVA加密解密之消息认证码算法(Message Authentication Code,MAC)
消息认证码算法简介 在密码学中,消息认证码(英语:Message authentication code,缩写为MAC),又译为消息鉴别码.文件消息认证码.讯息鉴别码.信息认证码,是经过特定算法后产生 ...
- IMEI 码的校验和生成
IMEI 码的校验和生成 文章目录 IMEI 码的校验和生成 IMEI 码 Luhn算法 代码实现C IMEI 码 IMEI 码,即手机的串号.它是 International Mobile Equi ...
- 消息认证之SHA散列算法族
消息认证--安全散列算法SHA(Secure Hash Algorithm) 一. 消息认证 对要传递的消息进行加密有两个目的,其一是防止消息被消息发送者和消息接收者之外的第三者窃听(被动攻击),在之 ...
- 消息认证码和单向散列函数
因为在上一部分没有解释这两个概念,所以在这里详细解释一下 消息验证码和单向散列函数是进行消息身份验证的两个方法 而且他俩都属于"没有消息加密的消息身份验证" 消息认证码(MAC) ...
- 美团技术分享:深度解密美团的分布式ID生成算法
本文来自美团技术团队"照东"的分享,原题<Leaf--美团点评分布式ID生成系统>,收录时有勘误.修订并重新排版,感谢原作者的分享. 1.引言 鉴于IM系统中聊天消息I ...
最新文章
- python判断实例的类型
- [转]char * 和字符数组
- Android中样式及主题
- vb 计算圆环上每一点的坐标_工程土方量计算比较分析
- 从零实现Vue的组件库(零)- 基本结构以及构建工具
- go interface 转 string_深入理解Go的interface内部执行原理
- poj 2823 Sliding Window 双向队列,学习
- 拓端tecdat|matlab估计arma garch 条件均值和方差模型
- 量子加密技术成功在人工智能产品上的应用落地
- 远程springmvc ajax请求乱码,网络编程springMVC解决ajax请求乱码的三种方法
- 如何写一篇好的职场文档
- 安卓蓝牙SCO打开流程
- php汽车找车位,六款停车APP吐血实测 竟能找到免费停车场?
- SecureCRT+SecureFX 7.0.0.326 (32+64位)绿色汉化整合版
- PostgreSQL 用 CTE语法 + 继承 实现平滑拆分大表
- 通过指定cellid获取周围cellid信息,改变指定cellid的颜色
- 直播平台必备-百度音视频直播 LSS
- Linux中su命令与su-命令区别详解!
- 微信小程序上传图片到腾讯云服务器,微信小程序 (发帖功能), 上传本地图片到腾讯云怎么实现?...
- 【毕业设计】基于微信小程序的备忘录记事助手