Windows7 注册表byte[]密钥解密

来源:互联网 发布:pc蛋蛋算法 编辑:程序博客网 时间:2024/06/07 03:29

注册表位置:

\\HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion

值位置

DigitalProductId


从注册表中获取密钥的byte[]:

RegistryKey hklm = Registry.LocalMachine;hklm = hklm.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");byte[] digitalProductId = hklm.GetValue("DigitalProductId") as byte[];textBox1.Text = DecodeProductKey(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);}


0 0