Click here to Skip to main content
Click here to Skip to main content

Microsoft Product Key Finder

By , 31 Jan 2008
Rate this:
Please Sign up or sign in to vote.

Introduction

The Raw Product Key is buried inside the Product Key that is printed on the sticker distributed with each Windows XP CD. It consists of five alphanumeric strings separated by '-' characters, where each string is composed of five characters, as in:

FFFFF-GGGGG-HHHHH-JJJJJ-KKKKK

Each character is one of the following 24 letters and digits:

B C D F G H J K M P Q R T V W X Y 2 3 4 6 7 8 9

Very similar to the decimal encoding of the Installation ID, the 25 characters of the Product Key form a base-24 encoding of the binary representation of the Product Key. Decoding the Product Key yields a multi-precision integer of roughly 115 bits, which is stored - again in Little Endian byte order - in an array of 15 bytes. Decoding the above Product Key results in the following byte sequence:

0x6F 0xFA 0x95 0x45 0xFC 0x75 0xB5 0x52
0xBB 0xEF 0xB1 0x17 0xDA 0xCD 0x00

Of these 15 bytes, the least significant four bytes contain the Raw Product Key in Little Endian byte order. The least significant bit is removed by shifting this 32-bit value (0x4595FA6F - remember the Little Endian byte order) to the left by one bit position, resulting in a Raw Product Key of 0x22CAFD37, or 583728439 in decimal notation.

Using the code

Using this code, you can find the product key of your Microsoft products.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
namespace MSKeyFinder
{
    public class KeyDecoder
    {
        public enum Key { XP, Office10, Office11 };
        public static byte[] GetRegistryDigitalProductId(Key key)
        {
            byte[] digitalProductId = null;
            RegistryKey registry = null;
            switch (key)
            {
                // Open the XP subkey readonly.
                case Key.XP:
                    registry =
                      Registry.LocalMachine.
                        OpenSubKey(
                          @"SOFTWARE\Microsoft\Windows NT\CurrentVersion",
                            false);
                    break;
                // Open the Office 10 subkey readonly.
                case Key.Office10:
                    registry =
                      Registry.LocalMachine.
                        OpenSubKey(
                          @"SOFTWARE\Microsoft\Office\10.0\Registration\" + 
                          @"{90280409-6000-11D3-8CFE-0050048383C9}",
                          false);
                    // TODO: Open the registry key.
                    break;
                // Open the Office 11 subkey readonly.
                case Key.Office11:
                    // TODO: Open the registry key.
                    break;
            }
            if (registry != null)
            {
                // TODO: For other products, key name maybe different.
                digitalProductId = registry.GetValue("DigitalProductId")
                  as byte[];
                registry.Close();
            }
            return digitalProductId;
        }
        public static string DecodeProductKey(byte[] digitalProductId)
        {
            // Offset of first byte of encoded product key in 
            //  'DigitalProductIdxxx" REG_BINARY value. Offset = 34H.
            const int keyStartIndex = 52;
            // Offset of last byte of encoded product key in 
            //  'DigitalProductIdxxx" REG_BINARY value. Offset = 43H.
            const int keyEndIndex = keyStartIndex + 15;
            // Possible alpha-numeric characters in product key.
            char[] digits = new char[]
      {
        'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R', 
        'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9',
      };
            // Length of decoded product key
            const int decodeLength = 29;
            // Length of decoded product key in byte-form.
            // Each byte represents 2 chars.
            const int decodeStringLength = 15;
            // Array of containing the decoded product key.
            char[] decodedChars = new char[decodeLength];
            // Extract byte 52 to 67 inclusive.
            ArrayList hexPid = new ArrayList();
            for (int i = keyStartIndex; i <= keyEndIndex; i++)
            {
                hexPid.Add(digitalProductId[i]);
            }
            for (int i = decodeLength - 1; i >= 0; i--)
            {
                // Every sixth char is a separator.
                if ((i + 1) % 6 == 0)
                {
                    decodedChars[i] = '-';
                }
                else
                {
                    // Do the actual decoding.
                    int digitMapIndex = 0;
                    for (int j = decodeStringLength - 1; j >= 0; j--)
                    {
                        int byteValue = (digitMapIndex << 8) | (byte)hexPid[j];
                        hexPid[j] = (byte)(byteValue / 24);
                        digitMapIndex = byteValue % 24;
                        decodedChars[i] = digits[digitMapIndex];
                    }
                }
            }
            return new string(decodedChars);
        }
    }
}

Once you realize how the product keys are encoded, a search through the Registry for the values starting with DigitalProductId indicates that many more product keys may be encoded this way.

Further information

To know more about Microsoft product keys, visit:

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

No Biography provided

Comments and Discussions

 
QuestionGet Office 14 Serial Key PinmemberMember 1061512721-Feb-14 4:39 
GeneralWindows 8 and Windows 2012 product key PinmemberGeorgieWendy2-Nov-13 17:27 
QuestionWindows 8 Pinmemberjimiekroth6-Jun-13 16:26 
QuestionThis is not working in my winodows 7 Pinmember@BangIndia22-May-13 22:27 
QuestionAnyone knows how to decode office 2013? Pinmembermkdsoft20-Feb-13 5:23 
AnswerRe: Anyone knows how to decode office 2013? PinmemberMasterOfCoders19-Mar-13 11:27 
SuggestionLittle Tip PinmemberTomasz Karlinski9-Jul-11 3:40 
GeneralOffice 14 And Win7 x64 PinmemberJonFrost16-May-11 23:19 
GeneralRe: Office 14 And Win7 x64 Pinmembersigma_ivan18-Feb-14 20:34 
GeneralMy vote of 1 PinmemberPeter Ritchie23-Apr-11 5:01 
GeneralRe: My vote of 1 Pinmemberreeselmiller28-Jun-11 9:31 
GeneralRe: My vote of 1 PinmemberMember 950092130-Oct-12 1:21 
GeneralRe: My vote of 1 Pinmemberreeselmiller230-Oct-12 9:25 
GeneralRecover product key from crashed computer PinmemberSteven Noto7-Jun-10 15:44 
GeneralMy vote of 1 PinmemberDeanno19-Jan-10 6:08 
GeneralProduct Key Encryption Pinmembernareshpatel21-Nov-09 18:22 
General[My vote of 1] This is a copy... Pinmembersaberint16-Jul-09 16:50 
GeneralRe: [My vote of 1] This is a copy... PinmemberMember 950092130-Oct-12 1:38 
GeneralOn Vista PinmemberSanj Gunetileke13-Apr-09 10:25 
GeneralNot Working !!! Pinmemberkwankre2-Jan-09 23:46 
GeneralRe: Not Working !!! PinmemberDeanno19-Jan-10 6:06 
GeneralEncoding Product Key PinmemberMember 59390314-Mar-08 7:22 
GeneralRe: Encoding Product Key PinmemberNorm .net7-Dec-08 22:15 
GeneralRe: Encoding Product Key PinmemberAdonai22-Feb-09 23:51 
GeneralRe: Encoding Product Key PinmemberNorm .net23-Feb-09 0:23 
GeneralRe: Encoding Product Key PinmemberAdonai23-Feb-09 2:06 
I'm sorry. I had to adjust the hardcoded registry key location.
It works fine now!
GeneralRe: Encoding Product Key Pinmembermoody hesham12-Oct-12 18:56 
GeneralRe: Encoding Product Key Pinmembermoody hesham12-Oct-12 18:56 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web03 | 2.8.140421.2 | Last Updated 31 Jan 2008
Article Copyright 2008 by Member 4079427
Everything else Copyright © CodeProject, 1999-2014
Terms of Use
Layout: fixed | fluid