You are on page 1of 5

License Key Generation - CodeProject

3 Member 3810050 2.5K Sign out

10,451,378 members (58,758 online)

home

articles

quick answers

discussions

features

community

help
Next

Articles Development Lifecycle Installation General

Article Browse Code Bugs / Suggestions Stats Revisions Alternatives (1) Comments & Discussions (48)

License Key Generation


By Donsw, 17 Jul 2005
4.60 (56 votes)
1 0

About Article
Rate: An article on license key generation. Type Article

Download demo project - 43.8 Kb Download source - 269 Kb

Licence First Posted Views Downloads 17 Jul 2005 353,082 29,081

Bookmarked 402 times Add your own alternative version .NET1.1 WinXP Win2003 VS.NET2003 C# Dev , +

Introduction
This article is about a license key generation program. As you know when you get a software package it usually requires a license key. The keys that are generated show various pieces of information, such as product, customer and version. With this program and library you can create the key and later read it in to validate that the correct key was used. This is used not only for selling commercial products but also in deploying enterprise applications. With a license key you can turn features on and off for each customer, have product feature expire at the end of a demo period, or any other type of enabling or disabling you desire. Since I wanted to put this code in CodeProject I adhered to using NUnit as my unit testing tool, NDoc as my documentation tool, and FxCop as my code analyzer. In this project, I created an interactive test tool to test the various features of the library.

Background
There are various ways to create keys; this article shows one such way. Another site that does License keys is SP extreme or Open License.

Using the code


http://www.codeproject.com/Articles/11012/License-Key-Generation[10/03/2014 18:18:42]

License Key Generation - CodeProject

The license keys are created with either a base 10 or base 16 integer data set. Most keys are base 16 for all of the numbers. The license key template is a string of characters that represent what actions will be taken when the key is created and decoded. Two types of templates are Bytes and Bits. Bytes are used when the key will be a simple key that does not require a lot of fields and data encoding. Bits are used when there will be more fields and the encoding will be harder to decipher. This version requires that all fields be on the byte boundary so it is a little easier to decipher the end result. The next version will not be aligned on a byte boundary so it will be harder to decipher. The key template has two characters that are defined by default. The x character states just a filler or random number. The c character defines a checksum character. These two characters are the only two that are reserved. A sample of the template and the resulting license key for Byte values and Decimal numbers are:
Collapse | Copy Code

Top News
News on the future of C# as a language
Get the Insider News free each morning.

Related Videos

xxxxxxxx-xx-xxxxxxxx-xx 69658998-12-12031517-23

A sample of the template and the resulting license key for Bit values and Hex numbers are:
Collapse | Copy Code

xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx BC017-06777-14871-160C4

With this library you can define the tokens that you want to replace real values with, such as product numbers, version numbers, serial numbers, or user counts.
Collapse | Copy Code

GenerateKey gkey; gkey = new GenerateKey(); gkey.LicenseTemplate = "xxxxxxxx-xxxx-xxxxxxxx-xxxx"; gkey.MaxTokens = 0; gkey.UseBase10 = true; gkey.UseBytes = true; gkey.CreateKey(); finalkey = gkey.GetLicenseKey();

Related Articles
RSA License Protection Software Copy Protection for .Net Applications - a Tutorial Using VB to Create & Check License Keys License Key Generation How To: Component Licensing in .NET Implementation of the Licensing System for a Software Product Using XML Digital Signatures for Application Licensing Creating Secure Trial Versions for .NET Applications - A Tutorial Neat License Generating Unique Key (Finger Print) for a Computer for Licensing Purposes A Secure Software Distributon SDK Using RSA Public Key Encryption in a Shared Web Hosting Environment Selling software using PayPal IPN as an eCommerce platform IPDefend Toolkit plugin for Code::Blocks IDE KeePass Password Safe Copy Protection for Windows Applications (Part 3) Generate code from database Licensing .NET components with a PKI Token (Gemalto .NET Card) demystified Copy Protection for Windows Applications (Part 2) Copy Protection for Windows Applications (Part 4)

The above example shows how to create a license key that has no tokens, uses base 10 numbers, and uses bytes for the template definition. Since no tokens are used, it really just creates a random number.
Collapse | Copy Code

GenerateKey gkey; gkey = new GenerateKey(); gkey.LicenseTemplate = "vvvvppppxxxxxxxxxxxx" + "-xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx" + "-xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx"; gkey.MaxTokens = 2; gkey.AddToken(0, "v", LicenseKey.GenerateKey.TokenTypes.NUMBER, "1"); gkey.AddToken(1, "p", LicenseKey.GenerateKey.TokenTypes.NUMBER, "2"); gkey.UseBase10 = false; gkey.UseBytes = false; gkey.CreateKey(); finalkey = gkey.GetLicenseKey();

This example shows how to create a license key that has two tokens. The first token sets the version to use a token of v with a value of 1. The second token sets the product to use a token of p with a value of 2. It also uses hex numbers and bits for the template definition. The various token types are NUMBER , CHARACTER , and DATE. In NUnit, the NUMBER and CHARACTER types are used extensively. I have not finished DATE as of this article but will do so later. At this time I am not sure if you need it since you have NUMBER available to use. The original reason I thought DATE might be of value is it might pack better than just using numbers. Some of the additional classes that I had to write to support the license key generation are a random number generator, a data type parser, a number display class, and a checksum class. The random number class uses the C# Random class but adds some additional methods to support the requirements. The methods are:

GetRandomNumber
Get a random number.

SetMaxLength
Sets the max length of the number. The checksum number class uses checksum routines that are pretty basic. Additional advanced algorithms can be added simply by adding the routine and an enumerated type. The methods are:

http://www.codeproject.com/Articles/11012/License-Key-Generation[10/03/2014 18:18:42]

License Key Generation - CodeProject

ChecksumAlgorithm
Get/set the property to use the different checksum algorithms.

Related Research

ChecksumNumber
Gets the checksum number

CalculateChecksum
Calculate the checksum based on the selected algorithm. Since so many variations of a license key can be done I did all of the unit tests using NUnit. Another advantage of NUnit was that if I fixed something in one area I could also make sure that I did not break something or another. Since the keys are using random numbers, I iterated thirty times in many of the tests to make sure the numbers matched. As part of the tests, I also decoded the same key to make sure that whatever I encoded I also decoded the same value. When you open the solution, you will notice there are three projects. One is the library so that when it is built anyone can use it. The second is an interactive test program so that you can test individual license keys and tokens. The third is the NUnit project so that you can add, run and debug the unit tests.
Fine-Tuning the Engines of SMB Growth: 4 strategies for growing your business

Points of Interest
Doing bit shifts in C# is somewhat different than C++ in that they are not allowed on chars only on integers. The time saving that I made by doing the entire unit test in NUnit was well worth the effort, I never would have had this much code coverage without using it. The Help system is written using NDoc so that is it in a standard format. Not to mention it is easier to search and use. For the library part, I ran FxCop routinely to make sure many of the best practices are adhered to.

Protecting Your Business Data: Five Dos and Donts

History
If everyone is interested I can put the code at SourceForge as well. This way others can add, update or use the source code. I plan on adding the ability to set tokens on bit boundaries and not just on byte boundaries.

License
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below. A list of licenses authors might use can be found here

About the Author

Donsw

Web Developer United States I am a Director of Engineering, have an MBA and work in C# forms, Asp.Net and vb.net. I have been writing Windows program since windows 3.0. I am currently working in the Healthcare industry. I enjoy reading, music (most types), cars, and cigars. I am involved in opensource projects at codeplex. My linkedin link is http://www.linkedin.com/in/donsweitzer

http://www.codeproject.com/Articles/11012/License-Key-Generation[10/03/2014 18:18:42]

License Key Generation - CodeProject

Follow on Article Top

Twitter

Google

Comments and Discussions

Add a Comment or Question


Profile popupsSpacing

Relaxed Relaxed

Search this forum Noise


Medium Medium

Go Per page
25 25

Layout

Normal Normal

Update

First Prev Next

improvment in current scenario Extension for Decoding on seperate Machine / Little bug in DisassembleKeyBits(string token) This is really cool My vote of 5 Fetch missing nunit.framwork; License Key Generation Re: Fetch missing nunit.framwork; License Key Generation My vote of 5 My vote of 5 My vote of 5 nunit.framework Date type Validating Encoded value finalKeys are not unique Re: finalKeys are not unique Encoding random text decode a given key Many thanks How to validate a key Decode an existing key Re: Decode an existing key license in code ? Re: license in code ? Re: license in code ? Re: license in code ? Re: license in code ?
Last Visit: 10-Mar-14 3:26 Last Update: 10-Mar-14 1:15 General News Suggestion Question Bug Answer

bhargavpp Michael Bauschert

16-Oct-12 22:13 24-Sep-12 21:52

Immorta1 salmanabbasi AarKayCee electrawinds sateesh munagala polczym Pravin Patil, Mumbai ewansw girigadevi kathyani kwilder Donsw cbuffett A55imilate DavidAllen barbutz delfo Michael Bauschert webber123456 Donsw aotter Donsw orthimnas2 Refresh Joke Rant Admin

12-Jul-12 7:11 29-Jun-12 0:40 16-Apr-11 2:26 31-Oct-11 20:36 30-Mar-11 6:09 26-Mar-11 1:17 30-Jan-11 21:18 24-Aug-10 21:37 13-Apr-10 19:36 6-Dec-09 17:26 9-Aug-09 6:00 9-Aug-09 23:07 20-Feb-07 12:14 9-Oct-06 0:34 16-Mar-06 22:19 7-Mar-06 5:00 4-Feb-06 3:11 24-Sep-12 21:56 29-Aug-05 16:28 3-Sep-05 5:08 23-Nov-05 4:46 25-Nov-05 4:58 21-Jul-10 7:24 1 2 Next

http://www.codeproject.com/Articles/11012/License-Key-Generation[10/03/2014 18:18:42]

License Key Generation - CodeProject Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.
Permalink | Advertise | Privacy | Mobile Web04 | 2.8.140309.2 | Last Updated 18 Jul 2005 Layout: fixed | fluid Article Copyright 2005 by Donsw Everything else Copyright CodeProject, 1999-2014 Terms of Use

http://www.codeproject.com/Articles/11012/License-Key-Generation[10/03/2014 18:18:42]