[Программа] Шифрование Диффи-Хеллмана на JavaScript

Тема в разделе 'Софт и технологии для обхода цензуры', создана пользователем Алексаня Тюрик, 21 июл 2016.

?

Есть ли смысл дорабатывать программу, или есть готовые решения давно?

  1. Очень интересная работа, только "ВПЕРЁД"!!!

    2 голосов
    100,0%
  2. Есть аналоги, которые давно выручают без этой программы.

    0 голосов
    0,0%
  1. Алексаня Тюрик

    Алексаня Тюрик Ч0ткий!

    Симпатии:
    16
    Репутация:
    0
    Мне удалось реализовать на JavaScript достаточно быструю генерацию закрытых сесионных ключей криптоалгоритма Диффи-Хеллмана (при 2048-битном модуле и 256-битной экспоненте на это требовалось около 10 секунд или менее - на настольном ПК с двухядерным 3 ГГц процессором).
    -
    Рабочую библиотеку функций с сопутствующими файлами я передал в общественное достояние и выложил на Гитхаб:

    https://github.com/michael-hock/skrasite

    Там в файле DHJS_rus.rtf - математические выкладки со всеми формулами, по которым я создавал вычислительный алгоритм, краткое описание функций и файлов. DHJS_eng.rtf - то же самое на английском языке.

    DH_JS_Test.htm - файл для демонстрации возможностей: он работает и за Алису, и за Боба, которые обманиваются открытыми числами и генерят одинаковые сессионные ключи.

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

    consts*.js - файлы с предвычисленными константами, позволяющими в несколько раз ускорить вычисление (2^a) mod P.

    const_gen.htm - генератор таких файлов с константами.

    Пока это открытая библиотека функций.

    Дальнейшее развитие проекта SkraSite мне видится в создании мессенджера, для которого не надо будет специальной программы на клиенте (как для Telegram и WhatsApp), а будет достаточно любого браузера. А серверная часть - PHP-файл, который можно "подкинуть" на любой веб-сайт на хостинге с поддержкой PHP. В отличие от JS, в ядре современного PHP уже есть встроенная математика больших чисел, на сервере с этим будет проще.

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

    Протокол Диффи-Хеллмана, в отличие от RSA, обеспечивает forward secrecy. Если на RSA кому-то удастся похитить или подобрать закрытый ключ - им можно расшифровать сессионные ключи в перехваченном трафике, а сессиоными ключами - и само содержимое сообщений. На DH такое не получится, поскольку никаких постоянных закрытых ключей нет, а сесионные не пересылаются даже в зашифрованном виде и окончательно уничтожаются по завершению сессий.

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

    Если у меня дальше не получится - надеюсь, другим программистам эта библиотека функций будет полезна.

    Источник (через TOR): lwplxb6ushy6x3yr.onion/viewtopic.php?id=10301
     
    Last edited by a moderator: 17 фев 2017
  2. fxkonferenco

    fxkonferenco New Member

    Симпатии:
    1
    Репутация:
    0
    А можно ли Вас попросить переделать эту программу для практического использования непосредственным пользователем так, чтобы Алиса отправляла свой промежуточный результат Бобу и продолжала вырабатывать общий ключ только после получения от Боба его промежуточного результата? А то сейчас в её нынешнем виде программу можно использовать только для генерации псевдослучайных последовательностей.
    И ещё три необязательные просьбы: 1) было бы неплохо итоговую экспоненту формировать не только из стандартного ГПВЧ, но и просить пользователя дополнить её своими случайными числами, 2) совместить обе html'ки в одну, чтобы пользователю не приходилось переименовывать файл констант из txt в js и прописывать его название во второй html'ке, 3) добавить возможность использовать генератор не только 2, но и ещё несколько других на выбор.
    Спасибо.
     
    Last edited: 26 янв 2017
  3. Roscenzura.com

    Roscenzura.com Администратор Staff Member

    Симпатии:
    185
    Репутация:
    0
    Так это не он сделал, это перекопирование материалов с Тора. Скачайте браузер Тор и перейдите по ссылке.
     
  4. fxkonferenco

    fxkonferenco New Member

    Симпатии:
    1
    Репутация:
    0
    К сожалению, это не возможно, так как в интернет я захожу с рабочего компьютера, а у нас администратор групповыми политиками ограничил права обычных пользователей на установку и выполнение дополнительных программ. Можно ли Вас попросить переслать мой первый комментарий на тот форум разработчику? Спасибо.
     
  5. fxkonferenco

    fxkonferenco New Member

    Симпатии:
    1
    Репутация:
    0
    Я нашёл программиста, который согласился переделать вторую страницу программы, скрипты которой согласовывают общий ключ. В тоже время первую страницу, которая генерирует промежуточные константы на основе выбранного модуля и указанной разрядности закрытого ключа, с библиотекой функций всё же нужно копировать с оригинального хранилища автора.
    Ссылка на переделанную страницу: http://any.clubmeteorology.ru/dh/ (советую её сохранить себе на винчестер, так как автор может в любой момент её оттуда удалить).
     
  6. fxkonferenco

    fxkonferenco New Member

    Симпатии:
    1
    Репутация:
    0
    Всем привет!

    Я переработал вторую страницу, ссылку на которую давал в предыдущем сообщении.

    Кроме украшательства, была добавлена возможность генерировать открытый ключ двумя способами на выбор: 1) из парольной фразы или 2) совершенно случайным образом. Это было сделано из-за того, что стандартный генератор "случайных" чисел Math.random инициализируется таймером компьютера, чьей энтропии крайне мало для реального практического применения.

    А теперь о том, как это работает. Парольная фраза инициализирует КСГПСЧ потокового шифра RC4, который генерирует гамму определённой в файле consts*.js длинны. Очевидно, что восстановить таким образом свой открытый ключ получится только в том случае, если используется тот же самый файл констант consts*.js. Также для экономии времени в этом же разделе интерфейса предусмотрена возможность восстановить из парольной фразы только секретную степень без дальнейшего подсчёта самого открытого ключа. Восстановление секретной степени из парольной фразы, безусловно, нарушает принцип perfect forward secrecy, однако может быть полезно для согласования общего ключа, когда получатель сообщения в момент его отправки не находится перед компьютером и не может согласовать общий одноразовый ключ. Делается это так: отправитель восстанавливает свою секретную степень (и, соответственно, свой долгосрочный открытый ключ) из своей парольной фразы, а для расчёта общего ключа шифрования использует долгосрочный открытый ключ получателя. В дальнейшем, когда получатель будет за компьютером, он сделает всё то же самое и точно так же посчитает общий ключ шифрования.

    Действительно случайный способ генерирования секретной степени позволяет в полной мере использовать perfect forward secrecy, так как случайные числа получаются "оцифровыванием" :) движений курсора мыши, что в дальнейшем никак повторить не удастся.

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

    КСГПСЧ из потокового шифра RC4 был взят только потому, что он на мой взгляд самый простой для реализации в коде. Если захотите, можете заменить его любым другим генератором на свой вкус. Только учтите, что парольные фразы в таком случае будут восстанавливать уже другие гаммы и, соответственно, уже другие открытые ключи.

    Ссылка на мою переделку: https://drive.google.com/open?id=0B2Mdz6DZW9qQSzNUX19MbUtrdUk Сейчас она настроена на 2048-битный модуль и 384-битную секретную степень. Если вы используете другой файл констант consts*.js, то измените это в своей копии моей переделки. Также даю ссылку на минимальный набор дистрибутива (генератор констант, файл констант, ядро с длинной арифметикой и мой интерфейс): https://drive.google.com/file/d/0B2Mdz6DZW9qQX2pDV1U4STVYLVE/view (дополнительно архив прикреплён к этому сообщению).

    Надеюсь моя работа будет вам полезна.
     

    Вложения:

Поделиться этой страницей