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

За основу был взят шифр «Цезаря», суть которого заключалась в замене букв путём сдвига в алфавите на определённое число. Число это также является ключом, его вводит пользователь при шифровании.
Что же нам нужно? Был составлен массив ассоциаций букв и символов emoji. Для этого были написаны скрипт для парсинга всех emoji из Вконтакте и программа на Delphi для создания ассоциации путем случайного перемешивания смайликов, а также для дополнения их ссылками на изображения. На выходе получилось что-то подобное:
Кроме того был создан ещё один массив «сдвига». Внутри него содержались цифры от 0 до 9, которым также были присвоены уникальные символы. На самом деле можно было добавить больше цифр, это уже дело вкуса. Этот массив выглядит вот так:
Важное замечание! Возможно, вы заметили, что и в первом, и во втором массивах есть цифры 0-9. Для того чтобы различать их, нужно обязательно присвоить каждой уникальный символ, не встречающийся ранее. Это важное условие для работы всего шифра.

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











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











=> «hello world»
(отсюда не выходит скопировать шифр)
Функция дешифровки:
функция decodeEntities() нужна, чтобы преобразовать код emoji типа "" в символ. Также при сравнении букв мы складываем соседние элементы. Мне кажется причина здесь кроется в размере emoji, потому что только таким образом мы получим символ для сравнения (если попробовать вывести лишь один элемент по индексу, а не их сумму, то мы увидим пустоту).
К плюсам такого шифра можно отнести то, что его невозможно расшифровать методом «относительных частот», а также то, что ключ задает не пользователь, следовательно, сохранность шифра повышается.
Из недостатков – не все сайты «красиво» отображают шифр, если вообще его отображают. Мобильные приложения вообще выводят пустую строку место шифра (точнее сказать, так видит сообщение получатель, у отправителя будет строка из множества obj).
Простейшим улучшением будет являться увеличение массива «сдвига» или же добавления к каждой цифре внутри этого массива ещё одного уникального emoji символа.
Что имеем на данный момент: сайты почти всех социальных сетей адекватно отображают шифр. Мобильные приложения не очень дружат с ним. На андроиде emoji также имеют красивую обёртку. Иногда в процессе шифрования могут пропасть смайлики наподобие «:3», с чем это связано пока не выяснено.
Сам метод вы можете опробовать тут: emojicrypt.xyz
За основу взят шифр «Цезаря»: Wikipedia
Дизайн сайта сделан с помощью Material design lite: getmdl.io
Спасибо, что дочитали статью! Буду рад предложениям и замечаниям как по методу, так и по статье. И И








(добра вам).

За основу был взят шифр «Цезаря», суть которого заключалась в замене букв путём сдвига в алфавите на определённое число. Число это также является ключом, его вводит пользователь при шифровании.
Что же нам нужно? Был составлен массив ассоциаций букв и символов 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» =>












(отсюда не выходит скопировать шифр)
Сама функция шифрования выглядит вот так:
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]+'">';
}
}
}
}
Процесс дешифровки не намного сложнее. Для начала, в зашифрованной строке мы ищем символ «сдвига», сравнивая строку с массивом «сдвига». Когда мы его нашли, то переводим его в численное значение и делаем обратный сдвиг влево, только теперь уже символы заменяем буквами.
Пример дешифрования:












(отсюда не выходит скопировать шифр)
Функция дешифровки:
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
Спасибо, что дочитали статью! Буду рад предложениям и замечаниям как по методу, так и по статье. И И







