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

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

(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. 机器码、序列号、认证码、注册码的生成算法(二)

    设备动态密码设计 我们再把需求列出来: (1)密码只能是阿拉伯数字,而且不能太长,一般要求10位以下,否则记不住,或让人感觉厌烦. (2)密码包含用户信息,系统能知道是谁对设备进行了操作. (3)密码 ...

  2. adb 判断imei_获取设备序列号 SN码(对应:设置-关于手机-状态-序列号 )

    本文 前情提要 我们通过 SN 码和 IMEI 码来混合确定一个唯一的 android 手机. SN码是Serial Number的缩写,有时也叫SerialNo,也就是产品序列号,产品序列是为了验证 ...

  3. HMAC(1)消息认证码MAC算法

    1. 定义 MAC(Message Authentication Code) 算法是以消息本身和密钥作为输入,经过一系列计算产生一个消息哈希的算法,用来保证消息的数据完整性和消息的数据源认证. 2. ...

  4. 【转】HMAC哈希消息认证码及算法原理

    HMAC算法原理 HMAC算法是一种基于密钥的报文完整性的验证方法 ,其安全性是建立在Hash加密算法基础上的.它要求通信双方共享密钥.约定算法.对报文进行Hash运算,形成固定长度的认证码.通信双方 ...

  5. mysql序列号生成_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法

    今天我们来拆解 Snowflake 算法,同时领略百度.美团.腾讯等大厂在全局唯一 ID 服务方面做的设计,接着根据具体需求设计一款全新的全局唯一 ID 生成算法.这还不够,我们会讨论到全局唯一 ID ...

  6. JAVA加密解密之消息认证码算法(Message Authentication Code,MAC)

    消息认证码算法简介 在密码学中,消息认证码(英语:Message authentication code,缩写为MAC),又译为消息鉴别码.文件消息认证码.讯息鉴别码.信息认证码,是经过特定算法后产生 ...

  7. IMEI 码的校验和生成

    IMEI 码的校验和生成 文章目录 IMEI 码的校验和生成 IMEI 码 Luhn算法 代码实现C IMEI 码 IMEI 码,即手机的串号.它是 International Mobile Equi ...

  8. 消息认证之SHA散列算法族

    消息认证--安全散列算法SHA(Secure Hash Algorithm) 一. 消息认证 对要传递的消息进行加密有两个目的,其一是防止消息被消息发送者和消息接收者之外的第三者窃听(被动攻击),在之 ...

  9. 消息认证码和单向散列函数

    因为在上一部分没有解释这两个概念,所以在这里详细解释一下 消息验证码和单向散列函数是进行消息身份验证的两个方法 而且他俩都属于"没有消息加密的消息身份验证" 消息认证码(MAC) ...

  10. 美团技术分享:深度解密美团的分布式ID生成算法

    本文来自美团技术团队"照东"的分享,原题<Leaf--美团点评分布式ID生成系统>,收录时有勘误.修订并重新排版,感谢原作者的分享. 1.引言 鉴于IM系统中聊天消息I ...

最新文章

  1. python判断实例的类型
  2. [转]char * 和字符数组
  3. Android中样式及主题
  4. vb 计算圆环上每一点的坐标_工程土方量计算比较分析
  5. 从零实现Vue的组件库(零)- 基本结构以及构建工具
  6. go interface 转 string_深入理解Go的interface内部执行原理
  7. poj 2823 Sliding Window 双向队列,学习
  8. 拓端tecdat|matlab估计arma garch 条件均值和方差模型
  9. 量子加密技术成功在人工智能产品上的应用落地
  10. 远程springmvc ajax请求乱码,网络编程springMVC解决ajax请求乱码的三种方法
  11. 如何写一篇好的职场文档
  12. 安卓蓝牙SCO打开流程
  13. php汽车找车位,六款停车APP吐血实测 竟能找到免费停车场?
  14. SecureCRT+SecureFX 7.0.0.326 (32+64位)绿色汉化整合版
  15. PostgreSQL 用 CTE语法 + 继承 实现平滑拆分大表
  16. 通过指定cellid获取周围cellid信息,改变指定cellid的颜色
  17. 直播平台必备-百度音视频直播 LSS
  18. Linux中su命令与su-命令区别详解!
  19. 微信小程序上传图片到腾讯云服务器,微信小程序 (发帖功能), 上传本地图片到腾讯云怎么实现?...
  20. 【毕业设计】基于微信小程序的备忘录记事助手

热门文章

  1. 通过REST API修改JUNOS的配置
  2. php微信实现红包雨,怎么制作微信红包雨(微信红包雨特效)
  3. 基于android的校园二手交易平台的设计
  4. 2022最新第四方聚合支付系统源码+详细搭建教程
  5. qt中实现多语言功能
  6. 11.合并两个有序数组
  7. 小米工作室AIoT开发平台高校创新赛报名启动
  8. IOTOS物联中台对接海康安防平台(iSecure Center)门禁系统
  9. css 都有哪些字体,css字体有哪些
  10. v50进9008救砖