Я хочу сделать простое шифрование с открытым ключом (асимметричным). Это не безопасно, я просто хочу понять концепции, стоящие за ними. Например, я знаю, что простые симметричные шифры могут быть сделаны с помощью 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;
-
Я отправляю вам значение 211 - зашифрованный байт.
-
Вы дешифруете его по той же схеме с помощью своего закрытого ключа:
decrypted = (input_value + pri) % 256 = (211 + 133) % 256 = 88;
Конечно, использование пары простого генерации в этом примере является слабым, поскольку известный алгоритм генерации закрытого ключа от общественности, и любой может легко восстановить частные, используя модульные и публичные. Но в реальной криптографии этот алгоритм неизвестен. Но, теоретически, он может быть обнаружен в будущем.
Ответ 2
Это область чистой математики, там книга под названием "математика шифров" довольно короткая, но хорошее введение. Тем не менее, я советую вам отказаться от реализации собственной, особенно в Java (вам нужен компилятор, который нацелен на реальную машину в зависимости от вида математики и соответственно оптимизируется). Вы должны спросить об этом на математических или компьютерных биржах.
Я получил отрицательный голос, поэтому я хочу уточнить. Я не бессердечный, но шифры твердо находятся в области математики, а не программирование (даже если это небезразличная математика или математическая сторона comp-sci), это требует хорошего понимания алгебраических структур, некоторой статистики, это, безусловно, Захватывающий район, и я призываю вас читать. Я имею в виду вышесказанное, хотя, не используйте ничего, что вы делаете, люди, которые "изобретают" эти шифры, забыли больше, чем вы или я, знаете, реализуют именно то, что говорят, в лучшем случае. В Java вы должны ожидать очень плохую производительность между прочим. Оптимизации, связанные с давлением и распределением регистра, приносят огромные дивиденды в пропускной способности шифра. Ява основана на стеке для начинающих.
Приложение (около 6 лет)
Сейчас в некоторых областях Java улучшилась (у меня есть фетиш компилятора, это само по себе странно), однако, оглядываясь назад, я был прав, но по неким неправильным причинам Java намного легче атаковать с помощью синхронизации, я видел некоторое применение полагаться на методы отслеживания компиляции, чтобы выяснить, какая версия программного обеспечения используется, например. Также очень трудно иметь дело с Призраком, который не исчезнет в ближайшее время (мне нравятся кэши.... Я чувствую себя грязно, говоря это сейчас)
ОДНАКО: прежде всего, не делайте этого сами! Поиграйте с ним НАИБОЛЕЕ - это очень много в области математики, и я должен сказать, что это, вероятно, лучше сделать на бумаге, если вы не любите полюбоваться терминалом с цифрами, набросанными на нем.
Ответ 3
http://en.wikipedia.org/wiki/RSA_(algorithm)
Является стандартным, на котором основан (весь) интернет