以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  晚上没事干,把ComponentONE.NET剁了...  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=11793)


--  作者:admin
--  发布时间:11/9/2004 2:25:00 AM

--  晚上没事干,把ComponentONE.NET剁了...


发信人: flier (小海 [浮沉随浪 记今朝]), 信区: DotNET
标  题: 晚上没事干,把ComponentONE.NET剁了...
发信站: BBS 水木清华站 (Mon Nov  3 23:52:45 2003), 转信

http://www.componentone.com/Products.aspx?ProductCode=1

C# Builder自带的一套for .NET控件,做的还不错,WinForm和Web的都有
可惜要注册因此一直懒得用...直到今天有空有心情...
发现.NET的注册机实在是好写...稍微看一下IL代码就搞定
不过没有仔细检查,只确认了在IDE和程序运行时没问题,
不知道发布出去会不会有什么不同,呵呵,欢迎反馈

用户名和公司随便填,
WinForm控件S8开头如S8202KP-TA-E3E7VD
Web控件S9开头如S9202UP-P3-T6JQB2

注册码生成核心代码如下:

using System;
using System.Text;
using System.Globalization;
using System.Reflection;
using System.Diagnostics;

namespace C1KeyGen
{
  struct AssemblyVersionInfo
  {
    public string VersionString;  // GX;
    public int Major;             // GY
    public int Minor;             // GZ
    public int Build;             // H0
    public int Year;              // H1
    public int Month;             // H2
  }

  /// <summary>
  /// serial number length = 17
  ///  
  /// starts with "SE" / "S8" / "S9", "SE" may be mean "eval"
  /// </summary>
        public class KeyGen
        {
   StringBuilder sbTransTable = null;
   static readonly string ASCII_TABLE = "23456789ABCDEFGHJKLMNPQRSTUVWXY";

                public KeyGen()
                {
      buildTransTable();
                }

    public string generate(Assembly asm, bool web)
    {
      StringBuilder sb = new StringBuilder(17, 17);

      sb.Append(web ? "S9" : "S8");

      AssemblyVersionInfo verInfo = getAssemblyVersionInfo(asm);

      int Part1 = verInfo.Year * 4 + verInfo.Month - 4;

      sb.Append((Part1 % 4).ToString("D1"));
      sb.Append((Part1 / 4 - 2000).ToString("D2"));

      byte[] data = new byte[7 - sb.Length + 6];

      new Random().NextBytes(data);

      int idx = 0;

      for(int i=sb.Length; i<7; i++)
      {
        sb.Append(ASCII_TABLE[data[idx++] % ASCII_TABLE.Length]);
      }

      StringBuilder sb2 = new StringBuilder();

      for(int i=idx; i<data.Length; i++)
      {
        sb2.Append(ASCII_TABLE[data[i] % ASCII_TABLE.Length]);
      }

      string checksum = calc(sb.ToString(), sb2.ToString());

      sb.Append('-').Append(checksum).Append('-').Append(sb2.ToString());

      return isValid(sb.ToString());
    }

    private bool inRange(string sn, int min, int max)
    {
      int value = Int32.Parse(sn, CultureInfo.InvariantCulture);

      return min <= value && value <= max;
    }

    private void buildTransTable()
    {
      sbTransTable = new StringBuilder(ASCII_TABLE);

      for(int i=1; i<sbTransTable.Length; i++)
      {
        char ch = sbTransTable[i-1];
        int k = 0;

        for(int j=1; j<sbTransTable.Length; j++)
        {
          if(((i * j) % sbTransTable.Length) == 1)
          {
            k = j;
            break;
          }
        }
        if(i < k)
        {
          sbTransTable[i-1] = sbTransTable[k-1];
          sbTransTable[k-1] = ch;
        }
      }
    }

    private string calc(string p1, string p2)
    {
      StringBuilder sb1 = new StringBuilder(p1);
      sb1.Append(p2);

      StringBuilder sb2 = new StringBuilder();
   
      for(int i=0; i<2; i++)
      {
        int k = 0;
        for(int j=0; j<sb1.Length; j++)
        {                     
          k += (j ^ (i + 1)) * sb1[j];           
        }
        sb2.Append(sbTransTable[k % sbTransTable.Length]);
      }

      return sb2.ToString();
    }

    private string isValid(string sn)
    {
      Debug.Assert(sn.Length == 17);

      Debug.Assert(inRange(sn.Substring(2, 1), 1, 4));
      Debug.Assert(inRange(sn.Substring(3, 1), 0, 9));
      Debug.Assert(inRange(sn.Substring(4, 1), 0, 9));

      Debug.Assert(sn.Substring(8, 2).Equals(calc(sn.Substring(0, 7), sn.Substring(11, 6))));

      return sn;
    }

    private AssemblyVersionInfo getAssemblyVersionInfo(Assembly asm)
    {
      AssemblyVersionInfo info;

      info.VersionString = ((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(asm, typeof(AssemblyFileVersionAttribute))).Version;

      string[] ver = info.VersionString.Split(new char[] {'.', ' '});

      info.Major = Int32.Parse(ver[0], CultureInfo.InvariantCulture);
      info.Minor = Int32.Parse(ver[1], CultureInfo.InvariantCulture);
      info.Build = Int32.Parse(ver[3], CultureInfo.InvariantCulture);

      int DateVer = Int32.Parse(ver[2], CultureInfo.InvariantCulture);

      info.Year  = DateVer / 10;
      info.Month = DateVer % 10;

      return info;
    }
        }
}
--
.    生命的意义在于   /\   ____\ /\_ \   /\_\                                .  
.        希望         \ \  \___/_\/\ \   \/_/__     __    _ _★              .  
.        工作          \ \   ____\\ \ \    /\  \  /'__`\ /\`'_\              .  
.      爱你的人         \ \  \___/ \ \ \___\ \  \/\ __// \ \ \/              .  
.     和你爱的人         \ \___\    \ \_____\ \__\ \____\ \ \_\              .  
.        ……             \/___/     \/_____/\/__/\/____/  \/_/ @nsfocus.com.  


※ 修改:·flier 于 Nov  3 23:53:03 修改本文·[FROM:  211.167.254.72]
※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.167.254.72]
上一篇
返回上一页
回到目录
回到页首
下一篇



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms