Привет, Хабра! Тему шифрования личной переписки обсуждали уже много раз. Но по факту я не нашел ничего более менее вменяемого, чем бы мог пользоваться без геморроя. Поэтому написал свое расширение для соц. сетей с покером и куртизанками. Поскольку сегодня пятница, первая половина поста состоит из веселых историй с картинками. Во второй части — немного проблем и способов их решения.


Зачем нужно шифрование


История о любви



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

История о ревнивом муже



Сережа пишет Юле стихи о любви. Юля отвечает взаимностью. Кирилл грустит. Он муж Юли и что-то подозревает. Вскоре он прочтет переписку Сережи и Юли, и устроит ББПЕ своей жене. Юля могла бы съехать с темы и избежать ББПЕ, если бы больше знала о шифровании.

История об алиби



У Толика очень насыщенная жизнь. Как-то, в переписке по интернету, Толик хвастался своими приключениями. Теперь за эти приключения Толику могут предъявить. Этого могло бы не быть, если бы он шифровал свои подвиги.

История о массовых беспорядках



У Леши активная гражданская позиция. Леша любит собирать друзей и устраивать шумные собрания на городской площади. Гостей на эти собрания Леша приглашает через интернет. Программист Артём посмотрел все личные переписки, и быстро понял, кто является организатором массовых гуляний. Теперь у Леши проблемы. Он мог бы избежать их, если бы шифровал свои сообщения.

История об истеричке



Света прислала сообщение Глебу. Но Глеб встречается с Лидой. Глеб отошел в туалет, и забыл мобильник. Лида прочла сообщение Светы. Примерно через минуту Лида закатит скандал.

Как работает шифрование


У Тимура есть чемодан и ключ. Он передает пустой чемодан своему другу Саше.


У Саши тоже есть свой чемодан и ключ. Он делает их копию, и прячет в чемодан Тимура.


Т.к. назад чемодан возвращается в закрытом виде, открыть его может только Тимур. Только у Тимура есть ключ от его чемодана.


Тимур открывает свой чемодан и достает оттуда копию чемодана и ключа Саши.


Теперь Тимуру больше не нужен свой чемодан и свой ключ. Он может пользоваться теми, что ему передал Саша.


Примерно так работает алгоритм шифрования RSA. А вот так выглядит быстрая расшифровка криптостойкого алгоритма с использованием терморектального криптоанализатора.


Техническая сторона вопроса


В качестве алгоритма шифрования выбрал RSA. Несмотря на то, что алгоритму около 30 лет, первые попавшиеся библиотеки на JS оказались крайне плохого качества. Такое ощущение, что их писали исключительно для одного проекта. С трудом и болью смог приспособить их под нужды своего проекта, хотя задачи были типовые:
  • Сгенерировать ключи
  • Зашифровать текст открытым ключом
  • Расшифровать текст закрытым ключом


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

Проблемы парсинга соц. сетей


Начал с вконтакта. Первая трудность — на каждый диалог создается свое поле ввода и поле отображения сообщений. Проблема решилась получением id собеседника.

Далее нужно было перехватить нажатие кнопки «Отправить» и кнопки Enter. Проблема в том, что вконтакт первый вешает события, и лишь потом инициализируется плагин. Чтобы исправить ситуацию добавил свои обработчики на document.body, а после фильтровал все перехваченные события. Нужно было первым получить их, чтобы успеть заменить оригинальное сообщение шифрованным.

Сайт одноклассники показал, что этого не достаточно. Максимальная длина сообщения у них составляет 3000 символов, а шифрованная пара ключей имеет длину 3800. Кроме того, обычные сообщения так же становятся длиннее за счет преобразования в base64. Пришлось написать механизм, который бы разбивал сообщения на части, подписывал их (id, текущий индекс, общее количество частей), а после собирал обратно. Получилось что-то вроде пакетов в TCP/IP.

Далее нужно было научиться генерировать событие «Отправить сообщение», т.к. скрипту нужно было самостоятельно отправлять пакеты. В вконтакте проблема решилась очень просто, через вызов глобального метода IM.send(). Чтобы добраться до области видимости сайта из области видимости расширения, пришлось добавлять тег SCRIPT и прописывать туда строкой вызов метода. Пример:
<script>IM.send()</script>

Тут следует пояснить, что DOM на сайт и расширение один и тот же, а глобальная область видимости — разная. В одноклассниках аналогичный метод найти не смог. Ребята минимизируют код и не плодят глобалы. Пришлось эмулировать событие на кнопке «Отправить»:
var event = new Event("click", {
	bubbles: true,
	cancelable: true
});
button.dispatchEvent(event);

Когда текст был зашифрован, разбит на части, отправлен и собран, нужно было отличать новые и старые сообщения, которые отображаются на сайте. И вконтакте, и в одноклассниках они подписываются датой или уникальным id… думал я… Я ещё никогда так не ошибался. После этого возник «плавающий» баг. Оказалось, что все эти метки могут, так или иначе, совпасть для двух разных сообщений. Поэтому стал присваивать свой атрибут для всех DOM-узлов, чтобы знать кто уже обработан, а кто нет.

Но чудеса на этом не закончились. Одноклассники публиковали сообщение, далее я его подменял расшифрованным, потом происходила какая-то магия, и через несколько миллисекунд одноклассники вновь писали оригинальный текст тот же HTML-элемент. Пришлось делать клон ноды сообщения, писать туда расшифровку, и скрывать оригинальный элемент. Оригинальная нода скрывалась (display: none), но не удалялась, т.к. я не знал, как и зачем её переписывают. Была опасность поломать скрипт одноклассников в случае удаления HTML-элемента.

Последняя загадка парсинга соц. сетей заключалась в том, что если с одного компьютера логинилось несколько людей, то их пары ключей для диалогов нужно было сохранять в разные места. Проблема решилась через извлечение ID текущего юзера. Знание ID юзера, сделало возможность создания персональных записей в localStorage:
rsa_keys__326374454
rsa_keys__43234223
rsa_keys__113234753
...

Интересные наблюдения:
  • Вконтакт и Фейсбук не сжимают CSS. В данный момент я затачиваю плагин и под фейсбук, и когда увидел в коде отсутствие id`шек и именование CSS-классов в стиле «l4y», опешил. Первая мысль была такая: «Они генерируют названия классов, следовательно, логика моего парсера рухнет на ближайшем обновлении и пересборке сайта.». Как оказалось, не рухнет. На ряду с короткими названиями, так же попадаются весьма длинные (например, «mdialog_chat_add-comment»). Видимо, у них в штате тоже есть говнокодеры, которые придумывают неочевидные и непонятные говно-названия.
  • Несмотря на высокое качества кода одноклассников и закос под SPA-приложение, ребята не используют роутер и URL-страницы не меняется. Поэтому кнопка «назад» не работает, а о том, что сейчас отображается на экране, приходится догадываться из состояния DOM-дерева.
  • Фейсбук, единственные, кто поленились писать крутое поле ввода. Только у них стоит обычная textarea, в которой все смайлы отображаются кодировкой, а не картинкой.

Если я смог вас развеселить или заинтересовать, прошу на сайт http://bakhirev.biz/demo/crypto/. Там небольшая инструкция, ответы на вопросы и ссылка для установки. Буду рад баг-репортам, и новым пользователям.

UPD:
1. Я заменю алгоритм шифрования.
2. Во вторых, очень много критики. Мне кажется не все так плохо, и я готов первому кто расшифрует переписку скинуть 500 руб. на мобильник.
Текст переписки под катом

Миша	
PUBLIC_KEYMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCM/+5vvOmEGeT24elRMpufB96z08birItibPBsWBxDXiw8Xd9jXY3CajYGZuzsQaG8Dz/kVZeVEdNJO7suFzASTD6/BUrU4V2GmclJSyKzMdE/t6CIhlycYFBGPjJ6fKrouJte9Srb2DeMtiHfO2MDcbqsAW+A72URxi7iizdeeQIDAQAB

Алексей
TRANSFER_MESSAGE_Eai_0_2_TRANSFER_SESSIONUP5HfAnxle/n0Ndw7Cog6q3A6UcMNFumk6+Xx7BbD69kA9OkEY2LNMyCgctkT7zymfwt7pKxkdjqItBsCwi69nR+ETNYvY/BxoBvlk3pO3lHWnA7wpSpqoQTUfnZR7Z4RxyDRT9x2xzbqk4/8u0mqaT6XXe2mCodUgTiF8gI4UU=OJ9xoowTR4NnpTEwln+5R49fr2zAHmWSZ4Q05QExzOBmUU0pr/IZF+My2s3fvfoga9B4ItDKqicr012ZCRpEp98BHodiazBzKrcTxKE4e4UfTHMWyKxujFKEbmZDxh0sBQp5AnJay85MzV3vnLh6TXBVIy5ENPa4LXOPvrmaBCs=QwbB5skTxnw1M+VjRESs+7abY8te4dMI4yfC4bKIS/1h7vaO8rHYA9lSYTwF5ca86OQr6l8tfWFuIdSrSNIV3EIYtdEfO4KjtJV7yUAg0B9KVTsNiaGYHRKHIsXxo/S6R5leUTVahAvbkcy/VGreOnPhzXwhhtfkW7VYKGUKJY8=VP+CHx0759rNcXh5naBiTHS3QY4nQuQsKqy/K6a54+IaENO2zRDejFmIDBLCQhEvjrZNLlb2ZypdaE3VbHR+rhtddElpQlCzhT7GqtgBPfc9f+AROjOWxS+XM/z/dpZKdlPAH39cR4y7xToNyYWcFy+8kujwG7DNfD2i8TuwRvo=abrJ2Pgrmc+sokIvQXmpzxBbsyerEMxzVUjm3V7MRCVZsH58unWeZZoV2oqq+zn+TojZzG4VLPbwsEhZqp7Fium64L68NBpu1czkSxougZRszHumR8nb5FQnyYONxb4EbYxi0BeRsmAD7pPJfJLPwtGPnoZ4Rygpci38ck4pMvc=iBGSIP6hwUUJwiuoySCu4SJSjRk50Gp5UvThQ5wOkRb1PWyE8nh5TZ58tn/RYUDsMOFhst8hGzV2sKJFIerUEGlkZASd8HyEJnHOoAgXaRBBKznh0sY4diNTu8YeZY/d1UDSC8oBfjDojPY7HHotIoKAfh57lwYQjJo96DmG4r4=WLiFUhtVH1qU4ARdU6m4lHLqujAmmiz5t/UnpK0r7kofcDUe0+mfXkwFWBjf7frxrDy6AgLy0gArvMbO21c89lI+B7si6z3EDGNRXmTo0IuggyymILlednIb1xpSIbR2p2/mJ3LNV5JFE0260JeirrmMW70w96FVkYxlJO8fgww=Sygre8lWBThQ7ayWUSj5N2JdkDYzxrvtRUNH+IgS6H2Kciy8gVDHP8gtxlhJ9bsX21Nvf99La9R4kK08kKM4LBmXfPPbTOIdMEnJi+WVI7X76+e482+nxaaITLps7bx9CKOZv+JA8n7a7OmnFK5gaRAj25eOdjXHvEjbLX/c97o=JxEmDYkF3WIca0Zkem+Ow82ZkXPlz8Ol+vnERUnsFv9pUN3usPzXILFOECOECFaJkSFwN1+JhVrSA9MvMNNWgxSMgFOLapBRlD7Mxj8ln0fPfzaD9vzq5BWUkYq0UJztsfbPeErM6unQJCZEbxEEMsLhJKyIqzpqqyMG5XdOmp8=Pi5g7MbR8+TkMzdHWRvJBXmeHu5kplJPMA+KcOu1g/WsHMyUcBM82C6XUVh9PZrb38TMeeCmT1P/cd3KzMBNWMBKDvtLDn+lCCbN2rKuTDydIcteHG1EETh5pVqysxLw8zJvh7dnpaxdEXV8BxKLF+hC2nTU/y4wJ0kaoqNMYjA=KnuQ0a2Y/nkOQadDpDJQLUpDErzGkIOb6R+J0ypHnBLXvaRriZeBE8BTjvZjw62nD6iiOJMcJwgLYzmKYW0w26nGqed4YHsApw68MZbff/cx5YT1J0vcpeLtzBLiqqnOKqj1X36A/PhST2uUzb0lAQ2ZIH2aHecaHL7r26gIqxc=ecijZEZq1U6EQI96OXEGlvl4kkfbGsAexvLuZjoqymLvNpQtTyYc7prkpdbMjWOTeBm5F8eP9WBnKkhPNCYdqAiLFFDO6956lVs8He5z4nhRLa0SUD+xeOiHkez79aZnxVRDFqykL5CPYLvQR8UlkoKpS+1UHMbPtYYtC1LPOTY=G1DtexU5oW9ZPb2Rw9ufcO0wYXlCKD6lbWd/BRpzRoJnqrgRF3ATtBjdXmv9i3NjkB81IjZQed61scsmsZbYBWCNHEnPkA5VLr2dk/p8MINf8JPX0vPFLeFx6NweQRtAt9XySNpTWQ1t7/SUjh2s9sIem86d1KWuB+v07p6APBo=GvdcZwMrNN+P1SP1IaZg58KGZPn6hmzcn3bn2dE3LrdHvskI+tr2wfCXrzYeQqkd++D6MH/X33nmv78S4To/mEVO/4zIgpgqtJF+TGMpdvrV++YzqhAc9P8C3H9ALNbAy6uZlZv0m23JduIf/x8qOKzlZnr2vqL0ri2CsqIsklo=bigcqz2eKfMo2jfvgmiboYHmR0C5xhV+UATxTL6C7i7tvpBrIcvr6jUsh5kVFmAIC3SC7AcFYgIg671bb018gkH9RIue3l8H9qeX0qeZD59k7Y6ikhxR/oLiWz2iefkPV+WhL/CyBQT6EHW+XDECttRBmwAgdXhKxj9SFitOYAU=EBANVUsCv8J35tScX+dCnc8PUSCP2RK5r3B7CPq1Un8ftZyEzxk2AssIN9w1d9Li8r8Pm/GXlI6A+ZLg2PuO8cSleqps3d8Q0ofIZH6Tfn9HgtLc2uqWibvorDHQP0azYcDgBlH2N3HUT5Mkia4bDvT0NxWMrtCLxsEyYRF1Ad4=LSTVKU1c3FeOa2tOjERcEU9YufPmkJZgmwO835Ai6uq5vlUFBGv1veG5SNClhhZojP8dJ6IUwsjfgy61WXN8hJjg3axRlNq1/SVFRfjd58gBkjbyQhDbIxit7szbtln+/OnNjp/DIJ2NlONIfY+hDtEyyymd6tKYRSN9rSm2W30=W059Cemh+YVE1hSLA4SkRqRJzA4JQvlhwRmsbeYXM15GVdnioTFga2Utrn7Y

TRANSFER_MESSAGE_Eai_1_2_pNCHkLzZEfqSIgJslILKt7jsifDeXIDxsoBApZq+qBohs4yqlxaBi4uiQ8WMo+FNIXM6nXAzh2BgcUbwJu/+ldLpNt4QWKFDOTRr/DH7wh36ffU=SpL416TlTVI50yom99kriA/MTFaSNDXgLo9f8yTrRo0BOrr+VagrV350PL9+Bn/7mLyLDyx/0/ovGyevDH1L6SJq1n5fiM3A9ZViJ+vBOv+70mq/1Y849P7hjJ+yPCez3iWv2DDNNNOM6Ma3WSmzr8qv7CbZ4Y7d8UZxbM2UsM8=BkJImbxMZzZRL8wOGn4N/AUKdtosETq4/JGSOy0Fe4S2rgRiihPvF3LrYXOfBmwE0FU4DplFCxL/J96wBiJiu9OjxJzpxiFdZOVtYZgBMiMHshrXa8L5sBS/68pStS0XNMdk/J0x5ofr4cf4En52AzLlcqWYPlKUnIbB/wur9F4=aJ7EURVaBpLz5VZwe9bDJbcMCbh8QB2wpvP4+NA8twWS3IEglOeb0vcIj9rdgSrs1cqPWWUGFUR5QwA8ECZYwqckCdtNCn8Pfb0v3QS6kOT+oRbXEvN6QYPOj3+6qLtfIqcVc6IhomGxniK3rlawxn1aY7vqnkuwT0Qi3O1UeM8=YB9mhkNQw9U0RUtd4BtDEWgA0VYG11HRJkzv92R6s6BTtHZse0XJtV4vy2Cip8p4e7X7Bwc5RQykUz2+CpwjGZPamclCKTGw8g7gLKShxRoxENIkO5Cn2nWRpoifDHwak63jA7syEBaqEFDYbrFqz7yXubdfQPwc4ccrqwPhoZw=

PRIVATE_MESSAGEcjmEpu+ousBCSiRcbTS+oSAfFnGu12uLkyky03nHCbqB9IFS+tZmiWc3yecV+AMyhBrBL44+ATfhiCwLuyqpj9p2oc1ErEQJMBwBN1rP4rHBbBOEYPTQVuNGYyhmGmgBim14e16W415mG7HH7eBd2rG37xYGmfWr9eU/vchCqCs=IUF4xEb/hFXKNtda4SAZMm5DfJPclEWjYSPfSFAlPv/EnC+ICFj4D7rV6Kw+Kpix7xPojNSrZ+L52F3Mb+XOQAGrp9s5j8Awm90nMK4L9pzBWiGqWMDjTQdnUFMbkHGL8xnNAKsq8M0mMttPOl5T+9fJhupXP/Uc9gsaEL5qfIk=

Миша
PRIVATE_MESSAGEPgGdNyh4tKBzMe4AaK2BP6wU8p82ytPjSUGkWT8Ucojqjc8BuwOIhWQauDvrXP9C0q2blAssTRwCOKQ8fFyjgYwSQi9b+N3CZsJzwWmoi5knscemAfHW4Q79vEeVmoryXMxAlUoGPFHh39yUg1EhviGB/O1v6NjiGXb9iMhZSCs=

Алексей
PRIVATE_MESSAGEYa4AsB547nhGYr/DtENkKdqY9B/RgQD4mI9ODmI0b7qjcAp6rV4SwwwbSfg/XQR0glbuXvn5dl1INDl/DozlR1w+KCC4VYwbgb2mSJo2zNuysGgp20fXgsipl2CFYVpJ/7CZLAgFyBMhSz8O5lkzdupclypvafA3RCfVYVug2h4=

Миша
PRIVATE_MESSAGEIHukJXVYnhaiC7CKQD/7mgMsdiq0DppsFogmTcxpDdQODp5aaFK7Z8a2QVjlfRbbvIKvZrLOPfokufw7rOtpRniXyB6dFVM86a4TVuwHeCX49mDR6d+rll/4d3A7bqNwa0Lc4HcJu+jYu7vGdsPOnIHRfIdz37jL9HHhHh59Pp0=

Алексей
PRIVATE_MESSAGEQ6iHAdMjb7JZTzxn1hRBY0KI3hA99b1EEIHHAXbi6IQJo4vtnJ99JUHpgQi58cCYSRBnTI6ogbmx3cZjZwruV5rx3vzHtnWjMVxd3Il/67K+Zfyj5YAFGonhPNQmyof+kCT/Wqmy8/hPjBRCe7M1eXXMkdMc4ZautZSZ/n9ocLs=

PRIVATE_MESSAGEehGaLyCU7+EOXd2LWQnUsKKwSyYU+JXiY3UeEkazNZ3blkWvlJ9jhpnz/fmX6LnAD2rDd+/CxiPwyt2gn3SkR8l2LcsUoMpjKvkj8WmWWCqChRUfi5Q6ETDqnw5uCQMfYsHSOD1fGcAuZ+/DxazqtmHwub9lJXhJq4gpcHfcJaI=

Комментарии (51)


  1. m1el
    29.05.2015 11:17
    +7

    Мило, но бесполезно.

    Вконтакт может передавать сообщения на сервер до того как сообщение будет зашифровано, и приватность идет лесом.


    1. bakhirev Автор
      29.05.2015 11:24
      +2

      да, но:

      • Если мой аккаунт угонит некий Вася Пупкин, прочесть личные сообщения он не сможет.
      • У меня теперь есть кнопка «Удалить сообщения», которая сотрет ключи у меня и у собеседника (например девушки). А значит, среднестатистическая мадам гарантированно удалит личные сообщения, если мне будет нужно (на самом деле, это наверное самая важная функция, т.к. вконтакт удаляет сообщение только у одного из собеседников).


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


      1. m1el
        29.05.2015 11:33
        +8

        > которая сотрет ключи у меня и у собеседника

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

        > всегда можно вывести человека в лес

        Я говорю о чисто технических слабостях алгоритма и протоколов.

        Прочитав исходный код, я понял, что у автора нет понимания свойств RSA.


        1. bakhirev Автор
          29.05.2015 11:40
          -2

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

          Значит это не среднестатистическая девушка / пользователь. И, возможно, не стоит вообще писать ему лишнее.
          Прочитав исходный код, я понял, что у автора нет понимания свойств RSA.

          Можно более подробнее? RSA я не писал, а использовал чужую библиотеку. Если она плоха, можно ее заменить.


          1. m1el
            29.05.2015 11:42
            +5

            Например, что RSA не используется как блочный алгоритм.
            Поэтому в библиотеке не встроено разбиение сообщения на блоки.

                    /*
                     * Ебанная хуйня, пишу костыли, т.к. разрабы либы ПИДАРАСЫ
                     * Либа должна сама текст на куски разбивать, а она нахуй посылает и пишет Лимит для RSA превышен.
                     */
                    _getSmallBlock: function (message, limit, callback) {
                        var length = message.length,
                            count = Math.ceil(length / limit),
                            textBlock = "";
            
                        for (var i = 0; i < count; i++) {
                            var from = i * limit,
                                to = from + limit,
                                part = message.substring(from, to);
            
                            textBlock += callback(part) || "";
                        }
            
                        return textBlock;
                    },
            


            1. bakhirev Автор
              29.05.2015 11:47
              -5

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

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


              1. m1el
                29.05.2015 11:50
                +3

                > Но тут не про блоки. Тут длинный текст, который нужно зашифровать открытым ключом.

                Но то что здесь изобретается и есть *блочное шифрование*. :)


              1. vibornoff
                29.05.2015 13:08
                +5

                Unpadded RSA? Похоже, вы опасно некомпетенты в криптографии.

                Рекомендую использовать для шифрования симметричный блочный шифр, например AES, а его ключ уже шифровать с помощью RSA по схеме RSA_OAEP.

                У меня в либе все это реализовано, и работает довольно шустро.

                Если есть вопросы, пишите в личку — проконсультирую.


                1. hellman
                  29.05.2015 13:16
                  +9

                  Вроде там PCKS1.5 используется. Он конечно тоже взломан, но не так печально как совсем без паддинга. Ну а автор действительно некомпетентен, раз не понимает даже при чем тут блоки. Видимо поэтому большая часть статьи — картинки не по теме.

                  PS: я больше угорел по тексту на http://bakhirev.biz/demo/crypto/#!view=how_works:

                  Примерно так работает алгоритм шифрования RSA. Ключ, конечно, можно подобрать или расшифровать. Но на этой уйдет 2^32 попыток. Это очень много, и для этого нужно очень много мощных компьютеров, которые будут работать несколько дней. Т.к. ключи могут меняться в ходе переписки, то задача становится еще более трудоемкой.


                  И вроде бы не 1е апреля…


    1. svd71
      29.05.2015 13:16

      не в курсе о возможности разработки для Вконтакт, но разве там нельзя внедрить свой Javascript, в котором проводить кодирование до того, как будет отправка данных на сервер и декодирование после чтения с сервера?

      PS: тоже не совсем давно занимался подобным вопросом. Правда задача немного стояла другая: шифрация/дешифрация сообщений. Например информацию для соединения с каким-либо сервером, хранящихся статически в почтовом ящике, которая требуется раз в пару месяцев, но не хотелось бы ее потерять. Или в гуглевских таблицах и документах.Кодирование и декодирование производится в браузере клиента, без отправки по сети. Если кому интересно, то тут: https://svddevelop.com/crypt/


      1. DarkByte
        01.06.2015 10:30

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


  1. Meklon
    29.05.2015 11:18
    +21

    Иллюстрации прекрасны)


  1. maximw
    29.05.2015 11:40
    +8

    Фейсбук, единственные, кто поленились писать крутое поле ввода. Только у них стоит обычная textarea, в которой все смайлы отображаются кодировкой, а не картинкой.
    Всегда считал это достоинством ФБ, что они забили на смайлы и прочую разметку, только plain text.


  1. malyshev
    29.05.2015 11:52
    -4

    Это лучшее объяснение RSA с иллюстрациями, которое я видел


    1. hellman
      29.05.2015 13:30
      +4

      Во первых иллюстрировано не шифрование с помощью RSA, а обмен ключами. Во вторых, либо я неправильно понял аналогию, либо тут ошибка: если чемодан — публичный ключ, а «ключ» — приватный — то Саша не должен посылать обратно свой ключ, только чемодан.

      А вот это предложение вообще ерунда какая-то:

      Теперь Тимуру больше не нужен свой чемодан и свой ключ. Он может пользоваться теми, что ему передал Саша.


      Шифрование бы выглядело так:
      1. Тимур даёт Саше чемодан (публичный ключ)
      2. Саша кладет туда сообщение и захлопывает, отдаёт обратно.
      3. Тимур открывает ключом чемодан и читает сообщение.


      1. k0ldbl00d
        29.05.2015 14:15
        +3

        Ощущение что пытались объяснить DH, но суть не передали.
        p.s. ник у вас тематический )


  1. vaboretti
    29.05.2015 13:10

    Мне кажется, нужно код браузерного плагина выложить на гит, например. Полезная штука же, подтолкнет развитие.


  1. dinikin
    29.05.2015 13:10
    +1

    На сколько я понял, вы создаете один приватный ключ на все диалоги пользователя.
    Предположим, вы общались зашифрованными сообщениями с Васей и Петей, и Петя внезапно оказался сотрудником ФСБ.
    И вот Петя появляется у вас на пороге с группой поддержки. а так как он не лыком шит, он заранее выписал приватный ключ на листик.
    И даже если вам удастся каким-то чудом добежать до своего компьютера и удалить свой приватный ключ у себя и у Васи, и даже у Пети, это всё равно не помешает Пете расшифровать всю вашу переписку.
    Если я не прав, поправьте.


    1. hellman
      29.05.2015 13:19

      Ваш приватный (для дешифровки) ключ только у вас. У Пети ваш публичный ключ, им можно только шифровать. Так работает ассиметричная криптография.


    1. bakhirev Автор
      29.05.2015 13:22

      вы создаете один приватный ключ на все диалоги пользователя.

      Нет, на каждый диалог — свой приватный ключ
      если Петя внезапно оказался сотрудником ФСБ.

      Если он сотрудник ФСБ, то знать ключи ему не обязательно. Переписку взломают с помощью терморектального криптоанализатора


      1. faiwer
        29.05.2015 14:39

        Переписку взломают с помощью терморектального криптоанализатора
        К насильственным методам не будут прибегать без особой необходимости.


    1. mayorovp
      29.05.2015 13:28

      (сообщение удалено)


  1. akubintsev
    29.05.2015 13:14
    +1

    > История о любви

    Автоматический лок по таймауту и собственный ноутбук решают проблему.
    Также черным по белому обычно пишется в регламентах, что использовать технику компании в личных целях запрещено.
    У меня такой проблемы нет.

    > История ревнивом муже

    Я не на стороне Юли с Сережей))
    У меня такой проблемы нет.

    > История об алиби

    Толику надо научиться чтить закон.
    У меня такой проблемы нет.

    > История о массовых беспорядках

    У Лёши не будет проблем, если организованные им гуляния не нарушают с законы.
    У меня такой проблемы нет.

    > История об истеричке

    Подальше от таких дур держаться надо, если на ровном месте скандал.
    У меня такой проблемы нет.

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


    1. spyderDFX
      29.05.2015 13:23
      -4

      Лихо вы всех в преступники записали


    1. meft
      29.05.2015 15:31
      +3

      Зря минусы.
      > История о любви
      1. блокируйте комп, так как данная переписка может оказаться мелочью по сравнению с тем, что могло быть унесено. Например дамп готового проекта, который через 1-2 недели должен пойти в релиз.
      2. Коллеги, читающие переписку одного из своих, уже не являются коллегами. Этот пример покажет, что в организации нет команды.
      > История об истеричке
      тут правильнее сказать, что нужно держаться подальше от таких, кто лезет в твой телефон без твоего разрешения.

      Тут скорее примеры не удачные. Или же это пропаганда измен и нарушений с предоставлением инструмента это скрыть.

      Кстати, объясните пожалуйста, как это шифрование поможет в первом случае, если Миша ушел домой, оставив включенным комп, где на экране уже отображается расшифрованный текст?


    1. kentaskis
      29.05.2015 16:34
      +3

      Однажды инженер Чжа Вынь обратился к Учителю:
      – Один достойный уважения человек сказал мне, что шифровать электронную почту неправильно. Поскольку честному человеку нечего скрывать, шифрованная переписка неизбежно привлечёт внимание Охранительного ведомства. Учитель, что вы об этом думаете?
      Инь Фу Во ответил:
      – Благородный муж имеет чувство стыдливости. Он закрывает одеждой свою наготу. Вовсе не потому, что лицезрение другими принесёт ему ущерб. Но такова воля Неба, и таков ритуал. Честному человеку есть, что скрывать.


    1. Antelle
      31.05.2015 12:57

      Примеры хреновые, просто. Мне тоже они показались какими-то мерзкими.
      > В очередной раз убедился, что шифрование нужно только в промышленных нуждах и преступникам.
      Я искренне надеюсь, что это был троллинг с целью намекнуть автору, что надо бы найти примеры получше.


  1. impwx
    29.05.2015 13:19
    +6

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


    1. mayorovp
      29.05.2015 13:31

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


  1. Scratch
    29.05.2015 13:26
    +5

    Иллюстрации 5, шифрование кол


  1. mayorovp
    29.05.2015 13:33

    Почему RSA? Почему не ECDH?


    1. bakhirev Автор
      29.05.2015 13:55

      т.к. я

      … опасно некомпетенты в криптографии.

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


      1. ivlad
        29.05.2015 15:23
        +2

        Попробуйте библиотеку js-nacl или tweetnacl-js.

        C crypto_box api сложнее сделать столько ошибок. Прямо в README.md есть пример использования. Не вызывайте, пожалуйста, криптопримитивы самостоятельно, если не знаете, зачем.


  1. MichaelBorisov
    29.05.2015 14:20

    Автор, а вы как-то решаете проблему Man-in-the-middle Attack?

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

    Если шифровка RSA представлена как C = M^e (mod n),
    где C — шифротекст, M — открытый текст, e, n — публичный ключ, то:

    Если вычислить C' = C*(M1)^e (mod n)
    где M1 — желаемая модификация открытого текста, C' — модифицированный шифротекст, при этом C,e,n известны злоумышленнику — то при расшифровке шифротекста C' легитимным пользователем получим результат:
    M + M1
    иными словами, злоумышленник может модифицировать сообщение так, что при расшифровке к открытому тексту (который был неизвестен злоумышленнику) будет прибавлено произвольное, заданное злоумышленником, число.


    1. bakhirev Автор
      29.05.2015 14:25

      Никак. Эта атака нецелесообразна для сайтов соц. сетей. Проще достать с localStorage ключики, или угнать уже расшифрованный текст с интерфейса.

      При любой атака и защите от неё нужно прежде всего рассматривать рентабельность. Маловероятно, что кто-то будет сильно замарачиватся с расширением, у которого 3.5 пользователя.


      1. MichaelBorisov
        29.05.2015 14:58

        Эта атака нецелесообразна для сайтов соц. сетей

        Кто вам такое сказал? Атака (Man in the middle) очень легка в реализации, когда общение и обмен ключами проходят через сервер, подконтрольный атакующему.
        Маловероятно, что кто-то будет сильно замарачиватся с расширением, у которого 3.5 пользователя.

        Это неправильный подход при разработке криптографических решений. Фактически вы полагаетесь на принцип «неуловимого Джо». В чем тогда смысл применения сильных шифров, вроде RSA? С тем же успехом вы могли зашифровать сообщения чем-нибудь попроще, простой ксоркой с фиксированным ключом. До тех пор, пока атакующий не прореверсит ваш плагин, и такой шифр, скорее всего, не будет взломан.


        1. mayorovp
          29.05.2015 15:08
          +2

          Сервер соцсети — слишком большой узел, чтобы быть подконтрольным коллегам Миши, ревнивому Кириллу — или истеричке Лиде.

          Опасаться такой атаки надо Толику и Леше — но на первого не смогут провести MitM-атаку еще до того, как он похвастался — а значит, дела не будет — а нет дела, нет и ордера на атаку.

          Лешу же вычислят в любом случае, независимо от алгоритмов шифрования.


    1. hellman
      29.05.2015 14:28
      +1

      Только M * M1 а не M + M1. Ну и библиотека, которую использует автор, использует PKCS1.5 паддинг так что эта модификация идёт лесом (но на PKCS1.5 есть куча других атак, нужно использовать OAEP).


      1. MichaelBorisov
        29.05.2015 15:02

        Да, вы правы, M*M1. Перепутал школьную формулу умножения степеней, позор на мою седую голову.


  1. trueClearThinker
    29.05.2015 15:05
    +1

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

    Два вопроса:
    1. Где почитать исходники?
    2. Почему не использовали готовую для таких случаев реализацию: OTR (все, что вам пришлось бы сделать — реализовать внедрение)? Если знакомы с ней, чем не понравилась?


    1. bakhirev Автор
      29.05.2015 15:59
      -4

      1. Исходники можно почитать, если установить плагин и открыть панель разработчика (F12) или посмотреть папку хрома, в которую он установится. Выкладывать на github смысла не вижу.
      2. Про OTR не знал.


  1. spanasik
    29.05.2015 17:20
    +1

    Кто рисует такие клёвые картинки?


    1. bakhirev Автор
      30.05.2015 21:50

      Рисует Артем freelance.ru/gambolpuddy
      Переходим, пишем ТЗ, заказываем.


      1. spanasik
        31.05.2015 07:15

        Спасибо!


  1. bulbazaur
    29.05.2015 20:39

    Я просто оставлю это здесь.


    https://tox.im/


  1. Slavenin999
    30.05.2015 15:17

    В качестве библиотеки для шифрования использую у себя cryptojs. Лучше неё не встречал.

    Ну и ещё вопрос, а как прочитать сообщение, которое мне когда-то прислали и которое было зашифровано?


    1. bakhirev Автор
      30.05.2015 21:52

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


  1. DarkByte
    01.06.2015 14:29
    +1

    Кстати, facebook сегодня анонсировал pgp шифрование для исходящей почты.


  1. MadRogue
    02.06.2015 09:09
    +1

    А почему не Протокол Диффи — Хеллмана для обмена ключами? В инете есть даже видео с объяснением на пальцах, как оно работает.

    зы: Лёха, неужели ты вконтакте зарегался? О_о


    1. bakhirev Автор
      02.06.2015 10:34

      Т.к. взял первое, что под руку попалось. Если количество установок увеличится — буду менять алгоритм.

      зы: таки да :3


  1. netvolart
    03.06.2015 17:41
    +1

    Сорри, но когда Кирилл увидит, что Юля переписывается с Сережей да еще и шифрует это. ББПЕ не избежать).
    Идея и статья классные.