做个计算器--生成注册码
本篇文章将实现注册机生成注册码,首先讲解 MD5 的原理,接着通过代码的形式来实现生成注册码。
零、MD5 原理
0.1 散列函数
散列函数主要用于校验数据的完整性,通过散列函数可以创建消息的数字指纹,消息接收方校验消息的哈希值来验证消息的完整性,防止消息被篡改。散列函数具有如下特点:
- 运算过程不可逆,具有单向性;
- 不同的消息具有不同的散列值,不存在相同的散列值;
- 对消息长度无限制。
0.2 MD5 算法原理
MD5 算法是典型的摘要算法,它是由 MD4、MD3 和 MD2 发展而来。原理是接收一个任意长度的消息生成一个 128 位的消息摘要,这个 128 位的消息摘要转换成十六进制就是是一个 32 字节长度的字符串,因此平时见到的 MD5 字符串都是 32 位的十六进制。对 MD5 算法简要的叙述为,MD5 以 512 位分组来处理输入的信息,每一分组又被划分为 16 个 32 位的子分组,经过了一系列的处理后,算法的输出由四个 32 位分组组成,将这四个 32 位分组级联后将生成一个 128 位散列值。因为本篇主要是讲解生成注册码的方法,因此 MD5 具体的原理我在这里就不细说了。
一、生成注册码
1.1 实现思路
我们先来看一下实现思路,在获取到机器码后,将机器码复制到注册机上,当我们点击生成注册码按钮时,注册机会首先读取输入的机器码,然后在机器码的开头和结尾分别拼接上两个不同的字符串(暂且将这两个字符串叫做盐),加盐的目的就是为了防止计算器软件的使用者在猜测到我们使用的是 MD5 加密来生成机器码的情况下,自己生成注册码注册我们的软件。接着把加密信息,然后将加密后的信息再次进行 MD5 加密并去掉 MD5 字符串中的横线。这样就生成了我们要的注册码。
1.2 代码实现
按照上面的思路我们来实现一下。首先我们需要引入 System.Security.Cryptography 命名空间,它提供了 MD5 加密算法。
using System;
using System.Text;
using System.Windows.Forms;
//引入 System.Security.Cryptography
using System.Security.Cryptography;
namespace RegisterMachine
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Registered_button_Click(object sender, EventArgs e)
{
//读取机器码
string machineCode = MachineCode_TextBox.Text;
//在机器码的开头和结尾分别拼接上两个不同的盐(这里的盐是固定值)
machineCode = $"miao{machineCode}shu";
//加密信息
string md5Str = MD5(machineCode);
//再次加密信息
md5Str = MD5(md5Str);
//去除md5字符串中的横线
md5Str = md5Str.Replace("-", "");
RegistrationCode_TextBox.Text = md5Str;
}
private static string MD5(string str)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] bytes = Encoding.UTF8.GetBytes(str);
string md5Str = BitConverter.ToString(md5.ComputeHash(bytes));
return md5Str;
}
}
}
二、总结
文章简单讲解了 MD5 加密的原理,之后又以 MD5 为基础编写了实现注册码生成。在下一篇文章中我们将这篇文章的基础上实现一机一码。
Tip 本篇文章下载代码下载地址:.git 选择
RegistrationCode 分支