1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| --------------------------------------------------------------------------------------------------------------------------------------
import binascii, re, struct, sys
idre = re.compile('^[0-9a-f]{8}$', re.IGNORECASE)
nums = [2, 3, 73, 1103, 2017, 560381651, 12868356821]
def pseudo_crc48(crc, data):
POLY = 0x42f0e1eba9ea3693
MSB = 0x800000000000
TRIM = 0xffffffffffff
for x in data:
crc = crc ^ (x << 40)
for k in range(0, 8):
if crc & MSB:
crc = (crc << 1) ^ POLY
else:
crc = crc << 1
crc = crc & TRIM
return crc
def calc_key(id, sector):
if sector == 0:
return format(magic_nums[2] * magic_nums[4] * magic_nums[5], '012x')
if idre.match(id) is None:
raise ValueError('invalid ID (four hex bytes)')
if sector < 0 or sector > 15:
raise ValueError('invalid sector (0-15)')
PRE = magic_nums[0] * magic_nums[0] * magic_nums[1] * magic_nums[3] * magic_nums[6]
ints = [ord(a) for a in id.decode('hex')] + [sector]
key = pseudo_crc48(PRE, ints)
return binascii.hexlify(struct.pack('<Q', key))[0:12]
if __name__ == '__main__':
if len(sys.argv) > 1:
keysa = []
for sector in range(0, 16):
keysa.append(calc_key(sys.argv[1], sector))
if len(sys.argv) > 2 and sys.argv[2] == '-bin':
print ('0'*20+'\n'+('0'*32+'\n')*3).join(keysa).join([(sys.argv[1]+'0'*24+'\n')+(('0'*32+'\n')*2), '0'*20])
else:
print '\n'.join(keysa) |
Partager