TL; DR используйте from_bytes
и to_bytes
для реализации OS2IP и I2OSP соответственно.
Для безопасного шифрования вы напрямую не превращаете ключ AES в число. Это связано с тем, что необработанный RSA по своей природе небезопасен во многих отношениях (список не является полным на момент написания).
Сначала вам нужно случайным образом дополнить свои байты ключа, чтобы получить байтовый массив, который будет представлять число, близкое к модулю. Затем вы можете выполнить преобразование байтового массива в число, и только тогда вы должны выполнить возведение в модуляр. Возведение в модуляр также даст число, и вам нужно превратить это число в байтовый массив статического размера с тем же размером, что и модуль (в байтах).
Все это стандартизировано в PKCS # 1 RSA стандарт. В версии 2.2 указаны две схемы, известные как PKCS # 1 v1.5 padding и OAEP padding . Первый довольно прост в реализации, но он более уязвим для атак oracle. ОАЭП также уязвима, но в меньшей степени. Однако вам нужно будет следовать рекомендациям по реализации к деталям, особенно во время распаковки.
Чтобы вернуться к вашему вопросу, преобразования чисел называются примитивами октетной строки в целочисленные ( OS2IP ) и целочисленный октет строкового примитива ( I2OSP ). Это, однако, не математические операции, которые вам нужно выполнить: они просто описывают, как представить, как кодировать число как статически заданное число с прямым порядком байтов, целое число без знака.
Скажите, что keysize
это размер ключа (размер модуля) в битах, а em
это bytes
или bytearray
, представляющий дополненную клавишу, тогда вы просто выполните:
m = int.from_bytes(em, byteorder='big', signed=False)
для OS2IP, где m
будет вход для модульного возведения в степень и обратно, используя:
k = (keysize + 8 - 1) / 8
em = m.to_bytes(k, byteorder='big', signed=False)
для I2OSP.
И вам придется выполнить те же две операции для расшифровки ...