それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Digital Product IDのデコード(python版)

レジストリのDigital Product ID の書式について。

WindowsにあるDigital Product IDをデコードした
Base24という符号形式らしい。

#!/usr/bin/env python
# --*-- coding: utf8--
## (Python2.4用)
#def any(iterable):
#    for element in iterable:
#        if element:
#            return True
#    return False

def base_convert(nl, ibase, obase):
    o = []
    while any(nl):
        c = 0
        for i in xrange(len(nl)):
            c = c * ibase + nl[i]
            nl[i],c = divmod(c,obase)
        o.append(c)
    o.reverse()
    return o

## 1557(13) == 3114(10)
print base_convert([1,5,5,7], 13, 10)

## 65535(10) == FFFF(16)
print base_convert([6,5,5,3,5], 10, 16)

pkeystr = "\xA8\x61\xD6\xF5\xC4\xD9\x5E\x7C\x0F\x78\x8D\xBD\xFB\x02\x00"
base24digit = "BCDFGHJKMPQRTVWXY2346789"

pkeynum = base_convert([ord(c) for c in reversed(pkeystr)], 256, 24)

## 桁数が足りない場合0を左に詰める
if len(pkeynum) < 25:
    pkeynum = [0]*(25-len(pkeynum)) + pkeynum

## 5桁ごとにハイフンを入れて表示
pkey = [base24digit[x] for x in pkeynum]
for i in (20,15,10,5):
    pkey.insert(i,"-")
print "".join(pkey)