Получение целочисленного значения из байтовой строки в Python3 - PullRequest
1 голос
/ 01 февраля 2020

Я использую программу шифрования файлов RSA и AES. Пока что у меня есть RSA и AES. Однако я пойму sh, что если моя реализация AES использует 16-байтовый ключ (полученный из os.urandom (16)), как я могу получить целочисленное значение для шифрования с помощью RSA?

По сути, если у меня есть строка байтов, такая как b',\x84\x9f\xfc\xdd\xa8A\xa7\xcb\x07v\xc9`\xefu\x81'

Как я могу получить целое число из этой строки байтов (ключ AES), которая впоследствии может быть использована для шифрования с использованием (RSA) ?

Поток шифрования

Шифрование файла (ключ AES) -> Шифрование ключа AES (с использованием RSA)

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

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.

И вам придется выполнить те же две операции для расшифровки ...

0 голосов
/ 01 февраля 2020

Чтобы буквально интерпретировать байтовую строку как целое число (что вы должны делать; python целые числа могут быть сколь угодно большими), вы можете просто суммировать значения, сдвигая соответствующее число битов:

bytestr = b',\x84\x9f\xfc\xdd\xa8A\xa7\xcb\x07v\xc9`\xefu\x81'
le_int = sum(v << (8 * i) for i, v in enumerate(bytestr))
# = sum([44, 33792, 10420224, 4227858432, 949187772416, 184717953466368, 18295873486192640, 12033618204333965312, 3744689046963038978048, 33056565380087516495872, 142653246714526242615328768, 62206486974090358813680992256, 7605903601369376408980219232256, 4847495895272749231323393057357824, 607498732448574832538068070518751232, 171470411456254147604591110776164450304])
# = 172082765352850773589848323076011295788

Это будет интерпретация с прямым порядком байтов; интерпретация с прямым порядком байтов просто начнет читать с другой стороны, что вы можете сделать с помощью reversed():

be_int = sum(v << (8 * i) for i, v in enumerate(reversed(bytestr)))
# = sum([129, 29952, 15663104, 1610612736, 863288426496, 129742372077568, 1970324836974592, 14627691589699371008, 3080606260309495119872, 306953821386526938890240, 203099537695257701350637568, 68396187170517260188176613376, 19965496953594613073573075484672, 3224903126980615597407612954476544, 685383185326597246966025515457052672, 58486031814536298407767510652335161344])
# = 59174659937086426622213974601606591873
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...