Страницы

Поиск по вопросам

Показаны сообщения с ярлыком шифрование. Показать все сообщения
Показаны сообщения с ярлыком шифрование. Показать все сообщения

среда, 15 апреля 2020 г.

Сервер с JSON API. Как сделать правильно и безопасно.

#json #безопасность #шифрование

                    
Я хочу сделать сервер, который будет отдавать данные в формате JSON. (Как например
у Github.com).
Но проблема в том, что мне необходимо защитить передаваемые данные от перехвата.
Кроме того доступ к некоторым возможностям будет выборочным. (Т.е. нужна аутентификация
и авторизация).
Как это сделать? Можно использовать любые технологии, но желательно не слишком маргинальные.    


Ответы

Ответ 1



Авторизация по сложным паролям-токенам (средствами вашего кода) + HTTPS средствами apache+mod_ssl. Естественно, если клиент - браузер рядового пользователя - потребуется валидный сертификат. Если же использовать нешифрованный протокол - то можно пытаться защитить авторизацию через хеш на клиенте и рендомную "соль". Опять таки - все зависит от клиента. Если это браузер - решение должно быть максимально стандартным. Если коммутация сервер-сервер - тогда что угодно, вплоть до v3 SSL auth(обмен сертификатами).

пятница, 13 марта 2020 г.

Как зашифровать текст при записи в файл и расшифровывать его при открытии?

#c_sharp #шифрование


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

Сложные решение думаю пока что не смогу понять.
    


Ответы

Ответ 1



Спасибо за подсказки, по ним я нашел очень простой пример, правда нужно будет более детально в нем разобраться, но все же он очень простой. Шифруем текст, и записываем его в файл FileStream stream = new FileStream("C:\\mytext.txt", FileMode.OpenOrCreate, FileAccess.Write); DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider(); cryptic.Key = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH"); cryptic.IV = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH"); CryptoStream crStream = new CryptoStream(stream, cryptic.CreateEncryptor(),CryptoStreamMode.Write); byte[] data = ASCIIEncoding.ASCII.GetBytes("Hello World!"); crStream.Write(data,0,data.Length); crStream.Close(); stream.Close(); Дешифруем текст и выводим результат дешифрации в консоль FileStream stream = new FileStream("C:\\mytext.txt", FileMode.Open,FileAccess.Read); DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider(); cryptic.Key = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH"); cryptic.IV = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH"); CryptoStream crStream = new CryptoStream(stream, cryptic.CreateDecryptor(),CryptoStreamMode.Read); StreamReader reader = new StreamReader(crStream); string data = reader.ReadToEnd(); Console.WriteLine(data); Console.ReadKey(); reader.Close(); stream.Close(); Теперь осталось понять работу ключей, почитать мануал. что бы действительно понимать как все работает.

Ответ 2



Спасибо за хороший пример. Если вы хотите что бы корректно отображался кириллический текст то при записи следует немого изменить код при записи. var dstEncoding = Encoding.UTF8; FileStream stream = new FileStream("C:\\mytext.txt", FileMode.OpenOrCreate, FileAccess.Write); DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider(); cryptic.Key = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH"); cryptic.IV = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH"); CryptoStream crStream = new CryptoStream(stream, cryptic.CreateEncryptor(),CryptoStreamMode.Write); byte[] data = dstEncoding.GetBytes("Hello World!"); crStream.Write(data,0,data.Length); crStream.Close(); stream.Close();

среда, 4 марта 2020 г.

Шифруются ли данные при использовании WMI?

#windows #шифрование #wmi


Я использую WMI запросы для получения данных об удаленных компьютерах, но передача
данных должна быть защищена. На вики и msdn'е я ничего подходящего не нашёл, но должна
же винда как - то шифровать эти данные. Где можно узнать как она это делает, ну или
не делает? Никогда не думал о таких вещах, поэтому прощу прощения, если вопрос глупый.
    


Ответы

Ответ 1



Вот здесь задавали подробный вопрос. Если верить ответу, то шифруется только аутентификация посредством Kerberos. Сами запросы не шифруются

вторник, 25 февраля 2020 г.

Шифрование с открытым ключом

#python #шифрование


Мне надо осуществить обмен данными между двумя информационными-системами. Данные
хочу передавать в зашифрованном виде. Слышал о том, что возможно шифрование по ключу,
те на обеих сторонах известен ключ, по нему я шифрую данные. Какой алгоритм использовать?
Не хочу ничего придумывать, хочу воспользоваться API. Подскажите, куда смотреть.    


Ответы

Ответ 1



Думаю в вашем случае вполне подойдёт RSA. Вот конкретный простой пример.

Ответ 2



Смотреть в сторону rsa или aes шифрования. Вот, к примеру, либа для RSA.

Ответ 3



Открытый ключ - это ассиметричное шифрование. Посмотрите по ссылкам: https://www.dlitz.net/software/pycrypto/ http://sourceforge.net/projects/pypgp/

Ответ 4



можно исспользовать blowfish в виде модуля для питона где то есть в сети

Ответ 5



Вот гнездо python-gnupg, хотя можно и отсюда взять. Ну и пару слов про шифрование с открытым ключом. Оно обычно требует немало вычислений, и для скорости используются смешанные схемы, где алгоритмом с открытым ключом шифруется ключ сессии, а сам поток данных шифруется уже алгоритмом с секретным ключом (симметричным), с использованием данного ключа. А шифрование сообщений алгоритмами с открытым ключом -- экзотика.

пятница, 14 февраля 2020 г.

Дешифровка текста (частотный анализ)

#криптография #шифрование


Есть зашифрованный текст:
щ ьфьъзеэ кщвъязфхъзкд нэок амфопф адеа нзъч. аф-амътзъьс ф нъхсогъ зъ иупф хъщеъч.
нфь бэчхфмфзщгфбф афбмсякпщд х емэсм – аъмщфзэп амкекй, эзбъпкзэ йфнкпэ ипънзэд к щ
яэапэгэззуьк бпэяэьк, хкзкпэ щъид. йфядкз яэаъмщд х гэикзъеъ к амэгеквъщгк фееснэ зъ
хуйфнкп. яэимфщкп мэифес, фе ъну фегэяухэпщд, фщсзспщд, щаэп щ пкцэ.
– эмесм, еу иу афъп веф-зкисна? – сьфпдшыъ афамфщкпэ эзбъпкзэ. – к амъгмэек гсмкеа,
щгфпагф ьфтзф! нхъ аэвгк хущьфпкп! – фзэ хумхэпэ с зъбф кя аэпацъх щкбэмъес, яэесокпэ
х аъаъпазкцъ, мэщаэйзспэ оефму к фегмупэ фгзф х гэикзъеъ, хасщекх х гфьзэес щфпзцъ
к аъзкъ аекц.
бэчхфмфзщгкч сбмшьф афщьфемъп зэ бсхъмзэзегс, нфщеэп кя аэвгк нмсбсш щкбэмъес, амкгсмкп
к щзфхэ соъп х щъид.
– эмесм, хфяаьк щъид х мсгк, въме хфяаьк! х ифпазкцэй к ьфмбэй нэок зъе. еу тъ щэь
бфхфмкп, веф нэогэ иъбсзад. фзэ хъмзъещд, фидяэеъпазф хъмзъещд! – эзбъпкзэ физдпэ ьствкзс
щяэнк яэ апъвк к амктэпэща ыъгфч г ъбф яэеупгс.
х гэикзъе яэбпдзспэ бфмзквзэд к нфпфткпэ:
– г хэь кхэз эмгэнаъхкв.
бэчхфмфзщгкч хдпф гкхзсп.
хэмпэьфх хфоъп х гфьзэес ифнмфч афйфнгфч.
– зъ афзкьэш д хэоъ сафмзфъ зътъпэзкъ фимэекеащд х ькпкцкш, – щгэяэп фз. – ъщпк иу
нэмаш афйкекпк щ цъпаш хугсаэ, еф нэхзф иу афяхфзкпк к сщпфхкд хущеэхкпк. афмэ афнгпшвкеа
амэхффймэзкеъпазуъ фмбэзу.
– зъзэхктс ьъзефх. ьфд щпстиэ иъяфаэщзфщек нъпэъе хщъ хфяьфтзфъ.
– асщеа амфнфптэъе х ефь тъ нсйъ. хэщ зкгеф к зъ амфщке пшикеа ьъзефх, афнсьэчеъ
ф нфвъмк – афмэ афнгпшвэеа нфафпзкеъпазуъ мъяъмху, к д язэш въпфхъгэ, гфефмуч щьфтъе
зэь афьфва. щфикмэчеъща, иснс тнэеа хэщ х ьэокзъ. нфхфпазф нсмэгэ хэпдеа!
хэмпэьфх хуоъп яэ нхъма. бэчхфмфзщгкч мэянэхкп фгсмфг х аъаъпазкцъ к ьънпъззф афнздпщд.

Провел его частотный анализ в Excel-е, получил частоты букв. Стоит упомянуть, что
знаки препинания и пробелы не кодировались. Слева частоты в текущем тексте, справа
данные с Википедии


Прямая замена символов по приблизительным частотам ничего не дает, видимо, текст
слишком маленький, получается что-то непонятное. В то же время почти уверен, что Ф
-> О. Если кто-то сможет подсказать, то буду очень благодарен.
    


Ответы

Ответ 1



С момента исчезновения Даши прошло пять дней. По-прежнему о девушке не было вестей. Дом Гайворонского погрузился в траур – персонал притих, Ангелина ходила бледная и с заплаканными глазами, винила себя. Хозяин заперся в кабинете и практически оттуда не выходил. Забросил работу, от еды отказывался, осунулся, спал с лица. – Артур, ты бы поел что-нибудь? – умоляюще попросила Ангелина. – И прекрати курить, сколько можно! Две пачки высмолил! – Она вырвала у него из пальцев сигарету, затушила в пепельнице, распахнула шторы и открыла окно в кабинете, впустив в комнату солнце и пение птиц. Гайворонский угрюмо посмотрел на гувернантку, достал из пачки другую сигарету, прикурил и снова ушел в себя. – Артур, возьми себя в руки, черт возьми! В больницах и моргах Даши нет. Ты же сам говорил, что Дашка бегунья. Она вернется, обязательно вернется! – Ангелина обняла мужчину сзади за плечи и прижалась щекой к его затылку. В кабинет заглянула горничная и доложила: – К вам Иван Аркадьевич. Гайворонский вяло кивнул. Варламов вошел в комнату бодрой походкой. – Не понимаю я ваше упорное нежелание обратиться в милицию, – сказал он. – Если бы Дарью похитили с целью выкупа, то давно бы позвонили и условия выставили. Пора подключить правоохранительные органы. – Ненавижу ментов. Моя служба безопасности делает все возможное. – Пусть продолжает в том же духе. Вас никто и не просит любить ментов, подумайте о дочери – пора подключать дополнительные резервы, и я знаю человека, который сможет нам помочь. Собирайтесь, буду ждать вас в машине. Довольно дурака валять! Варламов вышел за дверь. Гайворонский раздавил окурок в пепельнице и медленно поднялся. Все расшифровывается, как и писали в комментариях: 1) Проводим частотный анализ, находим самую часто встречающуюся букву 2) Заменяем эту букву на "О" 3) Ищем слова: "он, она, они, кто, что, то" и находим остальные буквы.

четверг, 13 февраля 2020 г.

Безопасная отсылка пакета (Сундук с двумя замками)

#php #шифрование #javascript


Как безопасно отправить ценность по почте?
Внимание, спойлер к решению популярной головоломки!

Покупаем сундук, покупаем замок.
Кладем ценность в сундук, надеваем замок на сундук, отправляем другу.
Друг надевает свой замок, отправляет нам.
Мы снимаем свой замок, отправляем другу.
Друг снимает свой замок и получает ценность.

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


Ответы

Ответ 1



В качестве замка используйте обычный xor. Его главная особенность - двойное наложение возвращает исходные данные. А вот как сгенерировать гамму - это уже отдельна задача. Хоть в блокноте от руки единичек и ноликов нагенерируйте. Главное, потом ее не забыть и повторно применить.

Ответ 2



Возможно асимметричное шифрование? Друг генерит 2 ключа: для зашифровки и для расшифровки. Тот ключ, что для зашифровки, отправляется тебе. Ключ для расшифровки остаётся у него и будет известен только ему.

среда, 5 февраля 2020 г.

308 в степени 611 mod 899

#cpp #алгоритм #математика #шифрование #rsa


Как вычислить значение настолько "большого" выражения, как 308^611 (mod 899).
Просто делаю алгоритм RSA на C++. Возможно, решение в mod n, но я не понимаю? как
это сделать.
    


Ответы

Ответ 1



Просто выполняете умножения по модулю, а для возведения в степень используете быстрое возведение в степень. Рассмотрим ваш случай. 689 = 1010110001 Значит, 308 в 689 степени считается так (все действия по модулю 899). 308^2 = 469 308^4 = 469^2 = 605 308^8 = 605*605 = 132 308^16 = 132*132 = 343 16 степень соответствует второй справа единице в бинарном представлении, так что теперь множим 343 на 308 и получаем 461 - это 308 в 17 степени по модулю 899. Дальше получаем 308^32, перемножая 343*343, умножаем на наше 461... Ну, и так далее. Идея понятна? Примерно так это выглядит на C++: unsigned long long iqpow(unsigned long long x, unsigned long long e, unsigned long long p) { unsigned long long res = 1; for(x %= p;e;e>>=1) { if (e&1) res = (res*x)%p; x = (x*x)%p; } return res; } int main() { cout << iqpow(308,611,899) << endl; }

воскресенье, 26 января 2020 г.

Шифровать изображение в изображение. Как лучше всего?

#изображения #шифрование


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

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

Есть идеи?



Update. Если не касаться проблемы изменения размеров, то получается красиво: 

Исходное → зашифрованное → дешифрованное

Тут проблема в том, что шифрованное изображение подвергается сильным искажениям при
изменении размеров, JPEG сжатии и прочим, так как по сути такого рода графическое изображение
нужно хранить именно в битмапе (что делает этот подход не приемлимым в современных
реалиях). Остаётся попробовать увеличивать шифрованное изображение раза в два три,
чтобы каждый отдельный пиксель был площадью в 2 или 3 пикселя. А перед дефишровкой
искать алгоритм наиболее удачного возвращения к исходным размерам.
    


Ответы

Ответ 1



В точности по вашему случаю: можно обойтись перемешиванием пикселей, или лучше усреднённых цветов областей размера width/N x height/N. Кодовое слово определяет алгоритм "обхода" поля картинки, так, чтобы за конечное число шагов покрыть все изображение, побывав в любом месте хотя бы раз (возможно несколько). И банально попарно менять области местами каждые два шага. Если слово будет определять алгоритм обхода "векторно" - без привязки к точным пикселям, то изменения размера картинки не должны сильно ухудшить результат расшифровки. Другие мысли: Надо суметь в изображении сохранять несколько "слоёв" данных: от крупных признаков, до мелких деталей. Тогда при изменении размера или ацкой компресии пропадут, скажем, совсем мелкие детали, но более крупные признаки и суть изображения останутся. Погуглите про частотное разложение изображений. Например, с двумя частотами, исходное раскладывается на два изображения такого же размера: исходная картинка сильно блюрится (уходят мелкие детали) - это низкочастотный канал. разница исходной и блюренной - серенькое изображение — содержит только мелкие детали. Сложив определенным образом эти два изображения, получается снова исходное, пиксель-в-пиксель. В ретуши так, например, можно легко избавиться от веснушек на коже, выделив их в отдельный частотный канал и замазав там в сплошной серый. Так вот, интуиция подсказывает, что: нужно раскладывать изображение по частотам и шифровать их отдельно == устойчивость к компрессии/уменьшению; шифрованное изображение должно содержать наложение нескольких слоев информации одновременно; размер признаков кореллирует с радиусом размытия данного слоя. Для Processing'а был такой пример эффекта "поинтилизма": в исходной картинке выбираются случайные квадратные области, блюрятся - берется усреднённый цвет, и в новой картинке рисуется полупрозрачный круг этого цвета, вписанный в тот квадрат. И они рисуются снова и снова, разных размеров. По мере роста числа этих вроде бы случайных кругов случайных цветов, начинает вырисовываться исходная картинка.

Ответ 2



А если сохранить данные о цвете каждого пиксела в изображении, сделать его ч/б и подвергнуть его шифрованию. Данные о цвете сохранить в заголовке или в конце файла с изображением Посомотрите на этот пример, если владеете С++ link text

Ответ 3



изображение запихать в base64, а base64 зашифровать в TrueCrypt или тому подобное (anubis там например). Или сразу напрямую шифровать, если такое возможно. Ну и в конце посмотреть в интернете, как умельцы к картинкам добавляли архивы. При всём этом нужно помнить, что большинство пикчехранилищ пересохраняют картинки.

пятница, 24 января 2020 г.

Почему AES расшифровывается именно таким образом?

#java #криптография #шифрование #aes


Использую шифрование AES с разными режимами (далее в примере режим "CBC"). Зашифровываю
следующий файл с текстом.

Вношу ошибку в получившийся шифрованный код примерно в середине текста.

При дешифровке получается следующий текст.


Собственно вопрос: почему неправильно расшифровывается именно этот отрезок текста,
ведь как я понял из документации AES (и как мне объяснял преподаватель) неправильно
расшифровываться должен весь текст, содержащийся после внесенной ошибки? Как сделать,
чтобы работало именно так?

Код класса (в "mode" передаю режим):

public class AesCipher {

    private static final String INIT_VECTOR = "ItIsOurBigSecret";

    // зашифрование
    static byte[] encrypt(byte[] secretKey, byte[] plainText, String mode) {

        try {
            if (!isKeyLengthValid(secretKey)) {
                throw new Exception("Длина ключа должна быть 128, 192 или 256 бит!");
            }

            IvParameterSpec ivParameterSpec = new IvParameterSpec(INIT_VECTOR.getBytes());
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "AES");

            Cipher cipher = Cipher.getInstance("AES/" + mode + "/PKCS5Padding");
            if (mode.equals("ECB"))
                cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            else
                cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);

            return cipher.doFinal(plainText);
        } catch (Throwable cause) {
            System.out.print(cause.getMessage());
        }

        return null;
    }


    // дешифрование
    static byte[] decrypt(byte[] secretKey, byte[] cipherText, String mode) {

        try {
            if (!isKeyLengthValid(secretKey)) {
                throw new Exception("Длина ключа должна быть 128, 192 или 256 бит!");
            }

            IvParameterSpec ivParameterSpec = new IvParameterSpec(INIT_VECTOR.getBytes());
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "AES");

            Cipher cipher = Cipher.getInstance("AES/" + mode + "/PKCS5Padding");
            if (mode.equals("ECB"))
                cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
            else
                cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);

            return cipher.doFinal(cipherText);
        } catch (Throwable cause) {
            System.out.print(cause.getMessage());
            Controller.ShowMessage(cause.getMessage());
        }

        return null;
    }


    // проверка длины ключа
    private static boolean isKeyLengthValid(byte[] key) {
        return key.length == 16 || key.length == 24 || key.length == 32;
    }

    


Ответы

Ответ 1



Все правильно. AES обрабатывает данные блоками. В режиме CBC для расшифровки одного блока используется 2 блока шифротекста. Выглядит это приблизительно так: расшифрованый_блок = aes_decrypt(зашифрованый_блок) xor (предыдущий_зашифр_блок) По-этому ошибка в 1 байте шифротекста приведет к неправильной расшифровке только одного блока. Плюс один байт в другом блоке (из-за операции xor). Если вам нужно, что бы ломались все блоки после ошибки, можете использовать другой режим шифрования, например PCBC обладает таким свойством.

суббота, 11 января 2020 г.

Как работает SSL в мобильных приложениях?

#алгоритм #ssl #шифрование #сертификат


В браузере все понятно, у него заранее есть список вшитых сертификатов CA, которыми
он проверяет сертификат сервера... Но как происходит проверка в мобильных приложениях?
Или, допустим, когда я отправляю запрос, допустим, через BurpSuite?
    


Ответы

Ответ 1



Общие принципы SSL (а точнее, инфраструктуры ключей) продолжают работать и в контексте мобильных приложений. Набор CA (или, по-русски, ЦС – центров сертификации): может быть размещен в ОС (чаще всего, т. к. он используется по умолчанию [обычно]). может поставляться с приложением (что не такая уж редкость, см. Firefox). может отсутствовать вовсе, если клиент заранее знает публичный ключ сервера сам, или может попросить пользователя проверить отпечаток ключа в интерфейсе (привет, SSH!), или просто плевать хотел на безопасность (и такое бывает! ¯\_(ツ)_/¯). Может использоваться несколько вариантов сразу. Например, Яндекс.Браузер использует гибрид: он рассчитывает на системное хранилище, но отпечатки (хэши) сертификатов ЦСов оттуда сравнивает с известными ему (за уточнение механизма спасибо Abyx). Их немного, поэтому зашить в бинарник не проблема. Таким образом ЯБ пытается предупреждать ситуации, в которых соединение пользователя компрометируется через сторонний ЦС, установленный в систему без его ведома. Так что, как видите, SSL довольно хорошо гнётся под разные ситуации. Но реально этим богатством редко пользуются. В подавляющем большинстве случаев сервер имеет ключ, заверенный известным ЦС, а клиент имеет только пачку известных ЦС в ОС. Сервер предоставляет доказательства, указывающие через известные ЦС на подлинность своего ключа. Так клиент понимает, что это тот самый сервер.

Ответ 2



Если говорить про Android (он построен на ядре Linux), там есть папка с сертификатами /etc/ssl, в которой хранится список всех установленных сертификатов в системе. Мобильные приложения при установке защищенного соединения обращаются к этому списку.

пятница, 10 января 2020 г.

Длина соли и длина выходной стройки алгоритма blowfish

#blowfish #php #криптография #шифрование


Здравствуйте. В мануале php сказано, что Blowfish-шифрование использует соль след.
формата: "$2a$", весовой параметр из двух цифр, "$" и 22 цифры из алфавита "./0-9A-Za-z"
. Но на деле вместо 22 у меня почему-то используется только 21 символ.
$var = "1111111111111111111112";//22-й символ помечен двойкой

echo strlen($var);//выводит 22

echo crypt("12345", "$2a$11$".$var);// выводит $2a$11$111111111111111111111uDWduZDJM79lPV0duPxKCR2XEmS5ly2q

Как видно 22-й символ обрезался и не попал в соль.
Вопрос1: Как объяснить выше описанное поведение?
Вопрос2: У меня на php длина выходной строки (хэша с солью) всегда равна 60 байт
(ну или 60 символов латинского алфавита). Это общий стандарт? стандарт php? Если да,
то где описан?
Спасибо.    


Ответы

Ответ 1



Соль задается из алфавита "./0-9A-Za-z" (64 символа), т.е. каждый символ представляет из себя 6 бит. Это напоминает кодировку BASE64. Вы задаете 22 символа это 22*6 = 132 бита. Для Blowfish соль используется 128 бит из-за этого последние 4 бита не используется. Когда выводится результат, то 128 бит также дополняются 4 нулевыми битами, т.е. от последнего символа остается только 2 старших бита. В вашем примере: 2 (111000) -> u(110000), т.е. последний символ Вы можете задавать любой с точность до 2-х старших битов и это не будет влиять на хэш.

четверг, 2 января 2020 г.

Шифрование на Питоне

#python #шифрование


Посоветуйте библиотеку для шифровки и расшифровки на Питоне.    


Ответы

Ответ 1



hashlib - MD5, SHA-1,SHA224, SHA256, SHA384, SHA512 pycrypto - Python Cryptography Toolkit А также поиск по категориям: http://pypi.python.org/pypi?:action=browse&c=401&c=400

Ответ 2



Вдобавок к PyCrypto - KeyCzar, это чтобы было проще работать.

Ответ 3



RSA вот пример

среда, 1 января 2020 г.

Проблема с шифрованием XOR

#cpp #c #шифрование


Помогите найти ошибку в коде, текст из файла шифруется, а вот с дешифровкой проблемы

#include 
#include 
#include 
#include 

char XORing(char key, char input);

int main(int argc, char* argv[]){
    setlocale(LC_ALL, "rus");
    if(argv[1][0] == '1'){ //шифровка

        FILE *input;
        FILE *shifr;
        input = fopen("input.txt", "r");
        shifr = fopen("shifr.txt", "w");

        //Ввод ключа с клавиатуры
         char key[30];
        printf("Введите ключ: ");
        gets(key);
        int k = strlen(key);
        //перевод в нижний регистр
        for (int i = 0; i < k; i++){
            key[i] = tolower(key[i]);
        }

        //подсчет кол-ва символов в input
        int inp = 0; //счетчик
        while(fgetc(input) != EOF){
            inp++;
        }

        //шифрование input посимвольно
        for(int i = 0; i < inp; i++){
            char c = fgetc(input);
            c = tolower(c);
            fputc(XORing(key[i%k], c), shifr);
        }

        fclose(input);
        fclose(shifr);

    }
    else if(argv[1][0] == '2'){ //дешифровка

        FILE *key;
        FILE *shifr;
        FILE *deshifr;
        key = fopen("key.txt", "r");
        shifr = fopen("shifr.txt", "r");
        deshifr = fopen("deshifr.txt", "w");

        //создаем массив символов для ключа
        char KeyArr[30];
        fgets(KeyArr, 30, key);
        int k = strlen(KeyArr);
        //перевод в нижний регистр
        for (int i = 0; i < k; i++){
            KeyArr[i] = tolower(KeyArr[i]);
        }

        //подсчет кол-ва символов в shifr
        int sh = 0; //счетчик
        while(fgetc(shifr) != EOF){
            sh++;
        }

        //дешифровка
        for(int i = 0; i < sh; i++){
             char c = fgetc(shifr);
            fputc(XORing(KeyArr[i%k], c), deshifr);
        }

        fclose(key);
        fclose(shifr);
        fclose(deshifr);
    }

    else{
        printf("Error: faulse value");
    }

    return 0;
}

char XORing(char key, char input){
    char c = input ^ key;
    return c;
}

    


Ответы

Ответ 1



Во-первых, вы что-то выдумываете. Никакой шифровки текста из файла ваш код не выполняет и выполнять не может. У вас цикл подсчета количества входных символов упирается в конец файла и там навсегда и остается. Сам цикл шифрования, разумеется, читать файл не будет и шифровать ничего не будет. Чтобы этот код мог что-то шифровать, необходимо как минимум сделать rewind(input) между циклами чтения. Или избавиться совсем от этого ненужного предварительного вычисления размера файла. (Зачем понадобился этот лишний проход по файлу?) Во-вторых, функция gets не включает символ '\n' в прочитанную строку. Функция fgets включает символ '\n' в прочитанную строку, если он наличествует во входе. Это может быть причиной того, почему внешне одинаковые ключи шифровки/дешифровки на самом деле отличаются. Если файл с ключом у вас содержит перевод строки после собственно значения ключа, то этот перевод строки прочитается как часть ключа. Символ '\n' в ключе будет активно участвовать в процессе расшифровки, в то время как на этапе шифровки его там не было. Понятно, что из-за этого все поедет вкривь и вкось. Не забываете "убивать" ненужный '\n' в конце строки char KeyArr[30]; fgets(KeyArr, sizeof KeyArr, key); KeyArr[strcspn(KeyArr, "\n")] = 0; В-третьих, использование типа char, который может быть знаковым, для выполнения побитовых операций - не самая лучшая идея. P.S. Функция gets официально исключена из состава стандартной библиотеки. Пользуйтесь scanf или fgets и там, и там.

вторник, 31 декабря 2019 г.

Шифрование ссылок для скачивания

#файлы #php #ссылки #шифрование


Вопрос довольно популярный, объясните пожалуйста каким образом можно наиболее адекватно
шифровать ссылки для скачивания. То есть пользователь вошел -> для него генерируется
ссылка, допустим на zip архив, ну и удаляется после скачки. Ни когда таким не занимался,
стало интересно.    


Ответы

Ответ 1



Можно пользоваться средствами веб сервера: модуль SecureLink для nginx (вовсю использую); и, кажется, mod-auth-token для Apache. Upd. Можно написать и свою реализацию на том же php, но есть очевидный минус: перформанс. Чтобы не показывать истинный адрес файла, придётся пропускать его контент сквозь работающий php скрипт в течение всего времени скачивания. Т.е. в памяти будет висеть по тяжеленному процессу php на каждую сессию скачивания. А веб сервер делает то же самое, легко и изящно. А, ещё можно создавать временную копию ценного файла, или, лучше, линк на него, со странным именем-абракадаброй, и стирать через опр. время.

Ответ 2



Вот тут человек приводит свой готовый класс для таких целей: Временная ссылка для скачивания файла.

Ответ 3



С помощью php придумываем ссылку и с помощью mod_rewrite подсовываем файл. Например такой .htaccess где index.php обрабатывает все запросы: Options +SymLinksIfOwnerMatch RewriteEngine On RewriteBase / RewriteRule .* index.php [L]

Ответ 4



Я решил так задачу. Зделал файл скачивания назовем его download.php При заходе участника (За регестрированного пользователя) на сайт даем ему случайно сгенерированный ключ, который активен пока пользователь на сайте ?key=KJSJH#&&#EGJHJ к нему прикручиваем имя файла и директорию пользователя в которой находится файл. Отдаем все это через Header() application/octet-stream Ключ можно проверять через сессию например $_SESSION['confirm_download_key']; незнаю насколько эффективно, но пока работает.

пятница, 27 декабря 2019 г.

Шифрование системного диска для удалённых станций

#linux #безопасность #шифрование


Доброй ночи.

Имеется сервер на котором содержится небольшое количество приватной информации (IP
адреса хостов, хеши паролей). Сервер отсылается клиентам и поддерживается удаленно
по ssh/IPMI через VPN-роутер. 

Есть ли способ шифрования диска в случае попытки его прочтения на другой машине в
котором не нужно вводить пароль при загрузке?

Сервера - в моем случае это 1u Supermicro физическое устройство, осылаемое клиенту
по почте.

Клиент - это компания с которой заключен котракт.

Думал о LUKS, но там нужен ключ при загрузке.
    


Ответы

Ответ 1



Есть несколько вариантов, я могу предположить как делал бы я: Вариант шифруем все LUKS если нужно закрыть доступ в случае когда диск извлекается и осуществляется попытка чтения диска на другом железе. Паролей в этом случае от доступа к файловой системе может быть несколько (до 8 слотов). Пароль это или фраза (к примеру есть у вас и есть у клиента) или файл который клиент может хранить на usb носителе. (все они могут быть изменены в любой момент времени и введены к примеру через IPMI/SSH). Если диск содержит корневой раздел то пароль вводим при загрузке через IPMI (или вставляем usb носитель с файлом), если же это отдельный диск, то можно после загрузки по ssh подключится и разблокировать раздел. Пример кофигурации Вариант шифруем конкретную директорию используя возможности ext4 тут есть свои плюсы и минусы подробнее можно посмотреть пример1 или пример2 LUKSом можно шифровать и домашнюю директорию пример Есть и другие варианты - ECryptfs или EncFS они все очень похожи по замыслу как и 2,3

Ответ 2



Насколько предположил из написания текста: удаленные компы - это бездисковые станции, или в старой терминологии "терминалы". Т.к для загрузки они получают образ системы с сервера, то и доступ к месту хранения указанных Вами данных у них отсутствует. Предполагаю, что эти конфиденциальные данные есть суть информация для серверных демонов для идентификации терминалов. Следовательно, необходимо правильно настроить доступны для тех папок, куда могут ходить терминальные станции на сервере

Ответ 3



На платах 1U Supermicro есть хедеры под USB. Адаптеры под них стоят порядка $5, плюс флешка. Как уже сказали в другом ответе, LUKS умеет брать пароли с флешки. Конечно, флешку можно забрать вместе с диском, но это вопрос решается с помощью эпоксидки. Сами кейсы тоже стоит опломбировать и запретить договором их вскрывать. Более экзотическим вариантом будет зашифровать диск какими-то другими данными, например, серийным номером материнской платы, но это так себе вариант так как скрипты получающие этот пароль не будут зашифрованы, можно будет их посмотреть, спокойно получить пароль и расшифровать. Аналогичный трюк можно сделать с флешкой. Так или иначе всё сводится к физической безопасности устройства. Другим вариантом будет ручной ввод пароля после перезагрузки, или же разблокировка отдельного раздела тоже вручную. Опять же, систему можно доработать до перехватки этого пароля в момент ввода, что не то чтобы очень хорошо.

понедельник, 23 декабря 2019 г.

Шифрование функций в проекте

#шифрование #метапрограммирование #самомодификация


Собсно сабж, кто сталкивался, как реализовать?

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


Ответы

Ответ 1



Самомодификация и шифрование кода идут друг с другом. Посмотрите пример самомодификации кода. Возможно пригодится полиморфный генератор.

Ответ 2



Такие фишки можно делать только когда есть виртуальная машина, на уровне которой инструкции зашифрованы или как-то модифицированы и потом в ходе выполнения дешифруются в инструкции процессора. Или как вариант когда есть специализированный процессор, который шифрует/дешифрует инструкции на лету. Такие спец.процессоры любят ребята из гебешных структур - вам туда :) Если рассматривать ситуацию попроще, то такой морфинг на лету можно делать на Java с кастомным загрузчиком классов - статья здесь P.S. Это конечно же не совсем морфинг, поскольку под "настоящим" морфингом я бы понимал хаотичную самомодификацию кода на лету. Это так сказать статический морфинг кода.

среда, 18 декабря 2019 г.

Скрытие кода *.exe-файла

#шифрование #обфускация #дизассемблирование #обратная_разработка


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

Строки, например, можно просто XOR-ить или смещать каждый символ на k позиций по
таблице ASCII (первое лучше, ИМХО). А вот как скрыть имена функций или даже целые блоки
кода? Ведь многие разработчики (особенно вирусописатели) любят это делать, тем самым
скрывая свои «творения» от исследования посторонними лицами. Таким же образом скрывается
от антивирусов всем известный SpyEye. А как этого добиться мне?
    


Ответы

Ответ 1



(Некоторое время не занимался реверсингом, поэтому информация может быть outdated) Если говорить о серьезной обфускации, то имеет смысл рассматривать только языки, которые компилируются в машинный код (C++, например). Языки с промежуточным слоем байт-кода обычно легко поддаются реверсингу и, судя по всему, пока нет более-менее адекватных способов запротектить написанные на них приложения. Адекватные протекторы совершают некоторую последовательность действий для защиты готового приложения от реверсинга: Вставляют в готовый бинарник готовые антиотладочные фрагменты кода (например, дешифрующий его в рантайме), путают секции, совершают хитрые джампы, в общем, совершают атомарные изменения (не меняющие поведение программы!) над исполняемым кодом, которые затрудняют отладку человеку. Человек - это reverse engineer, который открывает ваше приложение в IDA, зрительно выцепляет знакомые паттерны из дизассемблерного листинга, трейсит приложение, подменяя содержимое стека и патча это самое приложение в его рантайме. И основная цель этих защитных действий протектора - заставить реверсера сказать "Тьфу, пошло оно в ж*пу, задолбало", поскольку последовательность действий протектора всегда можно совершить в обратную сторону, был бы опыт и знания. Более серьезная защита, иногда останавливающая даже крутых и опытных реверсеров - это виртуализация кода приложения для того, чтобы исполнять его на собственной виртуальной машине (обычно сочетается со стандартным антиотладочными приемами, описанными выше). При этом виртуальная машина внедряется в бинарник вместе с некоторым IL-кодом, который может выглядеть абсолютно произвольно. Параметры создаваемой машины также можно варьировать в некоторых пределах - при желании можно и виртуалку с троичной логикой написать. Бонус такого подхода в том, что для полноценного реверсинга такого приложения необходимо каким-либо образом воспроизвести эту самую виртуальную машину. В такой ситуации (если виртуалка оказывается достаточно хитрой), большая часть стандартных тулзов и приемов реверсера перестает работать "из коробки". Что, опять же, приближает этого самого потенциального реверсера к состоянию "Спасибо, с меня хватит". С точностью до деталей таким образом протектит Themida. В соответствии с написанным выше - если есть желание запротектить свою программу более-менее достойно, то напишите свою виртуалку и сгенерируйте для нее IL-код из имеющихся объектных файлов вашего приложения. Это действие поможет отсеять большую часть реверсеров, которым недавно рассказали и показали, что такое IDA и как применять patch. Quick test - для того, чтобы понять, сможете ли вы создать более-менее адекватную защиту с виртуализацией, попробуйте сломать CrackMe от ESET. Если поймете, причем здесь SSE и общую механику проверки, то можно браться за дело. Всегда есть набор готовых public и private пакеров, которыми можно воспользоваться. Themida, ASProtect, FSG. Понятно также, что всегда найдется набор людей, которые эти или иные протекторы в состоянии снять.

суббота, 14 декабря 2019 г.

Как правильно сгенерировать ссылку для восстановления пароля?

#безопасность #php #отправка #шифрование #восстановление


Здравствуйте!
Пишу скрипт восстановления пароля для сайта. 
Принцип работы следующий:

Пользователь вводит email
Получает письмо
Проходит по ссылке
Вводит новый пароль

Но я не знаю как защитить ссылку, которую отсылаю на email и что вообще можно и нужно
в ней передать!!
Подскажите пожалуйста, как можно это реализовать?
Пока додумался до такого варианта:
Получаю Email, проверяю есть ли он в базе.
Затем логин, пароль, email беру в одну строку, кодирую в md5().
$str = md5($login.$pass,$email);

Отправляю письмо со ссылкой: www.сайт.ru?getPass=$str
Далее я так понимаю, нужно создать базу данных, чтобы туда поместить $str, ведь когда
я её получу ?getPass=$str , мне надо будет её сравнить...
Ну а в таблице соответственно указать дату, чтобы например через сутки удалить, если
пользователь не перешел по ссылке.
Ну вот, я бы сделал так, но мне хотелось бы чтобы более опытные программисты подсказали
как лучше    


Ответы

Ответ 1



Да, Вы правы, $str можно сгенерировать случайным образом, я в общем сделал следующее: закодировал строку в md5()? создал базу данных в которую поместил это значение, и когда пользователь проходит по закодированной ссылке, я сверяю её с базой данных, и если есть совпадения, выдаю форму для заполнения нового пароля!!!

Ответ 2



А я бы создал отдельную табличку или дополнительные записи. Например табличка Pass_recovery с полями user_id, access_hash, expires. user_id - id юзверя (внешний ключ) access_hash - произвольный md5() или sha1() хэш доступа, любой, пусть даже md5(time()) expires - например 1 час с момента запроса на восстановление пароля Потом на email слать ссылку типа: www.site.com?=recovery_id=$user_id&recovery_hash=$access_hash Скриптом по recovery_id мы быстро находим из таблицы Pass_recovery значения и сверяем recovery_id == user_id и recovery_hash == access_hash. Быстро, так как это по идее должен быть индекс в таблице! Если проверка успешная то предлагаем юзверю ввести пароль прямо на сайте. После этого очистить accessHash в таблице.

Ответ 3



$str = dechex(time()).md5(uniqid($email)); md5(uniqid($email)) - защита от подбора dechex(time()) - защита от коллизий хешей Для дополнительной защиты в базу также сохранять и при проверке ссылки сверять IP адрес клиента и возможно User Agent браузера.

воскресенье, 8 декабря 2019 г.

Какие есть алгоритмы шифрования изображений, устойчивые к трансформации?

#фурье #fft #изображения #wavelet #шифрование


Какие есть алгоритмы шифрования изображений, устойчивые к изменению размера изображения,
поворотам на углы, кратные 90 градусам?
Т.е. зашифровал исходное изображение - оно на себя не похоже, набор узоров, загрузил
на фотохостинг, где его в т.ч. уменьшили. Взял уменьшенный вариант, и тем же ключом
расшифровал в уменьшенную копию исходной картинки. Есть такие решения?
В идеале — вообще зашифровали - распечатали - сфотографировали на мобильник распечатку
- дешифровали в исходное, пусть такого же уменьшенного разрешения и плюс искажения
перспективы. Т.е. решение, не привязанное жестко к пикселам, и к точным значениям цветов/яркостей.
Upd. как шаг к анонимности интернетов в эпоху тотального контроля государств и корпораций,
имеет смысл добиваться такого вида зашифрованного изображения, что автоматическими
методами сложно провести его связь с исходником. Т.е. например, гистограмма зашифрованного
никак не должна кореллировать с гистограммой исходника. Например, если порезать картинку
на блоки и переставить их местами, гистограмма никак не изменится. Если канал инвертнуть,
гистограмма его просто отзеркалится. Поэтому, повторю, интересно услышать тех, кто
работал с FFT (быстрое преобразование Фурье) и вейвлетами.    


Ответы

Ответ 1



UPD [2013-02-07] Новый алгоритм «Chan» Не оставляет меня в покое эта тема. Написал новый алгоритм шифрования. Алгоритм работает очень долго, посему просьба не тестировать на больших картинках и набраться терпения: кнопки «Encrypt» и «Decrypt» понимают с первого раза, не стреляйте в них очередью. Примеры: Оригинал Зашифрованное изображение Расшифрованное изображение Расшифрованное с неверным паролем Основан на преобразовании цветов пикселей, но работает весьма неплохо, на мой взгляд. Недостатки: шифрование слишком слабое; перебо́ров за 10–20 можно подобрать такой пароль, который даст представление о содержании изображения (хотя цвета могут быть искажены) JPEG-компрессия сказывается на расшифрованном изображении (появляется рябь), поэтому на тестовой странице я выдаю результат в PNG очень много коллизий ключей очень медленно, необходимо оптимизировать Положительные черты: устойчивость к любым трансформациям (кроме цвета), будь то поворот/разворот или даже посторонние данные, например: Исходное: зашифрованная ранее картинка находится на нормальной (к примеру, фото плаката с изображением зашифрованной фотографии) Расшифрованное: зашифрованная картинка «распаковалась» Есть идея добавить свойство (bool) loseless, в зависимости от которого алгоритм и, соответственно, результат, будет меняться: при loseless = on – будет работать как сейчас; при loseless = off – шифрование будет значительно надежнее, но с потерей двух цветов: 0xFFFFFF станет 0xFFFFFE, а 0x000000 – 0x000001 (то есть, и в зашифрованном и в дешифрованном абс. белый и абс. черный будут отсутствовать). Или можно не заморачиваться и прописать loseless = off как единственный вариант. @sergiks, а у тебя как дела с этой задачей? ----------------------------------------------------------------------------------------- UPD [2013-01-30] Новая версия алгоритма «мозаика» Доделал вот прототип: http://image.lotoflot.com/mosaic_crypt.php Выдерживает повороты кратные 90 град., но с изменением размера беда: очень сильные искажения после дешифровки. Удачный пример Оригинал Зашифрованное изображение Расшифрованное изображение Лавина хорошая благодаря md5. Ключ внутри функции раскладывается на составляющие, каждый из которых хешируется. Для нормальной работы нужен массивный набор данных (а не 2-3 символа), поэтому решил не изобретать и подключить md5. Параметр Pieces определяет, на сколько кусков в обоих направлениях (X, Y) будет порезана картинка. Чем больше значение, тем больше блоков. Обычно лучше устанавливать значение в диапазоне 10—30 для картинок размера 300—2000 px. Я как-то давно на PHP начал писать класс-прослойку для GD. Так вот эти функции шифровки/дешифровки я запихнул в класс расширения этой прослойки, так что код будет слегка запутанным. Но если все же заинтересует, могу поделиться.

Ответ 2



Конкретных алгоритмов не скажу, но наверняка они есть. Наверное надо копать в сторону именно графической шифровки, к примеру поставить точки которые организуют квадрат чтобы уйти от зависимости от ориентации картинки, и внутри этого генерировать данные которые представляют исходную картинку. самое тупое - например точка 2x2 или 3x3 - 1, нет такой точки - 0. Можно наверное более сложно придумать - яркая точка начала, от неё рисовать примитивы - линия под углом - определённый набор битов (например угол задаётся исходным куском битов, цвет каждой следующей линии - следующая пачка данных) ну и т.д. Ваша задача - графически представить нужные вам данные - как - простор для фантазии. Так же можно использовать тупо набор известных вам однозначно обратимых фильтрах (сдвиги, повороты и т.д.) которые Вы применяете в определённом порядке, а для расшифровки - в обратном (например картинку сдвигает на 10 пикселов, поворачиваете на 15 градусов, сдвигаете на 3 пиксела вниз, инвертируете цвета, сдвигаете цвета на 20, меняете каналы местами и т.д.).

Ответ 3



Я бы посоветовал копать в сторону стеганографических трюков с изображениями, когда модифицируется наименее значимый бит (LSB) пикселя или что-то подобное. Обзор некоторых из таких методов здесь Наиболее перспективный для вас метод на мой взгляд это redundant pattern encoding, то есть когда шифровка размещается не по всему изображению, а дублируется в нескольких частях (pattern), так что при обрезке изображения останутся кодированные куски из которых можно будет восстановить сообщение. Теперь рассмотрим способ восстановления исходного шифросообщения после изменения размера изображения (паттерна). Здесь может помочь один из алгоритмов избыточного кодирования, например метод Хамминга или что-то подобное. Благо таких способов довольно много, надо просто задаться процентом сколько бит надо уметь восстанавливать из потерянных - это чуть ли не целая отрасль математики.

Ответ 4



Почему вы так быстро отказались от шифрование данных каждого пикселя независимо друг от друга? Изменения размеров и артефакты сжатия такому методу не страшны. Я, обдумывая ту же идею, склонен предполагать, что можно найти достаточно устойчивый (к взлому) шифр. Но так как в области криптографии моих знаний ноль, с этим вопросом я и пришёл сюда.

Почему при шифровании TLS используются именно простые числа?

#алгоритм #безопасность #ssl #шифрование #криптография


Почему при шифровании TLS, да и вообще в криптографии используются именно простые
числа? Почему бы не использовать любые? 
    


Ответы

Ответ 1



Одна причина в том, что легко умножить 2 большие простые числа, например 393050634124102232869567034555427371542904833 * 170141183460469231731687303715884105727 дает сразу 66874100049762646240147492397977579549553083399872470020691839934725993584071278591 (Python, < 0.2 секунд), no обратное сделать (разложить большое число на простые числа) практически не возможно - нет общего достаточно быстрого алгоритма (см. Алгоритмы факторизации.) Вообще это работа на несколько лет даже для супер компьютеров.

Ответ 2



TLS допускает использование различных протоколов шифрования и обмена ключей. Разные протоколы используют простые числа по совершенно различным причинам: RSA Один из самых популярных протоколов шифрования, RSA, основывается на том, что задача факторизации числа - разложение составного числа на простые множители (скорее всего), не разрешима с полиномиальной сложностью на обычных компьютерах (но разрешима за полиномиальное время на квантовых, криптоапокалипсис грядет). Т.е. если у вас есть два огромных простых числа p и q, то тот, кто знает только n = p * q, проведет достаточно много времени, пытаясь разложить n обратно на p и q. Естественно, есть оговорки, позволяющие отсечь известные субэкспоненциальные алгоритмы, например, p и q должны отличатся порядком хотя бы на пару разрядов, но в общем случае можно считать что большие p и q сделают решение задачи факторизации n дико долгим. При этом, найти два больших простых числа - достаточно легко. Так что использование больших простых чисел - это способ получить огромное и тяжело факторизируемое составное число. RSA описывает подбор/генерацию чисел e, d, n, таких, что для любого значения m будет справедливо: Способ генерации предполагает выбор n = p * q, e = 65,537 (или любому другому небольшому числу). Т.е. они находятся быстро. Пара (n, e) - это публичный ключ. Доказано, что если взять в качесте d результат решения уравнения ed = 1(mod ϕ(n)), то тройка (e, d, n) будет отвечать требованию выше. ϕ(n) - это функция Эйлера - равная количеству натуральных чисел, меньших n и взаимно простых с ним. Для ее нахождения нужно факторизовать n. Т.е. если вы знаете только (n, e), то поиск d решением этого уравнения займет вечность. Но при этом φ(p) = p − 1, φ(q) = q − 1. И для простых p и q: φ(n) = φ(pq) = (p − 1) * (q − 1). Так что вы берете два больших простых числа, быстро вычисляете φ(n) и n, получаете d из уравнения выше. Простые числа и φ(n) выбрасываете и никому не показываете. (n, d) - это ваш приватный ключ, и узнать его, зная только (n, e), ни у кого не получится за разумное время. После этого любой, у кого есть ваш публичный ключ может зашифровать для вас сообщение: А вот расшифровать его можете только вы: Из взаимозаменяемости e и d и одинаковости для шагов для шифрации/дешифрации следует второй способ применения RSA - только вы можете зашифровать известный текст так, что расшифровать его можно будет только с помощью публичного ключа. Если вы допишете к концу сообщения его чексумму, зашифрованную приватным ключом (получив при этом "электронную подпись"), то любой может посчитать ту же чексумму, "расшифровать" подпись, и сравнить два значения. Если они совпадут - значит сообщение дошло без изменений, и отправили его именно вы. Diffie-Hellman Протокол обмена ключами DH полагается не на сложность факторизации, а на сложность решения задачи дискретного логарифмирования. Он основан на том, что нельзя быстро вычислить ключ зная только ga, gb, g и p. Но при этом он легко позволяет сторонам вычислить этот общий ключ, переслав по открытому каналу ga, gb, если одна сторона придумает свое секретное a, а вторая - свое секретное b. Elliptic Curve Diffie-Hellman Даже основы эллиптической криптографии в один пост SO не влезут, так что стоит только упомянуть, что ECDHE так же полагается не на сложность факторизации, а на сложность решения задачи дискретного логарифмирования. Для задачи дискретного логарифмирования есть субэкспоненциальный алгоритм Полига-Хеллмана, позволяющий свести решение проблемы для n точек к подзадачам для множителей n - p1, p2, p3, p4. Соответственно, количество точек кривой выбирают таким, чтобы оно делилось на какое-то большое простое число p, сравнимое по длине с n. Т.е. простые числа в ECDHE используются только косвенно, в качестве "ограничителя простоты". Из этих же соображений значения p, g в DH накладываются соответствующие ограничения.

Ответ 3



На самом деле ничего суперсложного здесь нет. 1) TLS базируется на асимметричной криптографии, в каковой есть понятие приватного и публичного ключей 2) Если не вдаваться в математические тонкости асимметричной криптографии, навроде теоремы Эйлера, Ферма, Галуа и проч. мастодонтов то эти ключи (например, в алгоритме RSA) вычисляется на основе целых числе p, q (необязательно кстати и простых): PublicKey={e(p,q), p*q} //e(p,q) - некая целочисленная функция (публичная экспонента) PrivateKey={d(p,q), p*q) //d(p,q) - также некая целочисленная функция (приватная экспонента) грубо говоря, если знать эти 2 числа p, q то можно вычислить ключи. Теперь внимание, атакующему всегда известно их произведение p*q - из публичного ключа, который как явствует из его названия известен всем. 3) То есть чтобы дешифровать надо просто разложить некое число n на 2 множителя p, q. Задача называется факторизацией - алгоритмов масса, но в целом все очень печально (с точки зрения скорости). 4) Подходим к самому главному - ради чего весь цирк с конями и затевался: зачем требуется, чтобы p, q были простыми? Здесь есть 2 ответа: Функции e(p, q) и d(p, q) - работают не со всеми числами, то есть если подать им на вход непростое число, то функции могут не дать ничего. Зато если p, q простые то функции работают безупречно. Для усложнения факторизации n: разложение большого числа на простые сомножители усложняется с ростом длины числа как n*log(n), то есть вы раскладываете 1024 битовое число, то сложность грубо говоря будет 1024*2^1024, но если число вдруг окажется четным то его сложность составит уже 512*2^1023 - то есть вычислительная сложность упадет в 4 раза - соответственно простота гарантирует увеличение вычислительной сложности.

Ответ 4



Кажется разобрался с этой темой. На примере Диффи-Хеллмана. Чтобы найти ключ K, нужно решить уравнение K=g^a*b mod p, где "g", "p" - известно. Произведение простых чисел (очень больших) действительно сложно подобрать. И нужно использовать именно простые числа потому что нет базы данных среди больших простых чисел (а базы данных нет потому что нереально перебрать такие большие цифры), иначе бы это сильно ускорило решение задачи, как и со всеми числами. Но это в теории, а на практике серьезные взломщики вряд ли будут перебирать произведение 2-ух простых чисел. Т.к. чтобы найти секретный ключ K, можно решить и другое уравнение, которое тоже равно секретному ключу. K=B^a mod p, где "p" известно, а "B" можно перехватить (т.к. эта информация в незащищенном видео передается по сети). И тогда уже останется подобрать только "a". А если учесть, что "a" - как минимум нечетное и огромное (порядка 10^100) - отбросить на конце четные и диапазон слишком маленьких чисел. Хотя даже при всем при этом "a" замучаешься подбирать)

Ответ 5



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