少しのコーディングをすることに恥ずかしくない人のために。
約10年前にアルゴリズムを見つけ、C#で実装しました(以下を参照)
Windowsで実行したい場合
私はそれをpowershellスクリプトに変換するために自由を取りました:
$dpid = Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name "DigitalProductId"
# Get the range we are interested in
$id = $dpid.DigitalProductId[52..(52+14)]
# Character table
$chars = "BCDFGHJKMPQRTVWXY2346789"
# Variable for the final product key
$pkey = ""
# Calculate the product key
for ($i=0; $i -le 24; $i++) {
$c = 0
for($j=14; $j -ge 0; $j--) {
$c = ($c -shl 8) -bxor $id[$j]
$id[$j] = [Math]::Floor($c / 24) -band 255
$c = $c % 24
}
$pkey = $chars[$c] + $pkey
}
# Insert some dashes
for($i = 4; $i -gt 0; $i--) {
$pkey = $pkey.Insert($i * 5, "-")
}
$pkey
これを実行すると、プロダクトキーが取得されます。(だから結局あなたのためのコーディングはありません)
元の投稿
これが、私が掘り下げてコメントした実際のC#コードです。
public static string ConvertDigitalProductID(string regPath, string searchKey = "DigitalProductID") {
// Open the sub key i.E.: "Software\Microsoft\Windows NT\CurrentVersion"
var regkey = Registry.LocalMachine.OpenSubKey(regPath, false);
// Retreive the value of "DigitalProductId"
var dpid = (byte[])regkey.GetValue(searchKey);
// Prepare an array for the relevant parts
var idpart = new byte[15];
// Copy the relevant parts of the array
Array.Copy(dpid, 52, idpart, 0, 15);
// Prepare the chars that will make up the key
var charStore = "BCDFGHJKMPQRTVWXY2346789";
// Prepare a string for the result
string productkey = "";
// We need 24 iterations (one for each character)
for(int i = 0; i < 25; i++) {
int c = 0;
// Go through each of the 15 bytes of our dpid
for(int j = 14; j >= 0; j--) {
// Shift the current byte to the left and xor in the next byte
c = (c << 8) ^ idpart[j];
// Leave the result of the division in the current position
idpart[j] = (byte)(c / 24);
// Take the rest of the division forward to the next round
c %= 24;
}
// After each round, add a character from the charStore to our key
productkey = charStore[c] + productkey;
}
// Insert the dashes
for(int i = 4; i > 0; i--) {
productkey = productkey.Insert(i * 5, "-");
}
return productkey;
}
Software\Microsoft\Windows NT\CurrentVersion
キーとして渡す必要があります。DigitalProductId
当時、MS Office Productsは同じアルゴリズムを使用していたため、関連するレジストリキーを関数に提供することで、それらのプロダクトキーも計算できました。
もちろん、入力としてバイト配列を取るように関数をリファクタリングできます。
今日は。Windows 10マシンでテストしたばかりですが、まだ動作します。