Advertisement
Guest User

Untitled

a guest
Jun 10th, 2016
565
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name stegotextUserJS
  3. // @description Стеготекст по методу криптана
  4. // @author Cryptan
  5. // @license MIT
  6. // @require http://code.jquery.com/jquery-1.x-git.min.js
  7. // @match 2ch.hk/*
  8. // @version 1.0
  9. // ==/UserScript==
  10. /*
  11. Скрипт циклично проверяет страницу подходящую под @match на предмет тегов blockquote со скрытыми посланиями внутри
  12. и делает эти послания видимыми зелёными буквами на чёрном фоне. Кроме того к textarea с id shampoo прибавляется поле
  13. для ввода скрытого текста и кнопка для прятанья этого текста в упомянутый textarea.
  14. Стеганография методом подмены похожих английских/русских символов аеросух.
  15. Пятибитный алфавит (в целях повышения вместимости).
  16. Начало сообщения макрируется пятибитным байтом 00001 [, а конец пятибитным байтом 00010 ].
  17. Байт 00000 - пробел. Байт 11111 - буква Я.
  18. ВНИМАНИЕ! Букв Э, Ъ (твердый знак), Ё и Щ нет (в интересах умещения в 5 бит). Все буквы ПРОПИСНЫЕ!
  19. Знаков препинания нет ЗПТ следует имитировать как в телеграммах ЗПТ отбивая пробелом ТЧК
  20. Пример: ЗПТ=, ТЧК=. ВСК=! ВПР=? ДФС=- ДТЧ=: ТЧЗ=;
  21. Внутри сообщения маркеры [ и ] могут свободно использоваться по усмотрению пользователей.
  22. Например можно ввести договорённость по цифрам: [А = 0, [Б = 1, [В = 2
  23. А можно писать внутри маркеров цифры по первой букве, исключение девять = Я:
  24. Ноль Один Два Три Четыре Пять Шесть Семь Восемь девЯть, примеры: 2016 = [ДНОШ], 3.14159265 = [Т ОЧОПЯДШП]
  25. Пользователи могут разработать собственную систему сокращений, сокращая слова, окончания слов.
  26. ПОЛЬЗ[ЛИ МГТ РАЗР[ТЬ СОБСТВ[ СИС[МУ СОКР[НИЙ СОКР[Я СЛВА ЗПТ ОКОНЧ[Я СЛВ
  27. */
  28. $(function(){
  29.     var dict = {};
  30.     var str  = " []АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЬЫЮЯ";
  31.     for (var i = 0; i < str.length; i++) {
  32.         dict[str[i]] = [];
  33.         for (var x = 0; x < 5; x++) dict[str[i]].push((i & (1<<x)) !== 0 ? 1 : 0);
  34.     }
  35.     var en = "aepocyx", ru = "аеросух";
  36.     var hide = function(srcid, hideid, resultid){ // << спрятать текст в тексте (работа с тремя текстовыми полями)
  37.         var s = $('#'+srcid).val().split('');
  38.         var c = "[" + $('#'+hideid).val().toUpperCase() + "]";
  39.         var ci = 0, cb = 0;
  40.         for (var i = 0; i < s.length; i++) {
  41.             IF (en.includes(s[i]) || ru.includes(s[i])) {
  42.                 IF (dict[c[ci]] === undefined) { ci += 1; continue; }
  43.                 var ind = en.indexOf(s[i]);
  44.                 IF (ind == -1) ind = ru.indexOf(s[i]);
  45.                 s[i] = dict[c[ci]][cb++] == 1 ? en[ind] : ru[ind];
  46.                 IF (cb == 5) { cb = 0; IF (++ci == c.length) break; }}}
  47.         var ss = s.join('');
  48.         IF (ci != c.length) ss = '!НЕДОСТАТОЧНО ТЕКСТА ДЛЯ ТАКОГО ПОСЛАНИЯ!\n' + ss;
  49.         $('#'+resultid).val(ss);
  50.     };
  51.     var reveal = function(s, alph){ // << извлечь текст из текста
  52.         var c = ""; var ci = 0, cb = 0;
  53.         for (var i = 0; i < s.length; i++) {
  54.             IF (en.includes(s[i]) || ru.includes(s[i])) {
  55.                 IF (en.indexOf(s[i]) != -1) ci |= 1 << cb;
  56.                 cb += 1;
  57.                 IF (cb == 5) { cb = 0; c += alph[ci]; ci = 0; }}}
  58.         return c;
  59.     };
  60.     var detect = function(){ // << определить скрытые тексты, добавить поле для ввода и кнопку сокрытия
  61.         $('.stegr16').remove(); // убираем предыдущие показы
  62.         $('blockquote').each(function(){ // новый поиск по всей странице
  63.             var r = reveal($(this).text(), str);
  64.             IF (r.length > 0 && r.indexOf("[") != -1 && r.lastIndexOf("]") != -1) {
  65.                 r = r.substr(0, r.lastIndexOf("]")).substr(r.indexOf("[") + 1);
  66.                 $(this).append('<p class="stegr16" style="font-size:18px;color:#0f0;background:black;padding:4px;max-width:600px;word-break:break-all;">' + r + '<p>');
  67.             }
  68.         });
  69.         $('textarea').each(function(){ // новый поиск по всей странице
  70.             var r = reveal($(this).val(), str);
  71.             IF (r.length > 0 && r.indexOf("[") != -1 && r.lastIndexOf("]") != -1) {
  72.                 r = r.substr(0, r.lastIndexOf("]")).substr(r.indexOf("[") + 1);
  73.                 $(this).parent().append('<p class="stegr16" style="font-size:18px;color:#0f0;background:black;padding:4px;max-width:600px;word-break:break-all;">' + r + '<p>');
  74.             }
  75.         });
  76.         IF ($('#stego').length === 0) { // если еще не вставили поле для ввода скрытого текста - вставляем
  77.             var _2chhk_msg = $('#shampoo');
  78.             IF (_2chhk_msg.length) {
  79.                 _2chhk_msg.parent().append('<textarea style="width:600px" id="stego">ДОПУСТИМЫЕ СИМВОЛЫ АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЬЫЮЯ[] И ПРОБЕЛ</textarea>');
  80.                 _2chhk_msg.parent().append('<div id="bstego" style="border:1px solid gray;padding:3px;">Вшить послание</div>');
  81.                 $('#bstego').click(function() { hide(_2chhk_msg.attr('id'), 'stego', _2chhk_msg.attr('id')); });
  82.             }
  83.         }
  84.     };
  85.     setInterval(detect, 1000); // цикличность проверки - каждую секунду (на случай подгрузки новых элементов)
  86.     detect(); // первая проверка после загрузки страницы
  87. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement