Как стать автором
Обновить

Шифрование с помощью Emoji

Время на прочтение9 мин
Количество просмотров58K
На очередной паре по «Информационной безопасности» преподаватель дал нам задание придумать собственный метод шифрования. В голову сразу пришла идея о довольном необычном (а может и нет) методе. Что из этого вышло, читайте под катом.



За основу был взят шифр «Цезаря», суть которого заключалась в замене букв путём сдвига в алфавите на определённое число. Число это также является ключом, его вводит пользователь при шифровании.

Что же нам нужно? Был составлен массив ассоциаций букв и символов emoji. Для этого были написаны скрипт для парсинга всех emoji из Вконтакте и программа на Delphi для создания ассоциации путем случайного перемешивания смайликов, а также для дополнения их ссылками на изображения. На выходе получилось что-то подобное:

Массив ассоциаций
а "✨","http://vk.com/images/emoji/2728.png"

б "❄","http://vk.com/images/emoji/2744.png"

в "🀄","http://vk.com/images/emoji/D83CDC04.png"

г "🃏","http://vk.com/images/emoji/D83CDCCF.png"

д "🆘","http://vk.com/images/emoji/D83CDD98.png"

е "🌂","http://vk.com/images/emoji/D83CDF02.png"

ё "🌍","http://vk.com/images/emoji/D83CDF0D.png"

ж "🌛","http://vk.com/images/emoji/D83CDF1B.png"

з "🌝","http://vk.com/images/emoji/D83CDF1D.png"

и "🌞","1450830870441041053935"

й "🌟","http://vk.com/images/emoji/D83CDF1F.png"

к "🌰","http://vk.com/images/emoji/D83CDF30.png"

л "🌱","http://vk.com/images/emoji/D83CDF31.png"

м "🌲","http://vk.com/images/emoji/D83CDF32.png"

н "🌳","http://vk.com/images/emoji/D83CDF33.png"

о "🌴","http://vk.com/images/emoji/D83CDF34.png"

п "🌵","http://vk.com/images/emoji/D83CDF35.png"

р "🌷","http://vk.com/images/emoji/D83CDF37.png"

с "🌸","http://vk.com/images/emoji/D83CDF38.png"

т "🌹","http://vk.com/images/emoji/D83CDF39.png"

у "🌺","http://vk.com/images/emoji/D83CDF3A.png"

ф "🌻","http://vk.com/images/emoji/D83CDF3B.png"

х "🌼","http://vk.com/images/emoji/D83CDF3C.png"

ц "🌽","http://vk.com/images/emoji/D83CDF3D.png"

ч "🌾","http://vk.com/images/emoji/D83CDF3E.png"

ш "🌿","http://vk.com/images/emoji/D83CDF3F.png"

щ "🍀","http://vk.com/images/emoji/D83CDF40.png"

ъ "🍁","http://vk.com/images/emoji/D83CDF41.png"

ы "🍂","http://vk.com/images/emoji/D83CDF42.png"

ь "🍃","http://vk.com/images/emoji/D83CDF43.png"

э "🍄","http://vk.com/images/emoji/D83CDF44.png"

ю "🍅","http://vk.com/images/emoji/D83CDF45.png"

я "🍆","http://vk.com/images/emoji/D83CDF46.png"

a "🍇","http://vk.com/images/emoji/D83CDF47.png"

b "🍈","http://vk.com/images/emoji/D83CDF48.png"

c "🍉","http://vk.com/images/emoji/D83CDF49.png"

d "🍊","https://habrastorage.org/getpro/habr/post_images/e83/65f/0bb/e8365f0bbf916dcd2feee82f85039a80.png"

e "🍋","https://habrastorage.org/getpro/habr/post_images/0d3/a7a/ff2/0d3a7aff2e3dc5d58c511f3c8d76f5d0.png"

f "🍌","http://vk.com/images/emoji/D83CDF4C.png"

g "🍍","http://vk.com/images/emoji/D83CDF4D.png"

h "🍎","https://habrastorage.org/getpro/habr/post_images/9f6/514/145/9f6514145586341507fdeb3419aadf96.png"

i "🍏","http://vk.com/images/emoji/D83CDF4F.png"

j "🍐","http://vk.com/images/emoji/D83CDF50.png"

k "🍑","http://vk.com/images/emoji/D83CDF51.png"

l "🍒","https://habrastorage.org/getpro/habr/post_images/6cf/2cd/60e/6cf2cd60e1966b7b22c0ede9c2569778.png"

m "🍓","http://vk.com/images/emoji/D83CDF53.png"

n "🍔","http://vk.com/images/emoji/D83CDF54.png"

o "🍕","https://habrastorage.org/getpro/habr/post_images/c8a/e3e/caa/c8ae3ecaa831341c53c06e637673b8c2.png"

p "🍖","http://vk.com/images/emoji/D83CDF56.png"

q "🍗","http://vk.com/images/emoji/D83CDF57.png"

r "🍚","https://habrastorage.org/getpro/habr/post_images/a08/8af/125/a088af1256132a32f51c851801f54503.png"

s "🍛","http://vk.com/images/emoji/D83CDF5B.png"

t "🍜","http://vk.com/images/emoji/D83CDF5C.png"

u "🍝","http://vk.com/images/emoji/D83CDF5D.png"

v "🍞","http://vk.com/images/emoji/D83CDF5E.png"

w "🍟","https://habrastorage.org/getpro/habr/post_images/71f/1b4/a98/71f1b4a989fbe225f56befde91b993c7.png"

x "🍠","http://vk.com/images/emoji/D83CDF60.png"

y "🍡","http://vk.com/images/emoji/D83CDF61.png"

z "🍢","http://vk.com/images/emoji/D83CDF62.png"

~ "🍣","http://vk.com/images/emoji/D83CDF63.png"

` "🍤","http://vk.com/images/emoji/D83CDF64.png"

! "🍥","http://vk.com/images/emoji/D83CDF65.png"

@ "🍦","http://vk.com/images/emoji/D83CDF66.png"

# "🍧","http://vk.com/images/emoji/D83CDF67.png"

$ "🍨","http://vk.com/images/emoji/D83CDF68.png"

% "🍩","http://vk.com/images/emoji/D83CDF69.png"

^ "🍪","http://vk.com/images/emoji/D83CDF6A.png"

& "🍫","http://vk.com/images/emoji/D83CDF6B.png"

* "🍬","http://vk.com/images/emoji/D83CDF6C.png"

( "🍭","http://vk.com/images/emoji/D83CDF6D.png"

) "🍮","http://vk.com/images/emoji/D83CDF6E.png"

_ "🍯","http://vk.com/images/emoji/D83CDF6F.png"

+ "🍰","http://vk.com/images/emoji/D83CDF70.png"

" "🍱","http://vk.com/images/emoji/D83CDF71.png"

№ "🍲","http://vk.com/images/emoji/D83CDF72.png"

; "🍳","http://vk.com/images/emoji/D83CDF73.png"

: "🍴","http://vk.com/images/emoji/D83CDF74.png"

? "🍵","http://vk.com/images/emoji/D83CDF75.png"

- "🍶","http://vk.com/images/emoji/D83CDF76.png"

= "🍷","http://vk.com/images/emoji/D83CDF77.png"

/ "🍸","http://vk.com/images/emoji/D83CDF78.png"

\ "🍹","http://vk.com/images/emoji/D83CDF79.png"

0 "🍺","http://vk.com/images/emoji/D83CDF7A.png"

1 "🍻","http://vk.com/images/emoji/D83CDF7B.png"

2 "🍼","http://vk.com/images/emoji/D83CDF7C.png"

3 "🎀","http://vk.com/images/emoji/D83CDF80.png"

4 "🎁","http://vk.com/images/emoji/D83CDF81.png"

5 "🎂","http://vk.com/images/emoji/D83CDF82.png"

6 "🎃","http://vk.com/images/emoji/D83CDF83.png"

7 "🎄","http://vk.com/images/emoji/D83CDF84.png"

8 "🎅","http://vk.com/images/emoji/D83CDF85.png"

9 "🎈","http://vk.com/images/emoji/D83CDF88.png"

"пробел"  "🎉","https://habrastorage.org/getpro/habr/post_images/06d/0e6/e96/06d0e6e961f1030a5916279e2c57755a.png"


Кроме того был создан ещё один массив «сдвига». Внутри него содержались цифры от 0 до 9, которым также были присвоены уникальные символы. На самом деле можно было добавить больше цифр, это уже дело вкуса. Этот массив выглядит вот так:

Массив сдвига
 0 "🎊","https://habrastorage.org/getpro/habr/post_images/e61/d22/668/e61d226683006faa0b5a75f5f24716ef.png"

 1 "🎋","http://vk.com/images/emoji/D83CDF8B.png"

 2 "🎌","http://vk.com/images/emoji/D83CDF8C.png"

 3 "🎍","http://vk.com/images/emoji/D83CDF8D.png"

 4 "🎎","http://vk.com/images/emoji/D83CDF8E.png"

 5 "🎏","http://vk.com/images/emoji/D83CDF8F.png"

 6 "🎐","http://vk.com/images/emoji/D83CDF90.png"

 7 "🎒","http://vk.com/images/emoji/D83CDF92.png"

 8 "🎓","http://vk.com/images/emoji/D83CDF93.png"

 9 "🎣","http://vk.com/images/emoji/D83CDFA3.png"


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


Итак, теперь у нас есть всё для шифрования исходного сообщения. Сначала мы найдём два числа: число «сдвига» (границы 0-9) и число «позиции» (границы 0-«длина исходной строки»). Оба они генерируются случайным образом. Первая цифра будет определять тот самый сдвиг букв как в шифре цезаря, а второе число – это позиция внутри строки, на место которой мы будем вставлять смайлик из массива «сдвига», который соответствует числу «сдвига» (простите за тавтологию).

Стандартно делаем сдвиг в правую сторону, но заменяем их уже не на сдвинутую букву, а на её emoji символ. Во время шифрования, при наборе результирующей строки, следим за моментом, когда нужно будет вставить emoji символ числа «сдвига». На выходе у нас получается строка из одних только смайликов. Здесь нас ждёт самая главная проблема, которая связана скорее с корректным отображением смайликов. Поскольку многие браузеры могут отображать прямоугольники вместо нужных нам символов (хотя распознаванию внутри кода это нисколько не мешает), то мы оборачиваем их в с соответствующими ссылками на изображения. Таким образом, получается довольно красивый внешний вид шифра.

Пример шифрования:

«hello world» => imageimageimageimageimageimageimageimageimageimageimageimage
(отсюда не выходит скопировать шифр)

Сама функция шифрования выглядит вот так:

var str = document.getElementById("text").value;
 var res='';
 var key = getRandomInt(0,9);
 var key_insert = getRandomInt(0,str.length-1) ;
 for (var i=0;i<str.length;i++){
     if (i==key_insert) {res = res+'<img alt="'+numbers[key][1]+'" src="'+numbers[key][2]+'">';}
       for (var j=0;j<cipher.length;j++){
	 if (str[i].toUpperCase()==cipher[j][0].toUpperCase()) {
	  if ((j+key)>cipher.length-1) {
	   res = res+'<img alt="'+cipher[(j+key)-cipher.length][1]+'" src="'+cipher[(j+key)-cipher.length][2]+'">';
	   } else {
	   res = res+'<img alt="'+cipher[(j+key)][1]+'" src="'+cipher[(j+key)][2]+'">';
	   }	   
	 }
	}
 }


Процесс дешифровки не намного сложнее. Для начала, в зашифрованной строке мы ищем символ «сдвига», сравнивая строку с массивом «сдвига». Когда мы его нашли, то переводим его в численное значение и делаем обратный сдвиг влево, только теперь уже символы заменяем буквами.

Пример дешифрования:

imageimageimageimageimageimageimageimageimageimageimageimage => «hello world»
(отсюда не выходит скопировать шифр)

Функция дешифровки:

function decodeEntities(encodedString) {
    var textArea = document.createElement('textarea');
    textArea.innerHTML = encodedString;
    return textArea.value;
}

var str = String(document.getElementById("text").value.toString());
 var res='';
 for (var i=0;i<str.length;i+=2){
   for (var j=0;j<numbers.length;j++){  
    if ( str[i]+str[i+1]==decodeEntities(numbers[j][1])) {var key = j}
   }
 }
 for (var i=0;i<str.length;i+=2){
    for (var j=0;j<cipher.length;j++){
	 if ( str[i]+str[i+1]==decodeEntities(cipher[j][1])) {
	  if ((j-key)<0) {res = res+cipher[cipher.length-(-1*(j-key))][0]} else {res = res+cipher[j-key][0]}
	 }
    }
 }

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

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

Из недостатков – не все сайты «красиво» отображают шифр, если вообще его отображают. Мобильные приложения вообще выводят пустую строку место шифра (точнее сказать, так видит сообщение получатель, у отправителя будет строка из множества obj).

Простейшим улучшением будет являться увеличение массива «сдвига» или же добавления к каждой цифре внутри этого массива ещё одного уникального emoji символа.

Что имеем на данный момент: сайты почти всех социальных сетей адекватно отображают шифр. Мобильные приложения не очень дружат с ним. На андроиде emoji также имеют красивую обёртку. Иногда в процессе шифрования могут пропасть смайлики наподобие «:3», с чем это связано пока не выяснено.

Сам метод вы можете опробовать тут: emojicrypt.xyz
За основу взят шифр «Цезаря»: Wikipedia
Дизайн сайта сделан с помощью Material design lite: getmdl.io

Спасибо, что дочитали статью! Буду рад предложениям и замечаниям как по методу, так и по статье. И И (добра вам).
Теги:
Хабы:
-15
Комментарии24

Публикации

Изменить настройки темы

Истории

Работа

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн