Сам себе Телеграм

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

Пред­по­ло­жим, надо тебе сек­рет­но отпра­вить фото­гра­фию чего-нибудь дру­гу. Я взял фото­гра­фию пути­на. Нет, не того Пути­на, кото­рый Вла­ди­мир Вла­ди­ми­ро­вич, а пути­на, кото­рый наци­о­наль­ное канад­ское хрю­че­во. Но не суть. Пере­дать таким обра­зом мож­но что угод­но, хоть диа­грам­мы под­ры­ва Крем­ля. Ну да, мож­но исполь­зо­вать вся­кие там запа­ро­лен­ные RAR-архи­вы (по сути явля­ю­щи­е­ся сим­мет­рич­ным шиф­ро­ва­ни­ем), но воз­ни­ка­ет про­бле­ма с обме­ном клю­ча­ми для дешиф­ров­ки. Как ты будешь сооб­щать пароль собе­сед­ни­ку? По теле­фо­ну? Он про­слу­ши­ва­ет­ся. По элек­трон­ной почте? Она пишет­ся. А если у тебя уже есть без­опас­ный канал для пере­да­чи подоб­ных дан­ных — зачем мучать­ся с RAR? Поэто­му не будем мело­чить­ся, и сде­ла­ем всё, как у боль­ших.

У вас обо­их сто­ит Линукс с уста­нов­лен­ным паке­том OpenSSL. Даль­ше чисто дело тех­ни­ки, и при­мер­но всё то же самое дела­ет и сам мес­сен­жер Теле­грам, про­сто сама рабо­та алго­рит­мов от тебя скры­та. Эда­кий Про­то­кол Диф­фи — Хелл­ма­на, толь­ко в пол­но­стью руч­ном режи­ме.

Твой собе­сед­ник дол­жен:

Создать пару публичных/приватных RSA клю­чей:
openssl genpkey -algorithm RSA -out private.key.pem -pkeyopt rsa_keygen_bits:4096

Выта­щить пуб­лич­ный ключ и запи­сать его в файл:
openssl rsa -pubout -in private.key.pem -out public.key.pem

При­слать содер­жи­мое public.key.pem (оно тек­сто­вое) тебе, напри­мер, обыч­ной поч­той (*). Раз­гла­ше­ние пуб­лич­но­го клю­ча нико­му ниче­го не даёт — для дешиф­ров­ки нуж­на его при­ват­ная часть.

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

Схо­ду зашиф­ро­вать несим­мет­рич­ным алго­рит­мом RSA боль­шой файл, не раз­би­вая его на мел­кие кус­ки невоз­мож­но, коман­да
openssl rsautl -encrypt -inkey public.key.pem -pubin -in poutine.jpeg -out poutine.jpeg.enc
выда­ёт ошиб­ку о том, что раз­мер дан­ных слиш­ком боль­шой для дан­но­го клю­ча дли­ной 4096 бит. Но всё, что мень­ше 4096 — 11 бит, зашиф­ро­вать мож­но. Поэто­му дела­ют так: созда­ют ключ для сим­мет­рич­но­го шиф­ро­ва­ния, напри­мер, AES или Twofish — это уж кому что милее — им коди­ру­ют файл, а уже сам ключ несим­мет­рич­но шиф­ру­ют пуб­лич­ным клю­чом, и пере­да­ют его собе­сед­ни­ку в коди­ро­ван­ном виде вме­сте с дан­ны­ми.

Дела­ем слу­чай­ный ключ для сим­мет­рич­но­го шиф­ро­ва­ния:
openssl rand 256 -out symm.key

Шиф­ру­ем фото­гра­фию пути­на алго­рит­мом AES256 с этим клю­чом:
openssl enc -aes-256-cbc -salt -in poutine.jpeg -out poutine.jpeg.enc -pass file:./symm.key

Шиф­ру­ем сам ключ алго­рит­мом RSA:
openssl rsautl -encrypt -inkey public.key.pem -pubin -in symm.key -out symm.key.enc

Теперь у нас есть два шиф­ро­ван­ных фай­ла, в одном дан­ные, шиф­ро­ван­ные AES256, в дру­гом — шиф­ро­ван­ный ключ к AES256.

Что­бы послать это по обыч­ной почте, пере­ве­дём все бинар­ни­ки в текст коди­ров­кой Base64.

cat poutine.jpeg.enc | base64
cat symm.key.enc | base64

Текст при­сы­ла­ем наше­му собе­сед­ни­ку.

Фсе. Теперь ни одна живая душа, без вла­де­ния при­ват­ным клю­чом, не смо­жет ниче­го про­чи­тать. И всё дела­ет­ся эле­мен­тар­но, на колен­ке. В‑общем, «тер­ро­ри­стам», кото­рых яко­бы гоня­ет Рос­ком­ге­ста­по, бло­ки­ров­ка Теле­ги не пре­гра­да совер­шен­но. Ну, а стра­да­ют, как обыч­но, непри­част­ные.

PS: Един­ствен­ный спо­соб пере­дать госу­дар­ству клю­чи для дешиф­ров­ки сооб­ще­ний — это на эта­пе гене­ра­ции у кли­ен­та несим­мет­рич­ных клю­чей сли­вать при­ват­ную часть «кому надо». Т.е. это надо спе­цом встра­и­вать такую функ­цию в кли­ен­та. А кли­ент Теле­ги — опань­ки — опен­сорс­ный. Встав­ка подоб­ной функ­ци­о­наль­но­сти будет мгно­вен­но засе­че­на.

Поэто­му сам запрос на полу­че­ние клю­чей — нелеп и сме­хо­тво­рен. Я могу отдать толь­ко то, что у меня есть.

PPS: Нын­че мод­но нена­ви­деть Рос­ком­ге­ста­по за то, что они дела­ют. А меж тем пре­тен­зия не по адре­су. Кто создал Рос­ком­ге­ста­по? Кто при­нял зако­ны, по кото­рым он рабо­та­ет? Кто под­пи­сал эти зако­ны? И кто, вооб­ще, выбрал всех этих людей?

* В реаль­ных при­ме­не­ни­ях пуб­лич­ный ключ ещё допол­ни­тель­но под­пи­сы­ва­ет­ся цен­тром сер­ти­фи­ка­ции, кото­ро­му дове­ря­ют оба участ­ни­ка — ина­че сооб­ще­ния воз­мож­но пере­хва­тить, и клю­чи под­ме­нить, устро­ив ата­ку типа «Чело­век посе­ре­дине».