Ваш ключ не закодирован в известном стандарте.Вам нужно извлечь модуль и экспоненту, а затем построить из них открытый ключ.
Модуль определяет размер ключа RSA и, следовательно, составляет 512 бит или 64 байта в качестве беззнакового старшего байтазначение.Публичный показатель может иметь любой размер, но обычно он небольшой.Наиболее используемое значение показателя степени - 010001 в шестнадцатеричных числах, которое является пятым простым числом Ферма (также называемое F4, индекс на основе нуля).Однако лучше просто получить первые 64 байта и предположить, что остальные коды являются открытыми показателями.
Таким образом, вы можете использовать RSAPublicNumbers
для создания значений из модуля n
и показателя e
.Хитрость заключается в том, чтобы убедиться, что вы создаете модуль как положительное значение вместо отрицательного значения.
Предположим, что data
- это двоичные данные, считанные из файла.Затем вы можете получить открытый ключ следующим образом.
Возможно, вы захотите использовать 'little'
вместо 'big'
, если следующее не работает (big endian является значением по умолчанию RSA, но вы никогда не знаете,).Тем не менее, в вашем случае значение порядка байтов делится на, например, 11, так что это маловероятное значение модуля (простые значения должны быть близки к половине размера ключа в битах, чтобы быть защищенными).
modsize = 512 // 8
modBytes = data[slice(0, modsize)]
mod = int.from_bytes(modBytes, byteorder='big')
expBytes = data[slice(modsize, None)]
exp = int.from_bytes(expBytes, byteorder='big')
pubkey = RSAPublicNumbers(exp, mod).public_key(default_backend())
Обратите внимание, что from_bytes
был добавлен только в Python 3.2.RSAPublicNumbers
немного странно в том смысле, что он принимает параметр степени перед модулем.Любой другой API, который я видел, принимает модуль перед показателем степени.