Как сделать простой криптографический алгоритм с открытым ключом?

Я хочу сделать простое шифрование с открытым ключом (асимметричным). Это не безопасно, я просто хочу понять концепции, стоящие за ними. Например, я знаю, что простые симметричные шифры могут быть сделаны с помощью XOR. Я видел в потоке stackexchange, что вам нужно использовать функции trapdoor, но я не могу найти много о них. Я хочу сказать, взять группу байтов и иметь возможность разделить их, чтобы получить открытый/закрытый ключ. Я получаю идеи общей тайны. Скажем, я генерирую случайное число 256 (не случайное вообще: P), и я разделил его на 200 и 56. Если я делаю XOR с 200, я могу только расшифровать с 200. Я хочу иметь возможность разделить числа случайным и таким, чтобы иметь возможность делать это асимметрично.

Ответ 1

ОК, просто простая демо-идея, основанная на добавлении/модуляции.

  • Давайте скажем, что у нас есть значение по модулю, для нашего примера 256. Это общеизвестное общеизвестное значение.

  • Скажем, вы создаете случайный секретный секретный ключ в интервале [1-255], например, pri = 133. Храните секретный ключ в кармане.

  • Создать открытый ключ, pub = 256 - pri = 123. Этот открытый ключ (123) вы можете поделиться с миром. Представьте, что сторонняя сторона не знает, как вычислить закрытый ключ у публики. Таким образом, они знают только открытый ключ (123).

  • Кто-то из общественности хочет отправить вам зашифрованный ASCII-байт. Он получает свой байт и добавляет к нему открытый ключ по модулю 256:

    encrypted = (input_value + pub) % modulto;
    

Например, я хочу отправить вам букву "X", код ASCII = 88 в зашифрованном виде. Итак, я вычисляю:

(88 + 123) % 256 = 211;
  1. Я отправляю вам значение 211 - зашифрованный байт.

  2. Вы дешифруете его по той же схеме с помощью своего закрытого ключа:

    decrypted = (input_value + pri) % 256 = (211 + 133) % 256 = 88;
    

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

Ответ 2

Это область чистой математики, там книга под названием "математика шифров" довольно короткая, но хорошее введение. Тем не менее, я советую вам отказаться от реализации собственной, особенно в Java (вам нужен компилятор, который нацелен на реальную машину в зависимости от вида математики и соответственно оптимизируется). Вы должны спросить об этом на математических или компьютерных биржах.

Я получил отрицательный голос, поэтому я хочу уточнить. Я не бессердечный, но шифры твердо находятся в области математики, а не программирование (даже если это небезразличная математика или математическая сторона comp-sci), это требует хорошего понимания алгебраических структур, некоторой статистики, это, безусловно, Захватывающий район, и я призываю вас читать. Я имею в виду вышесказанное, хотя, не используйте ничего, что вы делаете, люди, которые "изобретают" эти шифры, забыли больше, чем вы или я, знаете, реализуют именно то, что говорят, в лучшем случае. В Java вы должны ожидать очень плохую производительность между прочим. Оптимизации, связанные с давлением и распределением регистра, приносят огромные дивиденды в пропускной способности шифра. Ява основана на стеке для начинающих.


Приложение (около 6 лет)

Сейчас в некоторых областях Java улучшилась (у меня есть фетиш компилятора, это само по себе странно), однако, оглядываясь назад, я был прав, но по неким неправильным причинам Java намного легче атаковать с помощью синхронизации, я видел некоторое применение полагаться на методы отслеживания компиляции, чтобы выяснить, какая версия программного обеспечения используется, например. Также очень трудно иметь дело с Призраком, который не исчезнет в ближайшее время (мне нравятся кэши.... Я чувствую себя грязно, говоря это сейчас)

ОДНАКО: прежде всего, не делайте этого сами! Поиграйте с ним НАИБОЛЕЕ - это очень много в области математики, и я должен сказать, что это, вероятно, лучше сделать на бумаге, если вы не любите полюбоваться терминалом с цифрами, набросанными на нем.