zoukankan      html  css  js  c++  java
  • 软件注册码(算法一DES)

    DES,Rijndael,BouncyCastle
     1 /// <summary>
     2     /// 加密,解密 接口
     3     /// </summary>
     4     public interface ICrypto
     5     {
     6         /// <summary>
     7         /// 加密
     8         /// </summary>
     9         /// <param name="bytes"></param>
    10         /// <returns></returns>
    11         byte[] Encrypt(byte[] bytes);
    12         /// <summary>
    13         /// 解密
    14         /// </summary>
    15         /// <param name="bytes"></param>
    16         /// <returns></returns>
    17         byte[] Decrypt(byte[] bytes);
    18     }
     1  /// <summary>
     2     /// DES算法
     3     /// </summary>
     4     public class DESCrypto : ICrypto
     5     {
     6         private byte[] _key;
     7         private byte[] _iv = new byte[] { 107, 22, 226, 145, 208, 243, 46, 41 };
     8         private DESCryptoServiceProvider GetProvider()
     9         {
    10             DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();
    11             descsp.IV = this._iv;
    12             descsp.Key = this._key;
    13             return descsp;
    14         }
    15         public DESCrypto(byte[] key)
    16         {
    17             this._key = key;
    18         }
    19         /// <summary>
    20         /// 加密
    21         /// </summary>
    22         /// <param name="bytes"></param>
    23         /// <returns></returns>
    24         public byte[] Encrypt(byte[] bytes)
    25         {
    26             DESCryptoServiceProvider descsp = this.GetProvider();
    27             ICryptoTransform it = descsp.CreateEncryptor(descsp.Key, descsp.IV);
    28             return it.TransformFinalBlock(bytes, 0, bytes.Length);
    29         }
    30         /// <summary>
    31         /// 解密
    32         /// </summary>
    33         /// <param name="bytes"></param>
    34         /// <returns></returns>
    35         public byte[] Decrypt(byte[] bytes)
    36         {
    37             DESCryptoServiceProvider descsp = this.GetProvider();
    38             ICryptoTransform it = descsp.CreateDecryptor(descsp.Key, descsp.IV);
    39             return it.TransformFinalBlock(bytes, 0, bytes.Length);
    40         }
    41     }

    1:建立LicenseInfo类,来完成软件的版本或者过期时间信息

     1  public class LicenseInfo
     2     {
     3         public byte LicenseType { get; set; }
     4         public int ExhaustionDayTicks { get; set; }
     5         public LicenseInfo()
     6         {
     7         }
     8         public LicenseInfo(byte licenseType, int exhaustionDayTicks)
     9         {
    10             this.LicenseType = licenseType;
    11             this.ExhaustionDayTicks = exhaustionDayTicks;
    12         }
    13         public byte[] ToByteArray()
    14         {
    15             byte[] bytes = new byte[5];
    16             bytes[0] = LicenseType;
    17             byte[] exhaustBytes = BitConverter.GetBytes(ExhaustionDayTicks);
    18             for (int i = 0; i < 4; i++)
    19             {
    20                 bytes[i + 1] = exhaustBytes[i];
    21             }
    22             return bytes;
    23         }
    24         public static LicenseInfo FromByteArray(byte[] bytes)
    25         {
    26             LicenseInfo licenseInfo = new LicenseInfo();
    27             licenseInfo.LicenseType = bytes[0];
    28             licenseInfo.ExhaustionDayTicks = BitConverter.ToInt32(bytes, 1);
    29             return licenseInfo;
    30         }
    31     }

    2:建立Client客户端类,生成客户端序列号

     1 public byte[] GetProductKeyBytes(string pid)
     2         {
     3             string productKey = pid;
     4             byte[] bytes = Utils.GetBytes(productKey);
     5             byte[] hashBytes = Utils.ComputeHash(bytes);
     6             byte[] initHash = new byte[8] { 139, 59, 237, 93, 177, 134, 88, 69 };
     7             byte[] mergedHash = new byte[8];
     8             for (int i = 0; i < 8; i++)
     9             {
    10                 mergedHash[i] = (byte)(initHash[i] ^ hashBytes[i] ^ hashBytes[i + 8]);
    11             }
    12             return mergedHash;
    13         }
    14         /// <summary>
    15         /// 序列号
    16         /// </summary>
    17         /// <param name="pid"></param>
    18         /// <returns></returns>
    19         public string GetProductKey(string pid)
    20         {
    21             byte[] productKeyBytes = GetProductKeyBytes(pid);
    22             return Utils.ConvertBytesToHexString(productKeyBytes);
    23         }

    3:软件制作者用客户端的序列号加密成注册码,发送给客户

    4:客户验证注册码,进入软件

     1  /// <summary>
     2         /// 验证注册码
     3         /// </summary>
     4         /// <param name="productKey"></param>
     5         /// <param name="activationCode"></param>
     6         /// <param name="systemDate"></param>
     7         /// <param name="licenseInfo"></param>
     8         /// <returns></returns>
     9         public bool ValidateLicense(string productKey, string activationCode, DateTime systemDate, out LicenseInfo licenseInfo)
    10         {
    11             licenseInfo = null;
    12             if (string.IsNullOrEmpty(productKey) || string.IsNullOrEmpty(activationCode)) return false;
    13             byte[] productKeyBytes = Utils.ConvertHexStringToBytes(productKey);
    14             byte[] activationCodeBytes = Utils.ConvertHexStringToBytes(activationCode);
    15             licenseInfo = null;
    16             try
    17             {
    18                 byte[] licenseInfoBytes = CryptoFactory.GetCrypto(productKeyBytes).Decrypt(activationCodeBytes);
    19                 licenseInfo = LicenseInfo.FromByteArray(licenseInfoBytes);
    20                 DateTime exhaustionDate = new DateTime(1900, 1, 1).AddDays(licenseInfo.ExhaustionDayTicks);
    21                 return exhaustionDate > systemDate;
    22             }
    23             catch (Exception)
    24             {
    25                 return false;
    26             }
    27         }
  • 相关阅读:
    关于json操作,这里再为大家推荐几款比较实用的json在线工具
    JS操作JSON总结
    HTML WebSocket
    HTML应用程序缓存
    前段也能学习网址
    简述jpg。Gif。png-8.png-24的区别,分别使用场景
    HTML相关问题
    html5移动端知识点总结
    html5本地存储(localStorage)使用介绍
    node环境变量----新全局包管理配置
  • 原文地址:https://www.cnblogs.com/macheal/p/3072165.html
Copyright © 2011-2022 走看看