Рейтинг:3

RSA: Помимо алгоритма, как мы превращаем строку в int и наоборот?

флаг cn

Допустим, я хочу зашифровать файл обычный.txt. Самый первый шаг — преобразовать содержимое этого файла (допустим, он содержит только строку «Hello») в тип int. Я вижу такие коды Python:

из Crypto.Util.number импортировать bytes_to_long
с open('plain.txt', 'rb') как f:
    флаг = f.read()

m = bytes_to_long (флаг)

Однако я не совсем понимаю, что происходит. Кроме того, когда зашифрованный текст был декодирован обратно в открытый текст, но все еще в числовой форме, я не вижу long_to_bytes или что-нибудь, чтобы преобразовать число в строку. Я понимаю

импортировать бинарные
binascii.unhexlify('{:x}'.format(m))

Который выглядит совершенно иначе, чем другой код, но он все еще работает.Может ли кто-нибудь объяснить мне эти процессы, чтобы я понимал входные и выходные данные алгоритма кодирования, а не только сам алгоритм.

kelalaka avatar
флаг in
Добро пожаловать в Cryptography.SE. Это проблема кодирования декодирования и здесь не по теме. Кроме того, вы делаете это неправильно. Следует декодировать как полную противоположность применяемому кодированию,
fgrieu avatar
флаг ng
Одним из распространенных преобразований байтов в целое является [OS2IP в PKCS#1](https://pkcs1.grieu.fr#page=9).Немного упрощая описание, байты рассматриваются как цифры по основанию 256 (то есть как целые числа от 0 до 255, подобно обычным цифрам по основанию 10 от 0 до 9), а затем преобразуются $n$ байтов $X_1,X_2…X_n $ (с первого/слева до последнего/справа) в целое число $\displaystyle\sum_{1â¤iâ¤n} 256^{n-i}X_i$. Обратите внимание, что редко используется для _text_ вне контекста CTF. Вместо этого используется [гибридное шифрование] (https://en.wikipedia.org/wiki/Hybrid_cryptosystem).
флаг cn
Улучшением вопроса было бы удаление слова RSA из вопроса. Фактический контент не имеет к этому никакого отношения. И на практике RSA почти никогда не используется напрямую для шифрования данных, а используется гибридное шифрование.
Maarten Bodewes avatar
флаг in
Я попытался ответить, как такие вещи обычно работают. Если вы говорите об учебнике RSA, то обычно один или несколько байтов превращаются в целое число между нулем и модулем, а затем применяется модульное возведение в степень. Декодирование означает разбиение зашифрованного текста на блоки того же размера, что и модуль, дешифрование, а затем обратное декодирование. В вопросе слишком мало деталей, чтобы указать больше, чем это.
Рейтинг:7
флаг in

По сути, для этого есть два шага:

  1. кодировать текст в байты - обычно для этого требуется кодировка символов, такая как UTF-8 или латинская кодировка;
  2. кодировать байты в целое число - это часть операция шифрования в RSA, как указано в PKCS#1, и выполняется с использованием функции OS2IP.

В вашем случае текст, очевидно, уже закодирован как байты; файлы в конце концов состоят из байтов, и вы открываете файл как двоичный файл (b в флаге rb).

OS2IP означает строку октетов для целочисленного примитива. Строка октетов — это не что иное, как массив байтов. Если байты уже в правильной форме, то это просто вопрос интерпретация байты как число, так как компьютер все равно всегда обрабатывает все как двоичное.

Однако в RSA на основе PKCS#1 OS2IP напрямую не используется: сначала применяется заполнение, связанное с безопасностью. Это может быть либо заполнение, определенное PKCS#1 v1.5, либо заполнение OAEP. Добавление заполнения означает, что перед применением сообщения добавляется незначительная часть служебной информации; объем открытого текста намного меньше, чем модуль RSA.


Это одна из причин, по которой файлы обычно не шифруются напрямую с помощью RSA. Другая основная причина заключается в том, что шифрование RSA и особенно операции дешифрования очень неэффективны по сравнению, например, с Шифрование на основе AES. Вместо этого мы используем такой протокол, как PGP, который выполняет гибридное шифрование. RSA в безопасном режиме работы имеет определенные накладные расходы и максимум на операцию, поэтому обычно вместо этого симметричный ключ шифруется или выводится с использованием RSA; этот симметричный ключ затем используется для шифрования данных. Симметричные шифры, такие как AES, напрямую работают с двоичными данными, поэтому помимо обработки вектора инициализации и заполнения данные могут быть зашифрованы напрямую без преобразования.

флаг us
Предположительно, OS2IP предполагает ограничения длины для пошагового преобразования строк октетов, поэтому, исходя из потока байтов на шаге 2, OS2IP предшествует фрагментация на пакеты, где размер пакета зависит от длины ключа и режима заполнения.
Maarten Bodewes avatar
флаг in
Нет, OS2IP обычно не предшествует фрагментация пакетов; для RSA вы не используете режим CBC или даже режим ECB, вы просто шифруете сообщение одного размера. Я добавил некоторые детали к ответу.
флаг us
Понимаю. Вот почему некоторые библиотеки, например. JCE даже не отражает максимальный размер, который вы можете передать методу шифрования, потому что он вам не нужен.
Maarten Bodewes avatar
флаг in
Мех, JCA все равно не возвращает столько метаинформации. Я не уверен, почему это так, достаточно легко рассчитать накладные расходы по сравнению с модулем, например. всего 11 байт (для минимальной безопасности) для PKCSv1 1.5 и, ну, [он отличается для OAEP] (https://crypto.stackexchange.com/a/42100/1172).
флаг us
Упс, два моих комментария подверглись цензуре. Примите это как подтверждение. Да, самый простой способ найти максимальную полезную нагрузку — поместить сообщение длины модуля и проанализировать возникшее исключение, правильно в соответствии с PKCSv1/OS2IP.
флаг cn
Я бы не рекомендовал дополнение PKCS#1 v1.5 из-за различных атак Bleichenbacher (атака ROBOT — самая последняя из известных мне). Версия 1.5 была выпущена и устарела (по версии 2.0) в том же году, в 1998 году, из-за того, что в том же году это заполнение было нарушено. Даже если он все еще используется на практике, это заполнение обычно должно сопровождаться предупреждением типа «никогда не используйте это, а не для шифрования, обмена ключами или подписей».
флаг us
@tylo OS2IP не трогает отступы. Что касается Блейхенбахера, рассмотрим идею о том, что некоторое фиктивное заполнение константами в выводе было установлено намеренно.
флаг cn
@SamGinrich Я не имел в виду, что это так. В ответе просто говорится, что в соответствии со спецификацией PKCS # 1 используется заполнение V1.5. И, на мой взгляд, это всегда должно сопровождаться предупреждением типа «не используйте это». Даже если какой-то конкретный вариант использования, заполнение версии 1.5 можно было бы использовать - это должно быть доказано, требует глубоких знаний по теме и может привести к человеческой ошибке. Совет с минимальным общим риском - вообще не использовать / не разрешать это дополнение.
флаг us
@tylo Согласен с твоим советом. Существует сообщество, занимающееся безопасностью, где этот аспект должен быть приоритетом 1. Здесь, в Криптографии, я ожидаю обсуждения неполной концепции алгоритма и без хорошего мышления. Хотя, я сознался в деталях некоторых вариантов алгоритма, я бы не ожидал, что вы примете от меня какой-либо совет, не предоставив прослеживаемого объяснения или хотя бы ссылки на таковой.
Рейтинг:-2
Maarten Bodewes avatar
флаг in
Вы не можете применять режимы блочного шифрования, отличные от ECB, к RSA *с безопасным дополнением* - по крайней мере, без изменений. И в противном случае это всегда приводило бы к накладным расходам. Очевидно, что он также намного менее эффективен, особенно во время расшифровки. Недостаток эффективности и расширение сообщения — объективные недостатки, а не политические, если вы спросите меня.
флаг us
Я думаю, что большинство пользователей здесь, чтобы помогать людям, и я один из них.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.