Часто слышал страшилки, что общаться в телеграме небезопасно: в команде тг есть кроты, которые за деньги сливают кому попало базы данных с переписками и данными пользователей тг. Возникает потребность озаботиться темой шифрования.
В интернете обычно используется шифрование с открытым ключом. Для меня это довольно загадочная тема, может кто-нибудь расскажет как это работает. Типа, хакер может полностью перехватить ваши переписки, но расшифровать их сможет только с квантовым компьютером?
Более понятная вещь — шифрование с закрытым ключом. Наверно тут все это понимают, но на всякий случай расскажу. Предположим, у вас есть текстовой файл размером 1 КБ. Вы берёте файл размером 1 КБ с полностью случайным набором байт (закрытый ключ), побайтово складываете эти два файла; получается внешне полностью случайный файл, вы его передаете через интернет, и потом из этого файла надо побайтово вычесть файл закрытого ключа. Главное — передавать другим людям файл закрытого ключа не через интернет, а флешками.
Я написал на Delphi программу для такого шифрования текстов и файлов: мой файл закрытого ключа имеет размер 4 гб, и при шифровании программа выбирает в нём случайное место и добавляет байты оттуда.
Если кому-то моя программа интересна, можете написать на nickolay5544[одомашненный волк]gmail.com чтобы я вам её прислал. А у меня вопрос, насколько сложно на Delphi XE портировать программу под андроид (сделать .apk файл). Может меня проконсультируют как это сделать? Ещё я не помню — на Delphi XE можно скомпилировать программу под Mac? Если да, я наверно не буду портировать её на Lazarus, по крайней мере пока. Мне будет достаточно портировать программу под Mac и Android через fmx.
Скрытый текст
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
K>Часто слышал страшилки, что общаться в телеграме небезопасно: в команде тг есть кроты, которые за деньги сливают кому попало базы данных с переписками и данными пользователей тг. Возникает потребность озаботиться темой шифрования.
Открой для себя PGP.
K>В интернете обычно используется шифрование с открытым ключом. Для меня это довольно загадочная тема, может кто-нибудь расскажет как это работает. Типа, хакер может полностью перехватить ваши переписки, но расшифровать их сможет только с квантовым компьютером?
K>Более понятная вещь — шифрование с закрытым ключом. Наверно тут все это понимают, но на всякий случай расскажу. Предположим, у вас есть текстовой файл размером 1 КБ. Вы берёте файл размером 1 КБ с полностью случайным набором байт (закрытый ключ), побайтово складываете эти два файла; получается внешне полностью случайный файл, вы его передаете через интернет, и потом из этого файла надо побайтово вычесть файл закрытого ключа. Главное — передавать другим людям файл закрытого ключа не через интернет, а флешками.
Твой алкогоритм плох тем, что зная открытый и зашифрованный текст, можно восстановить ключ. Например, если большинство твоих писем начинается со слова "Привет", первые 6 (вернее 12, это же utf-8) байтов ключа ты уже раскрыл. Ну а дальше так, потихонечку, можно всё раскрыть.
Поэтому в настоящем шифровании одна и та же псевдослучайная последовательность никогда не используется для наложения на открытый текст дважды (сам по себе процесс такого наложения называется "гаммирование").
В криптографию надо уметь, чтобы не насвистеть. Я, например, не возьмусь делать шифрование для ответственных применений.
Здравствуйте, Khimik, Вы писали:
K>Я написал на Delphi программу для такого шифрования текстов и файлов: мой файл закрытого ключа имеет размер 4 гб, и при шифровании программа выбирает в нём случайное место и добавляет байты оттуда.
А расшифратор ты когда писать будешь ? Или там надо жать кнопку "расширофать" с выбором случайного места на стороне приема пока внятный текст не получится ?
Khimik:
K>Я написал на Delphi программу для такого шифрования текстов и файлов: мой файл закрытого ключа имеет размер 4 гб, и при шифровании программа выбирает в нём случайное место и добавляет байты оттуда.
В криптогрфии любая отсебятина и велосипедостроительство — это уязвимости.
Лучше не париться и всять что-то готовое.
Ключ 4 гб — это странно. Кажется ты не совсем понимаешь, что такое ключ.
То же с закрытыми и открытыми ключами.
Возьми какой-нибудь учебник по криптографии, чтобы хотя бы в терминологии не путаться.
Здравствуйте, Khimik, Вы писали:
K>Более понятная вещь — шифрование с закрытым ключом. Наверно тут все это понимают, но на всякий случай расскажу. Предположим, у вас есть текстовой файл размером 1 КБ. Вы берёте файл размером 1 КБ с полностью случайным набором байт (закрытый ключ), побайтово складываете эти два файла; получается внешне полностью случайный файл, вы его передаете через интернет, и потом из этого файла надо побайтово вычесть файл закрытого ключа.
Нифига ты не фишку не рубишь. При асимметричном шифровании закрытый ключ используется для ДЕшифрования, а также для наложения ЭЦП. Для шифрования и проверки ЭЦП достаточно открытого ключа.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, pva, Вы писали:
pva>А ключ передавать хоть тем самым RSA, но лучше уж ECDH. Сообщение у тебя будет "соль" + крипта. Соответственно, сидом для инициализации генератора будет "соль", а дальше просто гаммирование. Ну и base64 не забудь, куда ж без него.
Ты сейчас пытаешься ребенку, который с трудом складывает на палочках числа в пределах первого десятка, на пальцах объяснить, как решаются системы дифференциальных уравнений.
Здравствуйте, Bill Baklushi, Вы писали:
BB>jamesq:
J>>Поразительно вообще, что нашёлся программист, не слышавший об ассиметричной криптографии. BB>Какой-какой криптографии?
Вертел я на причинном месте этот руssкий язык. Ненавижу.
Здравствуйте, Khimik, Вы писали:
K>CryptGenRandom или RtlGenRandom
По некоторым сведениям, криптофункции Windows являются специально ослабленными, и в них есть закладки.
Серьёзные пацаны не пользуются ими, а либо используют проверенные реализации криптографии, либо пишут свою криптографию и никому не верят.
Здравствуйте, Khimik, Вы писали:
K>Более понятная вещь — шифрование с закрытым ключом. Наверно тут все это понимают, но на всякий случай расскажу. Предположим, у вас есть текстовой файл размером 1 КБ. Вы берёте файл размером 1 КБ с полностью случайным набором байт (закрытый ключ), побайтово складываете эти два файла; получается внешне полностью случайный файл, вы его передаете через интернет, и потом из этого файла надо побайтово вычесть файл закрытого ключа. Главное — передавать другим людям файл закрытого ключа не через интернет, а флешками.
Так вот алгоритмы с открытым ключом и придуманы, чтобы флешками не передавать ничего.
Ты выпускаешь пару ключей — закрытый+открытый. Закрытый держишь у себя. Открытый раздаёшь всем, кто желает тебе что-то секретное написать.
Дальше, тебе пишут, и шифруют твоим ключом. Расшифровать это, имея открытый ключ — практически невозможно. Получить из открытого закрытый ключ — практически невозможно.
Для расшифровки потребуется закрытый ключ, который есть только у тебя, и он никуда ни разу не передавался.
Ну и для ответа, тебе также надо знать открытый ключ того, кому ты отвечаешь.
Ну и техническая деталь. Ассиметричные алгоритмы — медленные, по сравнению с симметричными. Поэтому ассиметричным алгоритмом шифруется обычно только разовый симметричный ключ, которым зашифровано уже само сообщение.
Здравствуйте, Khimik, Вы писали:
K>В интернете обычно используется шифрование с открытым ключом. Для меня это довольно загадочная тема, может кто-нибудь расскажет как это работает. Типа, хакер может полностью перехватить ваши переписки, но расшифровать их сможет только с квантовым компьютером?
Ты бы глянул хоть википедию, что ли? Там же даже примеры есть как это работает.
K>Я написал на Delphi программу для такого шифрования текстов и файлов: мой файл закрытого ключа имеет размер 4 гб, и при шифровании программа выбирает в нём случайное место и добавляет байты оттуда.
Это называется "одноразовый блокнот". С тем же успехом вместо 4гб файла можно использовать 16 байт для AES ключа, который в свою очередь использовать в качестве PRNG.
А ключ передавать хоть тем самым RSA, но лучше уж ECDH. Сообщение у тебя будет "соль" + крипта. Соответственно, сидом для инициализации генератора будет "соль", а дальше просто гаммирование. Ну и base64 не забудь, куда ж без него.
Здравствуйте, Pzz, Вы писали:
Pzz>Всё это сложнее, чем ты думаешь, и очень легко насвистеть. Ошибки-то не слишком заметны. Вроде всё зашифровывается и расшифровывается, и на вид выглядит надёжно. А на практике, содержит какую-нибудь уязвимость. Даже профессиональные криптографы иногда допускают ошибки, и иногда достаточно хитрые, так что их только через несколько лет обнаруживают, при том, что все эти годы алгоритм и использовался активно и другие профессионалы на него смотрели.
Мне тут сказали, что и в моём варианте есть уязвимость: закрытый ключ у меня генерируется через random в Delphi, и зная это, можно его распознать. Прошу подсказать, как сгенерировать действительно более-менее случайное число (криптостойкий генератор случайных чисел). Можно как голую теорию, так и готовую функцию в Delphi. Мне сказали что нужен CryptGenRandom или RtlGenRandom, просьба подсказать — это есть в Delphi? Если да, какой модуль?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Xander Zerge, Вы писали:
XZ>Здравствуйте, Khimik, Вы писали:
K>>Сорри, пока не понял ничего. K>>Когда мне пишут — шифруют закрытым или открытым ключом? XZ>Шифруют открытым — только он опубликован же. Написать тебе может любой. А расшифровываешь только ты — закрытым, т.к. он есть только у тебя.
Ну так что такое вообще "закрытый ключ" в данном контексте? Если у отправителя этого закрытого ключа нет, как он может сгенировать что-то такое, что я расшифрую, а хакер не расшифрует?
K>>На каком этапе здесь математические операции — перемножение чисел и разложение чисел на простые множители? XZ>Перемножение — на этапе генерации пары ключей, разложение — при попытке подбора закрытого ключа по открытому.
Не понимаю пока.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
P>4 Позиция где он найден это будет шифрованым значением байта.
— в общем случае байт может быть вообще не найден
— позиция может не влезть в байт. а отбросить лишние биты нельзя, т.к. как потом расшифровывать? да и быстродействие страдает: сканировать неизвестно сколько байт на каждый шифруемый байт. вряд ли поедет велосипед с такими квадратными колесами.
гораздо проще проксорить младший байт псевдослучайного числа с найденным в файле и с шифруемым.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, jamesq, Вы писали:
Pzz>>>Ну так про изученные алгоритмы известно, сколько их.
J>>Что как раз там есть слабые ключи, но сколько и каких — неизвестно.
Pzz>Думаю, кому надо — известно. А кому не надо, незачем использовать ГОСТ.
Началось юление. Слив засчитан.
Здравствуйте, student__, Вы писали:
__>И чтобы вместо "передачи флешками" ты доверял какому-то незнакомому дяде, который даёт тебе открытый ключ
Почему незнакомому? Я незнакомым дядям шифрованные письма не пишу.
Мне пишут.
Налоговая, например.
Только тут шифровано не письмо, а его хэш — чтобы я мог его расшифровать открытым ключом с госуслуг, и сравнить с хэшем письма.
>получается внешне полностью случайный файл, вы его передаете через интернет
Долго ли укркомнадзор станет терпеть "полностью случайные файлы", если это станет сколько-нибудь массовым явлением?
Нужно генерить стеганографический файл, внешне похожий на обычный форумный бред.
Данное сообщение является художественным произведением и освещает вымышленные события в вымышленном мире. Все совпадения с реальностью являются случайными. Не является инвестиционной рекомендацией.
Здравствуйте, Pzz, Вы писали:
K>>Более понятная вещь — шифрование с закрытым ключом. Наверно тут все это понимают, но на всякий случай расскажу. Предположим, у вас есть текстовой файл размером 1 КБ. Вы берёте файл размером 1 КБ с полностью случайным набором байт (закрытый ключ), побайтово складываете эти два файла; получается внешне полностью случайный файл, вы его передаете через интернет, и потом из этого файла надо побайтово вычесть файл закрытого ключа. Главное — передавать другим людям файл закрытого ключа не через интернет, а флешками.
Pzz>Твой алкогоритм плох тем, что зная открытый и зашифрованный текст, можно восстановить ключ. Например, если большинство твоих писем начинается со слова "Привет", первые 6 (вернее 12, это же utf-8) байтов ключа ты уже раскрыл. Ну а дальше так, потихонечку, можно всё раскрыть.
Pzz>Поэтому в настоящем шифровании одна и та же псевдослучайная последовательность никогда не используется для наложения на открытый текст дважды (сам по себе процесс такого наложения называется "гаммирование").
Да, я это понимаю, но у меня же именно поэтому закрытый ключ размером 4 гигабайта. Если шифровать только текст, практически каждый раз будет выбираться новое случайное место в этом файле.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Xander Zerge, Вы писали:
XZ>Так вот алгоритмы с открытым ключом и придуманы, чтобы флешками не передавать ничего.
XZ>Ты выпускаешь пару ключей — закрытый+открытый. Закрытый держишь у себя. Открытый раздаёшь всем, кто желает тебе что-то секретное написать. XZ>Дальше, тебе пишут, и шифруют твоим ключом. Расшифровать это, имея открытый ключ — практически невозможно. Получить из открытого закрытый ключ — практически невозможно. XZ>Для расшифровки потребуется закрытый ключ, который есть только у тебя, и он никуда ни разу не передавался. XZ>Ну и для ответа, тебе также надо знать открытый ключ того, кому ты отвечаешь.
XZ>Ну и техническая деталь. Ассиметричные алгоритмы — медленные, по сравнению с симметричными. Поэтому ассиметричным алгоритмом шифруется обычно только разовый симметричный ключ, которым зашифровано уже само сообщение.
Сорри, пока не понял ничего.
Когда мне пишут — шифруют закрытым или открытым ключом?
На каком этапе здесь математические операции — перемножение чисел и разложение чисел на простые множители?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
K>Когда мне пишут — шифруют закрытым или открытым ключом?
Твой закрытый ключ — это тот который знаешь только ты. Твой открытый ключ — тот который знают другие/другой.
Когда другой человек тебе пишет он шифрует сообщение твоим открытым ключом. А ты потом у себя его сообщение расшифровываешь своим закрытым.
Соответственно, когда ты пишешь другому человеку, ты шифруешь сообщение его открытым ключом, а он расшифровывает твое сообщением своим закрытым ключом.
Здравствуйте, CRT, Вы писали:
K>>Когда мне пишут — шифруют закрытым или открытым ключом?
CRT>Твой закрытый ключ — это тот который знаешь только ты. Твой открытый ключ — тот который знают другие/другой.
CRT>Когда другой человек тебе пишет он шифрует сообщение твоим открытым ключом. А ты потом у себя его сообщение расшифровываешь своим закрытым.
Тогда я не понимаю, что такое закрытый ключ. Это может не ключ а какой-то математический алгоритм что ли?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Osaka, Вы писали:
>>получается внешне полностью случайный файл, вы его передаете через интернет O>Долго ли укркомнадзор станет терпеть "полностью случайные файлы", если это станет сколько-нибудь массовым явлением? O>Нужно генерить стеганографический файл, внешне похожий на обычный форумный бред.
Хороший архиватор тоже выдаёт файл, напоминающий случайный.
Здравствуйте, Khimik, Вы писали:
K>Сорри, пока не понял ничего. K>Когда мне пишут — шифруют закрытым или открытым ключом? K>На каком этапе здесь математические операции — перемножение чисел и разложение чисел на простые множители?
Ну, если делать очень наивно, генерируют псевдослучайный ключ для симметричного шифрования (очень короткий, 16-32 байта) и передают его тебе, зашифровав твоим открытим ключом — чтобы ты своим закрытым ключом мог расшифровать.
Сам по себе этот псевдослучайный ключ, используют с каким-нибудь алгоритмом шифрования (ну, например, AES), но используют его не в лоб, а в каком-нибудь режиме (https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B6%D0%B8%D0%BC_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F). Один из простейших режимов — можно шифровать AES-ом последовательный счетчик (0, 1, 2, ...), а получившуюся псевдослучайную последовательность накладывать уже на открытый текст, получая зашифрованный текст.
Всё это сложнее, чем ты думаешь, и очень легко насвистеть. Ошибки-то не слишком заметны. Вроде всё зашифровывается и расшифровывается, и на вид выглядит надёжно. А на практике, содержит какую-нибудь уязвимость. Даже профессиональные криптографы иногда допускают ошибки, и иногда достаточно хитрые, так что их только через несколько лет обнаруживают, при том, что все эти годы алгоритм и использовался активно и другие профессионалы на него смотрели.
Здравствуйте, Khimik, Вы писали:
K>Сорри, пока не понял ничего. K>Когда мне пишут — шифруют закрытым или открытым ключом?
Шифруют открытым — только он опубликован же. Написать тебе может любой. А расшифровываешь только ты — закрытым, т.к. он есть только у тебя. K>На каком этапе здесь математические операции — перемножение чисел и разложение чисел на простые множители?
Перемножение — на этапе генерации пары ключей, разложение — при попытке подбора закрытого ключа по открытому.
K>Прошу подсказать, как сгенерировать действительно более-менее случайное число (криптостойкий генератор случайных чисел).
Тебе вроде нужно не число, а последовательность длиной в 4 Гб!
Какой бы программная функция не была, всё, что она сможет выдать без источника реальной случайности — это только псевдослучайные последовательности.
Источники реальной случайности — это АЦП, в том числе видеокамера и аудиокарта (без разницы, что поступает на их аналоговые входы).
(На худой конец — датчики температуры проца/материнки, но поток данных слишком медленный. Не говоря уж о мыши и клавиатуре, хаотически мучиемых пользователем — но для получения одного истинно случайного числа и они годились.)
Т.к. АЦП всегда шумят, самым случайным будет младший бит каждого субпикселя/сэмпла. Но надежнее в цикле брать куски сырых данных в несколько Кбайт и хэшировать их в 32-64 бита — этим вся случайность с этих килобайт будет как бы собрана и упакована в эти биты.
Возможно, на практике достаточно так прохешировать свою коллекцию фильмов/фоток/etc (чтобы не возиться с видео/аудиозаписью). Но перфекционист это не одобрит.
Еще на практике достаточно взять несколько разных псевдослучайных генераторов и проксорить между собой их результаты. (Во избежание — потом стереть эту прогу и исходники.)
Еще лучше даже плохую псевдослучайную последовательность как следует случайно перетасовать (для этого есть свои алгоритмы).
Здравствуйте, L_G, Вы писали:
K>>Прошу подсказать, как сгенерировать действительно более-менее случайное число (криптостойкий генератор случайных чисел).
L_G>Какой бы программная функция не была, всё, что она сможет выдать без источника реальной случайности — это только псевдослучайные последовательности.
Используем классику жанра — книжный шифр с поправкой на мощность современных компутеров и настоящая случайность не особо нужна.
1 Берем большой архив, или там фильм в UHD.
2 Генерируем псевдослучайное число от 0 до длины файла в байтах
3 Ищем байт равный кодируемому начиная с этой позиции в большом файле
4 Позиция где он найден это будет шифрованым значением байта.
5 Повторяем с шага 2 для каждого байта в шифруемом файле
Даже зная методику шифрования без правильного файла не вскрыть, а оригинальная уязвимость книжного шифра к частотному анализу перекрыта.
K>>>На каком этапе здесь математические операции — перемножение чисел и разложение чисел на простые множители? XZ>>Перемножение — на этапе генерации пары ключей, разложение — при попытке подбора закрытого ключа по открытому.
K>Не понимаю пока.
Ну можешь хотя бы почитать описание алгоритма RSA (как одного из наиболее простых), там это расписано
Здравствуйте, Khimik, Вы писали:
K>Ну так что такое вообще "закрытый ключ" в данном контексте? Если у отправителя этого закрытого ключа нет, как он может сгенировать что-то такое, что я расшифрую, а хакер не расшифрует?
В гугле полно ссылок по асимметричному шифрованию, по которым на пальцах объясняются принципы работы.
Схема передачи данных между двумя субъектами (А и Б) с использованием открытого ключа выглядит следующим образом:
Субъект А генерирует пару ключей, открытый и закрытый (публичный и приватный).
Субъект А передает открытый ключ субъекту Б. Передача может осуществляться по незащищенным каналам.
Субъект Б шифрует пакет данных при помощи полученного открытого ключа и передает его А. Передача может осуществляться по незащищенным каналам.
Субъект А расшифровывает полученную от Б информацию при помощи секретного, закрытого ключа.
В такой схеме перехват любых данных, передаваемых по незащищенным каналам, не имеет смысла, поскольку восстановить исходную информацию возможно только при помощи закрытого ключа, известного лишь получателю и не требующего передачи.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, L_G, Вы писали:
P>>4 Позиция где он найден это будет шифрованым значением байта.
L_G>- в общем случае байт может быть вообще не найден L_G>- позиция может не влезть в байт. а отбросить лишние биты нельзя, т.к. как потом расшифровывать? да и быстродействие страдает: сканировать неизвестно сколько байт на каждый шифруемый байт. вряд ли поедет велосипед с такими квадратными колесами. L_G>гораздо проще проксорить младший байт псевдослучайного числа с найденным в файле и с шифруемым.
Допустим позиция число 4 байта, позволяет использовать ключевой файл размером в 4 гб. Ну превратился один байт исходный в 4 зашифрованых, это непринципиально для того объема, что человек вручную написать может.
У байтов только 256 возможных значений, чутьё подсказывает что в 4-ех гигабайтном файле двоичного формата встречаются все из них по многу раз, и уходить от начальной позиции не прийдётся далеко.
И кстати файл даже передавать не надо, только условиться и скачать одинаковый ISO дистрибутив линукса например.
Забыл сказать: единственный критерий "плохости" псевдослучайной последовательности по сравнению с истинно случайной — её зацикленность. Готовую последовательность можно просто проверить на зацикленность — начиная с конца, т.к. первые байты в общем случае могут не входить в кольцо, а последние не могут. Если цикла нет — последовательность можно считать истинно случайной (если строго — нужно проверять зацикленность последовательности битов, а не байтов...)
Здравствуйте, Khimik, Вы писали:
K>Ну так что такое вообще "закрытый ключ" в данном контексте? Если у отправителя этого закрытого ключа нет, как он может сгенировать что-то такое, что я расшифрую, а хакер не расшифрует?
Вот такая прелесть ассиметричного алгоритма. Перемножить два числа — легко. Понять, какие два числа были перемножены — трудно.
K>>>На каком этапе здесь математические операции — перемножение чисел и разложение чисел на простые множители? XZ>>Перемножение — на этапе генерации пары ключей, разложение — при попытке подбора закрытого ключа по открытому.
K>Не понимаю пока.
Почитай уже про RSA, это давно расписано разжёвано. Даже Алиса знает:
Давайте разберем математику RSA пошагово:
Генерация ключей:
Выбираются два больших простых числа p и q (например, по 150 цифр каждое)
Вычисляется их произведение n = p × q
Вычисляется функция Эйлера φ(n) = (p-1)(q-1)
Выбирается случайное число e (открытый экспонент), взаимно простое с φ(n)
Вычисляется d (закрытый экспонент) как обратное к e по модулю φ(n):
d × e ≡ 1 (mod φ(n))
Открытый ключ: (e, n)
Закрытый ключ: (d, n)
Шифрование сообщения M:
Сообщение представляется как число m < n
Шифрование: c = m^e mod n
Расшифровка шифра c:
m = c^d mod n
Почему это работает:
Благодаря свойствам модульной арифметики и теореме Эйлера
m^(e×d) ≡ m (mod n), если e и d подобраны правильно
Пример (для понимания принципа, не для реальной защиты):
p = 3, q = 11
n = 33
φ(n) = 20
e = 7 (взаимно просто с 20)
d = 3 (7×3 = 21 ≡ 1 mod 20)
Шифруем m = 5:
c = 5^7 mod 33 = 78125 mod 33 = 26
Расшифровываем c = 26:
m = 26^3 mod 33 = 17576 mod 33 = 5
Безопасность основана на том, что:
Умножить два простых числа легко
Разложить большое число на множители сложно
Найти d без знания p и q невозможно
Для реальных систем используются числа порядка 300-400 цифр, что делает взлом методом перебора практически невозможным даже с использованием современных суперкомпьютеров.
Важно: RSA обычно используется для шифрования небольших блоков данных (например, ключей симметричного шифрования) из-за относительно низкой скорости работы по сравнению с симметричными алгоритмами.
Здравствуйте, jamesq, Вы писали:
Pzz>>генерируют псевдослучайный ключ для симметричного шифрования
J>Я знаю, что бывают засады с заведомо слабыми ключами для некоторых алгоритмов. Так что псевдослучайно генерировать может быть опасно.
Ну если на 2^128 приходится с десяток слабых ключей, шанс на них нарваться примерно такой же, как шанс расщифровать текст, не зная ключа, с 10 случайных попыток.
K>>CryptGenRandom или RtlGenRandom
J>По некоторым сведениям, криптофункции Windows являются специально ослабленными, и в них есть закладки. J>Серьёзные пацаны не пользуются ими, а либо используют проверенные реализации криптографии, либо пишут свою криптографию и никому не верят.
Ок, вот и я напишу свой ГСЧ: сделаю zip файл очень большого размера, и буду с ним колдовать.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
K>Ок, вот и я напишу свой ГСЧ: сделаю zip файл очень большого размера, и буду с ним колдовать.
Только другим свои поделия не впаривай. Чтобы страдал от своей криворукости только ты.
Поразительно вообще, что нашёлся программист, не слышавший об ассиметричной криптографии.
Ладно бы школьник...
Здравствуйте, Pzz, Вы писали:
Pzz>Ну если на 2^128 приходится с десяток слабых ключей, шанс на них нарваться примерно такой же, как шанс расщифровать текст, не зная ключа, с 10 случайных попыток.
А если их не десяток, а гораздо больше? В криптографии нельзя полагаться на авось.
Здравствуйте, jamesq, Вы писали:
Pzz>>Ну если на 2^128 приходится с десяток слабых ключей, шанс на них нарваться примерно такой же, как шанс расщифровать текст, не зная ключа, с 10 случайных попыток.
J>А если их не десяток, а гораздо больше?
Ну так про изученные алгоритмы известно, сколько их.
J>В криптографии нельзя полагаться на авось.
А по-моему, криптография только и делает, что полагается на авось. Просто авось там хорошо изученный, надежный, с известными и предсказуемыми свойствами.
Здравствуйте, Pzz, Вы писали:
Pzz>Ну так про изученные алгоритмы известно, сколько их.
Помню, когда в начале нулевых пробовал запрограммировать наш стандарт ГОСТ 28147, и читал доки на эту тему, там выяснилось что стандарт не полон, и не освещает вопросы генерации ключей.
Что как раз там есть слабые ключи, но сколько и каких — неизвестно.
Pzz>>Ну так про изученные алгоритмы известно, сколько их.
J>Помню, когда в начале нулевых пробовал запрограммировать наш стандарт ГОСТ 28147, и читал доки на эту тему, там выяснилось что стандарт не полон, и не освещает вопросы генерации ключей.
Я в курсе.
J>Что как раз там есть слабые ключи, но сколько и каких — неизвестно.
Думаю, кому надо — известно. А кому не надо, незачем использовать ГОСТ.
Re[11]: Программа для шифрования с закрытым ключом
Здравствуйте, jamesq, Вы писали:
Pzz>>Думаю, кому надо — известно. А кому не надо, незачем использовать ГОСТ. J>Началось юление. Слив засчитан.
Ну я с таким же успехом могу сказать, что слив засчитан по причине перехода на личности.
ГОСТ — весьма специфический алгоритм для весьма специфической аудитории. Кроме того, старый ГОСТ с S-блоками "только для служебного использования" (фактически, оставляющими возможность расширить ключ, выбирая свой набор S-блоков под каждое применение) уже стал частью истории. В актуальном ГОСТ-е вся информация раскрыта.
Если Вы вынуждены использовать ГОСТ, у вас и режим применения будет регламентирован. Для более других алгоритмов информация о слабых ключах доступна, и Вы можете не использовать те алгоритмы, для которых это не так.
Здравствуйте, jamesq, Вы писали:
J>По некоторым сведениям, криптофункции Windows являются специально ослабленными, и в них есть закладки. J>Серьёзные пацаны не пользуются ими, а либо используют проверенные реализации криптографии, либо пишут свою криптографию и никому не верят.
У них еще и разные настройки этой самой криптографии для разных рынков (в зависимости от американских экспортных регуляций и от текущего настроения души Билла Гейтса, или кто у них там сейчас за старшего).
С другой стороны, непонятно, как собрать энтропию как (ну, по крайней мере, я на это надеюсь) это делает CryptGenRandom
В линухе с этим несколько проще, там есть urandom с документированным поведением.
Здравствуйте, Khimik, Вы писали:
K>Тогда я не понимаю, что такое закрытый ключ. Это может не ключ а какой-то математический алгоритм что ли?
Нет, это число.
Закрытый и открытый ключи — это такие числа, которые образуют пару между собой.
Устроена эта пара так, что decrypt(k1, encrypt(k2, data)) == data.
Это — примерно всё, что нужно знать для успешного использования ассиметричного шифрования.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.