Какая схема шифрования соответствует требованиям десятичного открытого текста и зашифрованного текста и сохраняет длину?

Мне нужна схема шифрования, в которой открытый текст и зашифрованный текст полностью состоят из десятичных цифр.

Кроме того, открытый текст и зашифрованный текст должны быть одинаковой длины.

Также базовый алгоритм шифрования должен быть отраслевым стандартом. Я не против, если он симметричный (например, AES) или асимметричный (например, RSA), но это должен быть признанный алгоритм, для которого я могу получить библиотеку, одобренную FIPS-140. (В противном случае он не пройдет стадию проверки безопасности).

Использование AES OFB подходит для сохранения длины шестнадцатеричного ввода (т. е. когда каждый байт имеет 256 возможных значений: 0x00 --> 0xFF). Однако это не сработает для моих средств, поскольку открытый текст и зашифрованный текст должны быть полностью десятичными.

NB: «Полностью десятичное число» можно интерпретировать двумя способами, оба из которых приемлемы для моих требований:

  1. Входные и выходные байты — это символы «0» -> «9» (т. е. значения байтов: 0x30 -> 0x39)
  2. Входные и выходные байты имеют 100 (десятичных) значений: 0x00 --> 0x99 (т.е. BCD)

Еще немного информации: максимальная длина открытого текста и зашифрованного текста, вероятно, будет 10 десятичных цифр. (т.е. 10 байт при использовании «0» -> «9» или 5 байт при использовании BCD)

Рассмотрим следующий пример, чтобы понять, почему происходит сбой AES: Входная строка представляет собой 8-значное число. Максимальное 8-значное число: 99999999 В шестнадцатеричном формате: 0x5f5e0ff

Это можно рассматривать как 4 байта: ‹0x05>‹0xf5>‹0xe0>‹0xff>

Если я использую AES OFB, я получу 4-байтовый вывод.

Максимально возможный 4-байтовый вывод зашифрованного текста: ‹0xFF>‹0xFF>‹0xFF>‹0xFF>

Преобразование этого обратно в целое число дает: 4294967295, т.е. 10-значный номер.

==> Слишком длинные две цифры.

И последнее: нет ограничений на длину любых требуемых ключей / IV.


person user227479    schedule 08.12.2009    source источник
comment
Как насчет IV? Или вы используете ключ только для шифрования одного номера?   -  person erickson    schedule 09.12.2009
comment
На ум приходит шифр Цезаря, хотя он может быть не таким надежным, как хотелось бы.   -  person Rob Kennedy    schedule 09.12.2009
comment
Для сильваркинга: использование IV разрешено (и, скорее всего, рекомендуется, если используется симметричный алгоритм, такой как AES). Ключ будет использоваться для шифрования множества коротких номеров. Ключ / IV будет регулярно меняться   -  person user227479    schedule 09.12.2009
comment
Робу Кеннеди: шифра Цезаря на самом деле недостаточно для моих нужд. С помощью Caesar цифры шифруются одна за другой, а не все сообщение вместе, что значительно сокращает диапазон возможных шифротекстов. Идентичные цифры в зашифрованном тексте будут такими же и в открытом тексте.   -  person user227479    schedule 09.12.2009
comment
Я имею в виду, что шифрование одного и того же открытого текста с одним и тем же IV и ключом даст один и тот же зашифрованный текст, поэтому вы будете страдать от недостатков режима ECB, если они уместны в этом приложении. (Предположим, что вы не хотите включать IV в каждый зашифрованный текст.)   -  person erickson    schedule 09.12.2009
comment
К сильваркингу: меня не слишком беспокоит режим ECB. Я могу сделать так, чтобы IV или ключ (или оба) менялись при каждом использовании [возможно, будучи полученным из главного ключа, который меняется ежедневно]. Это должно защитить от атак по словарю, к которым уязвим ECB.   -  person user227479    schedule 09.12.2009
comment
Пытливые умы хотят знать: в чем причина этого чрезвычайно странного набора ограничений?   -  person Nick Johnson    schedule 09.12.2009
comment
Это для шифрования номеров кредитных карт. По правилам PCI первые 6 и последние 4 могут оставаться открытыми. Это оставляет средние цифры, длина которых варьируется от 6 до 9 цифр. Они должны быть защищены с помощью надежного шифрования. Разработка схемы с этими ограничениями означает, что сообщения кредитной карты могут оставаться открытыми при передаче, что означает, что сообщения могут взаимодействовать с другими системами, которые не поддерживают какой-либо уровень шифрования. Номер карты должен быть расшифрован только в последней возможной точке перед передачей эквайеру карты.   -  person user227479    schedule 10.12.2009
comment
Вот в чем проблема. Ваша система пытается защитить слишком маленькое пространство открытого текста. Если у меня есть ваша процедура шифрования и зашифрованный 16-значный номер карты, а первые шесть и последние четыре цифры в открытом тексте, я могу зашифровать все оставшиеся шестизначные значения от 000000 до 999999, и вывод одного из них будет соответствовать значению ваших данных, поэтому я могу определить необработанный номер карты. На настольном компьютере восстановление занимает всего несколько секунд.   -  person John Deters    schedule 26.12.2009
comment
Нет проблем — вам также понадобится ключ шифрования. Безопасность заключается в том, что ключ является секретом между обоими концами системы. Внешний наблюдатель, который видит только зашифрованный текст (зашифрованный номер карты), без ключа не может определить, какая из 1 миллиона возможностей является реальным номером карты.   -  person user227479    schedule 28.12.2009
comment
Просто для полноты эта тема известна как «Шифрование с сохранением формата». en.wikipedia.org/wiki/Format-preserving_encryption   -  person laher    schedule 28.03.2014


Ответы (9)


Используйте AES/OFB или любой другой потоковый шифр. Он сгенерирует ключевой поток псевдослучайных битов. Обычно вы выполняете XOR этих битов с открытым текстом. Вместо:

For every decimal digit in the plaintext
  Repeat
    Take 4 bits from the keystream
  Until the bits form a number less than 10
  Add this number to the plaintext digit, modulo 10

Чтобы расшифровать, сделайте то же самое, но вместо этого вычтите на последнем шаге.

Я считаю, что это должно быть так же безопасно, как обычное использование потокового шифра. Если последовательность чисел от 0 до 15 неотличима от случайной, то подпоследовательность только тех чисел, которые меньше 10, все равно должна быть случайной. Использование сложения/вычитания вместо XOR должно по-прежнему производить случайный вывод, если один из входных данных является случайным.

person Baffe Boyois    schedule 08.12.2009
comment
Можете ли вы объяснить, как это может работать? Вы используете AES для шифрования ввода, это дает шестнадцатеричный вывод. Затем вы получаете десятичную строку из этого шестнадцатеричного вывода. Насколько я могу судить, на этом этапе информация теряется, поэтому у вас нет возможности вернуться к исходному открытому тексту, имея только десятичный зашифрованный текст и ключ. - person user227479; 09.12.2009
comment
Вы предложили AES с OFB в вопросе. OFB преобразует блочный шифр (например, AES) в потоковый шифр. В потоковом шифре ключевой поток зависит только от ключа и IV, а не от открытого текста. Пока оба конца имеют один и тот же ключ и IV, они могут генерировать один и тот же ключевой поток. Таким образом, они также могут генерировать один и тот же модифицированный поток десятичных цифр. Ключевой поток не является зашифрованным вводом - он вообще не связан с вводом. - person Baffe Boyois; 09.12.2009
comment
Если я правильно вас понимаю, для этого требуется, чтобы перед каждым сообщением обменивались новым ключом и IV. Это окажется немного громоздким. - person user227479; 09.12.2009
comment
Не могли бы вы уточнить, что вы имеете в виду? Вам нужно, чтобы обе стороны имели одинаковый ключ и IV при любом использовании симметричного шифра. Я не думаю, что эта идея добавляет какие-то новые требования? - person Baffe Boyois; 09.12.2009
comment
Я надеялся обменивать ключ и IV между обеими сторонами один раз в день (максимум). Будет в районе 200-300 сообщений в день. Эти сообщения будут очень короткими, и будет обременительно добавлять слой обмена ключами поверх каждого очень короткого сообщения. - person user227479; 09.12.2009
comment
Ах, нет необходимости в новом ключе и IV для каждого сообщения! Вы можете продолжать использовать один и тот же до тех пор, пока он безопасен — я не уверен в деталях для AES, но он должен быть хорош как минимум для гигабайт потока ключей до необходимости перезапуска — не проблема для 200-300 сообщений. в день. - person Baffe Boyois; 09.12.2009
comment
Также обратите внимание, что если возможно использование одноразового блокнота, этот метод можно использовать и там — просто используйте случайный блокнот в качестве источника потока ключей вместо AES. - person Baffe Boyois; 09.12.2009
comment
Да, теперь я понимаю, о чем вы говорите. Я думаю, это все. Спасибо за решение. - person user227479; 09.12.2009
comment
Вам действительно нужен новый IV для каждого сообщения, иначе это небезопасно. Вы повторно используете один и тот же ключевой поток для каждого сообщения. Как говорит Брюс Шнайер, первое правило потокового шифра с обратной связью, любого из них, заключается в том, что вы никогда не должны использовать один и тот же ключ для шифрования двух разных сообщений. Повторяйте за мной: НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ОДИН КЛЮЧ ДЛЯ ШИФРОВАНИЯ ДВУХ РАЗНЫХ СООБЩЕНИЙ. - person erickson; 09.12.2009
comment
Извините - пришлось пометить как неотвеченное в свете вышеизложенного. @sylvarking: Спасибо, что указали на это. - person user227479; 09.12.2009
comment
Вам потребуется только новый IV для каждого сообщения, если вы перезапустите шифрование для каждого сообщения. Если вы продолжаете использовать больше байтов из одного и того же ключевого потока, один и тот же ключ не будет использоваться для нескольких сообщений до тех пор, пока не будет достигнут период генератора - как указано выше, по крайней мере после гигабайт. - person Baffe Boyois; 09.12.2009
comment
С этой оговоркой я согласен: пока вы можете содержать сообщения в порядке, это будет работать и быть безопасным. Это эквивалентно использованию режима CTR, как я предложил в своем ответе. - person erickson; 09.12.2009
comment
Истинный. Я подозреваю, что мой ответ нужно объединить хотя бы с одним другим, чтобы получить полную криптосистему - на самом деле он касается только уникального ограничения десятичного ввода/вывода одинаковой длины. - person Baffe Boyois; 09.12.2009
comment
@Baffe: я собираюсь предоставить вам решение (снова). На самом деле я могу реализовать любой вариант: держать поток постоянно активным с обеих сторон или использовать последовательность no как часть инициализации (режим CTR) - person user227479; 09.12.2009

Одним из потенциальных кандидатов является режим шифрования FFX, который недавно был отправлен в NIST.

person Accipitridae    schedule 08.12.2009
comment
Это выглядит великолепно - знаете ли вы какие-либо реализации? - person user227479; 09.12.2009
comment
Прошу прощения, но нет. Это предложение является новым и заменяет режим под названием FFSEM, который ранее был представлен одним из авторов. Два других автора представили доклад на конференции CRYPTO в этом году. Я не могу сказать, сколько времени пройдет, прежде чем некоторые эталонные реализации будут опубликованы. - person Accipitridae; 09.12.2009

Потоковым шифрам требуется одноразовый номер для обеспечения безопасности; одно и то же состояние ключевого потока никогда не должно повторно использоваться для разных сообщений. Этот одноразовый номер увеличивает эффективную длину зашифрованного текста.

Блочный шифр, используемый в потоковом режиме, имеет по существу ту же проблему: уникальный вектор инициализации должен быть включен в шифрованный текст.

Многие потоковые шифры также уязвимы для манипуляций с зашифрованным текстом, когда переключение бита в зашифрованном тексте незаметно переворачивает соответствующий бит в открытом тексте.

Если числа выбираются случайным образом, и каждое число шифруется только один раз, и числа короче размера блока, ECB обеспечивает хорошую безопасность. В этих условиях я бы рекомендовал AES в режиме ECB как решение, которое минимизирует длину зашифрованного текста, обеспечивая при этом надежную защиту конфиденциальности и целостности.

Если в контексте зашифрованного текста есть какая-то другая информация, которую можно использовать в качестве вектора инициализации (или одноразового номера), тогда это может сработать. Это может быть что-то явное, например идентификатор транзакции во время покупки, или что-то неявное, например порядковый номер сообщения (который можно использовать в качестве счетчика в режиме CTR). Я предполагаю, что VeriShield делает что-то подобное.

person erickson    schedule 08.12.2009
comment
Спасибо за вашу помощь в этом. - person user227479; 09.12.2009

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

Если это будет приемлемо, нам просто нужно выяснить, как декодер узнает, где в блоке случайности искать ключ для декодирования любого конкретного сообщения. Если вы можете отправить временную метку в виде открытого текста с зашифрованным текстом, то это легко: преобразуйте временную метку в число, скажем, количество секунд, прошедших с даты эпохи, по модулю этого числа на длину блока случайности, и вы получите смещение в пределах блокировать.

При достаточно большом блоке случайности это должно быть невозможно взломать. Вы можете сами зашифровать случайные биты с помощью надежного шифрования, чтобы пользователь должен был ввести длинный пароль, чтобы разблокировать декодер; таким образом, даже если программное обеспечение для расшифровки будет захвачено, взломать систему все равно будет непросто.

Если вы заинтересованы в этом и хотели бы, чтобы я расширился, дайте мне знать. Я не хочу тратить много времени на ответ, который совсем не соответствует вашим потребностям.

РЕДАКТИРОВАТЬ: Хорошо, с крошечным кусочком ободрения («вы можете что-то понять») я расширяю свой ответ.

Идея в том, что вы получаете блок случайности. Один из простых способов сделать это — просто извлечь данные с устройства Linux /dev/random. . Теперь я собираюсь предположить, что у нас есть какой-то способ найти индекс в этом блоке случайности для каждого сообщения.

Индексируйте блок случайности и извлеките десять байтов данных. Каждый байт представляет собой число от 0 до 255. Добавьте каждое из этих чисел к соответствующей цифре открытого текста по модулю 10, и вы получите цифры зашифрованного текста. Вы можете легко изменить это, если у вас есть блок случайных данных и индекс: вы получаете случайные биты и вычитаете их из цифр шифра по модулю 10.

Вы можете думать об этом как о расположении цифр от 0 до 9 в кольцо. Сложение ведется по кругу по часовой стрелке, а вычитание — против часовой стрелки. Вы можете добавить или вычесть любое число, и оно будет работать. (В моей первоначальной версии этого ответа предлагалось использовать только 3 бита на цифру. Недостаточно, как указано ниже @Baffe Boyois. Спасибо за это исправление.)

Если цифра обычного текста равна 6, а случайное число равно 117, то: 6 + 117 == 123, по модулю 10 == 3. 3 - 117 == -114, по модулю 10 == 6.

Как я уже сказал, проблема поиска индекса проста, если вы можете использовать внешнюю информацию открытого текста, такую ​​как метка времени. Даже если ваш оппонент знает, что вы используете метку времени для расшифровки сообщений, без блока случайности это не поможет.

Проблема поиска индекса также проста, если сообщение доставляется всегда; вы можете иметь согласованную систему создания ряда индексов и сказать: «Это четвертое сообщение, которое я получил, поэтому я использую четвертый индекс в серии». В качестве тривиального примера, если это четвертое полученное сообщение, вы можете согласиться использовать значение индекса 16 (4 для четвертого сообщения, умноженное на 4 байта на одноразовый блокнот). Но вы также можете использовать числа из утвержденного генератора псевдослучайных чисел, инициализированные согласованным постоянным значением в качестве начального числа, и тогда вы получите несколько непредсказуемую серию индексов в блоке случайности.

В зависимости от ваших потребностей у вас может быть действительно большой кусок случайных данных (сотни мегабайт или даже больше). Если вы используете 10 байтов в качестве одноразового блокнота и никогда не используете перекрывающиеся или повторно используемые блокноты, то 1 мегабайт случайных данных даст более 100 000 одноразовых блокнотов.

person steveha    schedule 08.12.2009
comment
Да, думаю, вы могли бы быть на что-то. Хотя я вижу одну большую проблему. Весь смысл одноразового блокнота в том, что вы используете его один раз, а затем выбрасываете. Хотя это не невозможно, было бы обременительно заменять совершенно новый блокнот каждый раз, когда я хочу отправить строку, зашифрованную таким образом. - person user227479; 09.12.2009
comment
Блок рандома по сути является складом большой коллекции одноразовых блокнотов. Вам не нужно выбрасывать блок случайности после каждого сообщения, вам просто нужно убедиться, что каждое сообщение использует другую часть блока случайности. Если вы считаете, что эта идея может сработать, я расширю ее в ответе. - person steveha; 09.12.2009
comment
@steveha В этом случае это не называется одноразовым блокнотом. - person Luka Rahne; 09.12.2009
comment
Это может сработать. Если бы я ежедневно обменивался безопасным образом новым 2048-байтным PAD (или блоком случайности), сколько использований PAD поддерживал бы этот блок — скажем, например, для каждого сообщения требовалось 8 байтов случайности. Хватит ли мне этого на 256 сообщений? Есть ли какая-либо причина, по которой было бы небезопасно использовать PAD сверху вниз перед сбросом, учитывая, что PAD совершенно случайный? Или я был бы ограничен использованием гораздо меньшей части PAD, прежде чем мне пришлось бы отказаться. - person user227479; 09.12.2009
comment
@ralu, теперь вы понимаете, почему я отказался от каких-либо знаний в этой области. Как бы вы это назвали? - person steveha; 09.12.2009
comment
@unknown, блокнот действительно случайный. Никто не может предсказать какие-либо значения из него. Таким образом, если вы хотите использовать каждый байт в блокноте один раз и больше никогда его не использовать, вы все равно можете использовать каждый байт в блокноте, прежде чем отбрасывать его. Так что да, если вы отправляете 2048 байтов для блока, вы использовали 8 байтов на блокнот и отбрасываете каждый блокнот после одного использования, что составляет 256 сообщений на блокнот. - person steveha; 09.12.2009
comment
@unknown, для генерации пэда лучше всего использовать настоящие случайные числа. Ядро Linux может считывать различные источники случайности, включая функции аппаратного генератора случайных чисел, доступные на некоторых микросхемах ЦП, для создания истинной случайности без какой-либо предсказуемости. Существуют также аппаратные устройства для создания потоков случайных данных. Одноразовый блокнот не поддается взлому в отличие от шифра; выяснение того, что на самом деле означают несколько сообщений, совсем не помогает расшифровывать будущие сообщения. И вы можете отправлять одно и то же сообщение каждый день, и оно, скорее всего, никогда не создаст один и тот же зашифрованный текст. - person steveha; 09.12.2009
comment
Обратите внимание, что использование только 3 битов случайности на десятичную цифру ввода покажет некоторую информацию о вводе. Например, если зашифрованный текст равен 8, вы точно знаете, что соответствующий открытый текст не может быть 0 или 9. - person Baffe Boyois; 09.12.2009
comment
@steveha: Спасибо за ваше предложение, но если это не одноразовый блокнот, мне нужно будет указать, что это такое, прежде чем я получу одобрение на реализацию. В идеале я должен быть в состоянии идентифицировать эту схему в «Прикладной криптографии» Шнайера или в каком-нибудь столь же уважаемом томе. Как бы мне ни хотелось создать новый метод, пока он не будет доказан, я не получу одобрения на реализацию этого решения. - person user227479; 09.12.2009
comment
@Baffe: Не уверен, откуда ты. Блок случайности будет блоком случайных десятичных цифр. - person user227479; 09.12.2009
comment
Каждая группа из трех битов кодирует число от 0 до 7. Добавьте каждое из этих чисел к соответствующей цифре из открытого текста по модулю 10. Таким образом, это всего лишь случайные числа от 0 до 7, что означает, что каждая цифра в зашифрованном тексте имеет только 8 возможных соответствующих открытых текстов вместо 10. - person Baffe Boyois; 09.12.2009
comment
@unknown, я уверен, что у вас есть специалисты по криптографии, с которыми вы можете обсудить это. Я просто какой-то парень, на самом деле не эксперт ни в чем, и, конечно же, не эксперт в том, что вы можете получить одобрение для государственных проектов или что-то в этом роде. Но я предлагаю вам использовать одноразовый блокнот или какой-либо его вариант, потому что, если в сообщении всего десять цифр, любой простой шифр будет подвергаться анализу трафика; вы действительно предпочли бы, чтобы одно и то же сообщение каждый раз выводилось по-разному, и одноразовый блокнот дает вам это. - person steveha; 09.12.2009
comment
@Baffe Boyois, спасибо, что указали на проблему. Я обновил ответ, чтобы предложить добавить один целый байт к каждой цифре, и приписал вам определение проблемы. - person steveha; 09.12.2009

Вы можете использовать восьмеричный формат, в котором используются цифры 0-7, а три цифры составляют байт. Это не самое компактное решение, но оно быстрое и простое.

Пример:

Text: Hello world!
Hexadecimal: 48 65 6C 6C 6F 20 77 6F 72 6C 64 21
Octal: 110 145 154 154 157 040 167 157 162 154 144 041

(для ясности добавлены пробелы для разделения байтов)

person Joey Adams    schedule 08.12.2009
comment
Не уверен, как это будет работать. Если входная строка десятичная, а выходная строка восьмеричная, длина и должна быть сохранена, тогда мы получим коллизии, поскольку пространство зашифрованного текста меньше, чем пространство открытого текста. т.е. не хватает возможных строк зашифрованного текста, чтобы однозначно идентифицировать все возможные входные данные. - person user227479; 09.12.2009
comment
Упс, хорошая мысль. Следовательно, вам нужно однозначное сопоставление десятичных цифр с десятичными цифрами. - person Joey Adams; 09.12.2009

Я не верю, что ваше требование может быть выполнено (во всяком случае, легко), хотя можно довольно близко приблизиться.

AES (как и большинство алгоритмов шифрования) написан для работы с октетами (т. е. 8-битными байтами) и будет создавать 8-битные байты. Как только он сделает свое дело, преобразование результата для использования только десятичных цифр или значений BCD станет невозможным. Таким образом, ваш единственный выбор — преобразовать входные данные из десятичных или двоично-десятичных цифр во что-то, что заполнит октет как можно полнее. Затем вы можете зашифровать это и, наконец, перекодировать вывод, чтобы использовать только десятичные или двоично-десятичные цифры.

Когда вы преобразуете цифры ASCII для заполнения октетов, это несколько «сжимает» ввод. Затем шифрование будет производить тот же размер вывода, что и ввод. Затем вы закодируете это, чтобы использовать только десятичные цифры, что увеличит его примерно до исходного размера.

Проблема в том, что ни 10, ни 100 не являются числом, которое вы легко впишете в байт. Числа от 1 до 100 можно закодировать 7 битами. Таким образом, вы в основном будете рассматривать их как битовый поток, помещая их по 7 бит за раз, но вынимая их по 8 бит за раз, чтобы получить байты для шифрования.

Это несколько лучше использует пространство, но все еще не идеально. 7 бит могут кодировать значения от 0 до 127, а не только от 0 до 99, поэтому, даже если вы будете использовать все 8 бит, вы не будете использовать все возможные комбинации этих 8 бит. Точно так же в результате один байт превратится в три десятичных разряда (от 0 до 255), что явно приведет к потере некоторого пространства. В результате ваш вывод будет немного больше, чем ваш ввод.

Чтобы приблизиться к этому, вы можете сжать свой ввод чем-то вроде сжатия Хаффмана или LZ * (или обоими) перед его шифрованием. Затем вы сделаете примерно то же самое: зашифруете байты и закодируете байты, используя значения от 0 до 9 или от 0 до 99. Это позволит лучше использовать биты в зашифрованных байтах, поэтому вы потратите очень мало. пробел в этом преобразовании, но ничего не делает для улучшения кодирования на стороне вывода.

person Jerry Coffin    schedule 08.12.2009
comment
Да, это ход мыслей, с которого я начал. Тем не менее, близко просто не будет достаточно хорошо. Мне нужна схема шифрования, которая будет на 100% надежна для всех длин открытого текста, т. е. нулевых коллизий и зашифрованного текста той же длины, что и ввод. Я чувствую, что это должно быть возможно, поскольку VeriFone удалось это сделать: их VeriShield Protect шифрует номер кредитной карты от устройства чтения карт до банка-эквайера. Зашифрованный номер карты выглядит точно так же, как реальный номер карты (первые 6 и последние 4 такие же, как реальный номер карты, средние цифры зашифрованы. Они утверждают, что это основано на AES). - person user227479; 09.12.2009
comment
Извините, но ответ rc4 или любой потоковый шифр. - person rook; 17.12.2009
comment
@Unknown:Наоборот. Хотя потоковый шифр производит вывод того же размера, что и ввод, этот вывод будет использовать полный доступный алфавит. Чтобы использовать только цифры, вам придется преобразовать его вывод в другой формат, что существенно расширит этот вывод. - person Jerry Coffin; 17.12.2009

Для тех, кто сомневается в режиме FFX AES, пожалуйста, свяжитесь со мной для получения дополнительной информации. Наша реализация представляет собой режим AES, который эффективно работает поверх существующих шифров. спецификация с доказательством / проверкой находится на веб-сайте режимов NIST. Режим FFSEM AES включен в режим FFX.

http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/ffx/ffx-spec.pdf

Если это имеет смысл, вы также можете напрямую поговорить с NIST об их статусе в отношении отправки режимов / принятия режимов AES, чтобы ответить на ваш вопрос FIPS. FFX имеет доказательства безопасности, независимую криптографическую проверку и не является «новым шифром». Однако он основан на проверенных методах, которым более 20 лет. В реализации мы можем шифровать данные, сохраняя при этом длину, структуру, целостность, тип и формат. Например, укажите явную политику формата, согласно которой вывод будет NNN-NN-NNNN.

Таким образом, в качестве режима AES мы можем, например, в среде мэйнфрейма для реализации просто использовать собственный процессор AES на z10. Аналогично открытым системам с устройствами HSM — мы можем работать поверх существующей реализации AES.

Формат, сохраняющий шифрование (как его часто называют) таким образом, уже используется в промышленности и доступен в готовых продуктах и ​​довольно быстро развертывается - уже используется в POS-устройствах и т. д., платежных системах, корпоративных развертываниях и т. д.

Марк Бауэр, вице-президент по управлению продуктами, защита от напряжения Отправьте сообщение по адресу [email protected], чтобы получить дополнительную информацию, или посетите наш веб-сайт, чтобы получить дополнительную информацию.

person Mark Bower    schedule 23.12.2009

Что-то вроде шифра Фейстеля должно соответствовать вашим требованиям. Разделите ваш входной номер на две части (скажем, по 8 цифр в каждой), передайте одну часть через необязательно обратимую или биективную функцию и вычтите другую часть из результата этой функции (например, по модулю 100 000 000). Потом как-то переставить цифры и повторить кучу раз. В идеале следует каждый раз немного варьировать функцию, которая используется. Дешифрование похоже на шифрование, за исключением того, что сначала отменяют последний шаг перестановки, затем вычитают вторую часть сообщения из результата использования последней функции, использованной для первой части сообщения (опять же, по модулю 100 000 000), затем отменяют. предыдущий шаг перестановки и т. д.

Самые большие трудности с шифром Фейстеля заключаются в том, чтобы найти функцию, которая обеспечивает хорошее шифрование с разумным количеством раундов, и выяснить, сколько раундов требуется для достижения хорошего шифрования. Если скорость не важна, можно, вероятно, использовать что-то вроде AES для выполнения функции скремблирования (поскольку она не обязательно должна быть биективной, вы можете произвольно дополнять данные перед каждым шагом AES и интерпретировать результат как большое двоичное число по модулю). 100 000 000). Что касается количества патронов, то 10, наверное, мало, а 1000, наверное, избыточно. Я не знаю, какое значение между ними было бы лучшим.

person supercat    schedule 17.05.2013

Использование только 10 цифр в качестве ввода/вывода совершенно небезопасно. Это настолько небезопасно, что очень вероятно, что оно будет взломано в реальном приложении, поэтому рассмотрите возможность использования не менее 39 цифр (эквивалент 128 бит). Если вы собираетесь использовать только 10 цифр, нет смысла использовать AES в этом случае у вас есть шанс изобрести свой собственный (небезопасный) алгоритм.

Единственный способ избежать этого — использовать шифр STREAM. Используйте 256-битный ключ «SecureKey» и вектор инициализации IV, которые должны быть разными в начале каждого сезона. Переведите это число в 77-значное (десятичное) число и используйте «сложение с переполнением» по модулю 10 с каждой цифрой.

Например

 AES(IV,KEY) =      4534670 //and lot more
 secret_message =   01235
                          + and mod 10 
 ---------------------------------------------
 ciphertext     =   46571 // and you still have 70 for next message

когда у вас заканчиваются цифры из потокового шифра -> AES (IV, KEY) увеличьте IV и повторите IV = IV + 1

Имейте в виду, что вы абсолютно никогда не должны использовать один и тот же IV дважды, поэтому у вас должна быть какая-то схема, чтобы предотвратить это.

Еще одна проблема связана с созданием потоков. Если вы генерируете число, превышающее 10 ^ 77, вы должны отказаться от увеличения этого числа IV и повторить попытку с новым IV. В противном случае высока вероятность того, что у вас будут необъективные цифры и уязвимость.

Также очень вероятно, что в этой схеме есть изъян или будет в вашей реализации

person Luka Rahne    schedule 08.12.2009
comment
Я не думаю, что такая криптосистема обязательно ненадежна. ‹p› Даже если мы возьмем пример, когда во входных данных всего 4 цифры: ‹p› Дает 10 ^ ^ 4 возможных значения открытого текста / зашифрованного текста ‹p› Дает ( 10^^4)! Возможные схемы зашифрованного текста для открытого текста 0000-›9999‹p› Это очень большое число, состоящее всего из 4 цифр!‹p› - person user227479; 09.12.2009
comment
Согласен с неизвестным. Кроме того, ничто не говорит о том, что кодирование от простого к шифру должно оставаться согласованным на протяжении всего сообщения. Я достаточно уверен, что математически доказуемо, что это можно сделать безопасно. Меня больше беспокоят некоторые другие ограничения проблемы. - person Carl Smotricz; 09.12.2009
comment
Это верно, но это совершенно небезопасно при атаке по известному открытому тексту, которую не так сложно применить en. wikipedia.org/wiki/Известная-plaintext_attack - person Luka Rahne; 09.12.2009
comment
Не думайте, что он уязвим для атаки с известным открытым текстом, поскольку ключ шифрования, вероятно, будет обмениваться каждые 200 или около того сообщений. Кроме того, открытый текст никоим образом не предсказуем от одного сообщения к другому, но почти так же хорош, как случайная последовательность цифр. - person user227479; 09.12.2009