Да. Используйте int () с основанием 16.
>>> int('ffffffff',16)
4294967295L
так:
subkey = int(hexkey[pos:pos+8], 16)
должен делать то же самое, не нуждаясь в eval.
[Редактировать] На самом деле, вообще нет причин, по которым вам вообще нужно преобразовывать в строковое представление, учитывая целое число - вы можете просто извлечь каждое 32-битное значение, используя AND с помощью 0xffffffff
и сдвиг ключа вправо на 32 бита в цикле. например:
subkeys = []
while key:
subkeys.append(key & 0xffffffff)
key >>= 32
if not subkeys: subkeys = [0] # Handle 0 case
subkeys.reverse() # Use same order as before (BUT SEE BELOW)
Однако этот процесс инициализации кажется немного странным - он использует шестнадцатеричные цифры, начинающиеся слева, без дополнения нулями для округления до кратных 8 шестнадцатеричным цифрам (поэтому число 0x123456789
будет разбито на 0x12345678
и 0x9
, а не более привычные 0x00000001
и 0x23456789
. Он также повторяет эти числа вместо того, чтобы рассматривать его как одно большое число. Вам следует убедиться, что этот код действительно выполняет правильный алгоритм.