C#软件注册和认证

Posted 啥也不想,只想搞钱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#软件注册和认证相关的知识,希望对你有一定的参考价值。

【C#】软件注册和认证

1 题目描述

(1)软件注册管理程序:获取CPU、硬盘、网卡等硬件信息生成机器码,加密(MD5)最后生成注册码保存在一个二进制的license文件中。
(2)软件注册认证程序:获取CPU、硬盘、网卡等硬件信息生成机器码,与本机器中软件的license文件的内容比对,成功返回true,不成功返回false。

2 源码详解

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Management;
using System.Security.Cryptography;
using System.IO;

namespace Csharp11
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void CPUNumber_Click(object sender, EventArgs e)
        {

        }
        public static string MD5(string encryptString)
        {
            byte[] result = Encoding.Default.GetBytes(encryptString);
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] output = md5.ComputeHash(result);
            string encryptResult = BitConverter.ToString(output).Replace("-", "");
            return encryptResult;
        }
        private void GenerateRegistrationCode_Click(object sender, EventArgs e)
        {
            CPUNumberText.Text = null;
            DiskSequenceNumberText.Text = null;
            MACAddressText.Text = null;
            MachineCodeText.Text = null;
            lRegistrationCodeText.Text = null;
            /// 获得CPU的序列号
            String strCpu = null;
            ManagementClass myCpu = new ManagementClass("win32_Processor");
            ManagementObjectCollection myCpuConnection = myCpu.GetInstances();
            foreach (ManagementObject myObject in myCpuConnection)
            {
                strCpu = myObject.Properties["Processorid"].Value.ToString();
                break;
            }
            CPUNumberText.Text = strCpu;



            ///获取硬盘序列号
             //创建ManagementObjectSearcher对象
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
            String strHardDiskID = null;//存储磁盘序列号
            //调用ManagementObjectSearcher类的Get方法取得硬盘序列号
            foreach (ManagementObject mo in searcher.Get())
            {
                strHardDiskID = mo["SerialNumber"].ToString().Trim();//记录获得的磁盘序列号
                break;
            }
            DiskSequenceNumberText.Text = strHardDiskID;



            ///获取网卡硬件地址
            String strMac = null;
            ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection moc = mc.GetInstances();
            foreach (ManagementObject mo in moc)
            {
                if ((bool)mo["IPEnabled"] == true)
                {
                    strMac = mo["MacAddress"].ToString();
                    break;
                }
            }
            MACAddressText.Text = strMac;



            ///生成机器码
            string strNum = strCpu + strHardDiskID + strMac; //获得24位Cpu和硬盘序列号
            strNum = strNum.Replace(":", "");
            MachineCodeText.Text = strNum;



            ///MD5加密
            byte[] result = Encoding.Default.GetBytes(strNum.Trim());
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] output = md5.ComputeHash(result);
            String logNum = BitConverter.ToString(output).Replace("-", "");
            lRegistrationCodeText.Text = logNum;



            ///license 保存
            FileStream fs = new FileStream(@"licence.lic", FileMode.Create);
            BinaryWriter binWriter = new BinaryWriter(fs);
            binWriter.Write(logNum.ToCharArray(), 0, logNum.Length);
            binWriter.Close();
            fs.Close();
        }

        private void RegistrationCodeAuthentication_Click(object sender, EventArgs e)
        {
            AfterCPUNumberText.Text = null;
            AfterDiskSequenceNumberText.Text = null;
            AfterMACAddressText.Text = null;
            AfterMachineCodeText.Text = null;
            AfterlRegistrationCodeText.Text = null;
            /// 获得CPU的序列号
            String strCpu = null;
            ManagementClass myCpu = new ManagementClass("win32_Processor");
            ManagementObjectCollection myCpuConnection = myCpu.GetInstances();
            foreach (ManagementObject myObject in myCpuConnection)
            {
                strCpu = myObject.Properties["Processorid"].Value.ToString();
                break;
            }
            AfterCPUNumberText.Text = strCpu;



            ///获取硬盘序列号
             //创建ManagementObjectSearcher对象
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
            String strHardDiskID = null;//存储磁盘序列号
            //调用ManagementObjectSearcher类的Get方法取得硬盘序列号
            foreach (ManagementObject mo in searcher.Get())
            {
                strHardDiskID = mo["SerialNumber"].ToString().Trim();//记录获得的磁盘序列号
                break;
            }
            AfterDiskSequenceNumberText.Text = strHardDiskID;



            ///获取网卡硬件地址
            String strMac = null;
            ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection moc = mc.GetInstances();
            foreach (ManagementObject mo in moc)
            {
                if ((bool)mo["IPEnabled"] == true)
                {
                    strMac = mo["MacAddress"].ToString();
                    break;
                }
            }
            AfterMACAddressText.Text = strMac;



            ///生成机器码
            string strNum = strCpu + strHardDiskID + strMac; //获得24位Cpu和硬盘序列号
            strNum = strNum.Replace(":", "");
            AfterMachineCodeText.Text = strNum;



            ///MD5加密
            byte[] result = Encoding.Default.GetBytes(strNum.Trim());
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] output = md5.ComputeHash(result);
            String logNum = BitConverter.ToString(output).Replace("-", "");
            AfterlRegistrationCodeText.Text = logNum;



            ///license 保存
            byte[] tempSpace;
            FileStream fs = new FileStream(@"licence.lic", FileMode.Open);
            BinaryReader binReader = new BinaryReader(fs);
            tempSpace = new byte[fs.Length];
            binReader.Read(tempSpace, 0, (int)fs.Length);
            binReader.Close();
            fs.Close();

            String s = Encoding.UTF8.GetString(tempSpace);

            if (s.Equals(logNum))
            {
                MessageBox.Show("认证成功!", "TRUE", MessageBoxButtons.OKCancel, MessageBoxIcon.None);
            }
            else
            {
                MessageBox.Show("认证失败!", "ERROR", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
            }
        }
    }
}

3 实现效果

在这里插入图片描述

在这里插入图片描述

以上是关于C#软件注册和认证的主要内容,如果未能解决你的问题,请参考以下文章

是否可以动态编译和执行 C# 代码片段?

优化 C# 代码片段、ObservableCollection 和 AddRange

C#程序员经常用到的10个实用代码片段 - 操作系统

Django REST框架--认证和权限

C# 最有用的(自定义)代码片段是啥? [关闭]

c#代码片段快速构建代码