fork(9) download
  1. function txtencode(Incode, passCode)
  2. {
  3. //Так как сам результат может содержать нежелательные символы, эта переменная содержит символы с помощью которых мы будем выдавать закодированный результат, который вдальнейшем сможем отправить без особых хлопот
  4. var b52 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  5. //Эти переменные будут меняться в процессе кодировки и создавать мешанину каждого кодируемого символа в отдельности
  6. var maxPC = ifPC = 0;
  7. //Уникализируем переменную maxPC. Ее значение будет происходить от суммы каждого юникодного значения символов пароля
  8. for(var i=0; i<passCode.length; i++) maxPC += passCode.charCodeAt(i);
  9. //Значение maxPCmod будет меняться на убывание, опять же в зависимости от юникодного значения символа пароля
  10. //А вот значение maxPC сохраним, оно понадобиться вдальнейшем, чтобы присвоить переменной maxPCmod новое значение, когда то будет меньше 0.
  11. maxPCmod = maxPC;
  12. //Результат кодируемой строки. Изначально равно пустоте.
  13. var rexcode = "";
  14. //Переменная содержит первый символ пароля: passCode.charCodeAt(numPC)
  15. //С ее помощью будем перебирать пароль и перемешивать его с символом строки
  16. var numPC = 0;
  17. //Перебираем каждый символ строки
  18. for(var i=0; i<Incode.length; i++)
  19. {
  20. //Если все символы пароля перемешаны, начинаем перебор пароля с первого символа
  21. if(numPC == passCode.length) numPC = 0;
  22. //Присвоиваем переменной maxPCmod новое значение, если оно меньше нуля.
  23. if(maxPCmod < 1) maxPCmod = maxPC+ifPC;
  24. //Эта переменная нужна для создания уникального значения maxPCmod, и как следствие уникального символа, с которым будет перемешиваться символ исходной строки.
  25. // Получаем ее путем деления по модулю значений maxPCmod и текущего используемого юникодного значения символа пароля
  26. //В целом постоянная мешанина переменных maxPCmod, maxPC и ifPC позволяет кодировать каждый отдельный символ исходной строки с уникальным значением, что подразумевает невозможность отследить какую-либо синхронизацию алгоритма
  27. ifPC += maxPCmod % passCode.charCodeAt(numPC);
  28. //Создаем непосредственно символ, с которым и будем перемешивать текущий символ строки
  29. var iscode = maxPCmod % passCode.charCodeAt(numPC);
  30. //Создаем мешанину, путем сложения предыдущей переменной с переменной текущего символа
  31. var nCode = (Incode.charCodeAt(i)+iscode);
  32. //Уменьшаем значение maxPCmod для ее дальнейшей уникализации
  33. maxPCmod -= passCode.charCodeAt(numPC);
  34. //Переходим к следующему символу пароля
  35. numPC++;
  36. //Это будет уникальный номер текущего символа.
  37. //При делении закодированного символа на 52 число означает неполное частно, а буква остаток.
  38. //Например 22С означает 22*52+2, так как С второй по счету символ начиная с нуля.
  39. rexcode += parseInt(nCode / 52) + b52.charAt(parseInt(nCode % 52));
  40. }
  41. //Возвращаем закодированную строку
  42. return rexcode;
  43.  
  44. }
  45.  
  46. function txtdecode(Incode, passCode)
  47. {
  48. var b52 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  49. var maxPC = 0;
  50. for(var i=0; i<passCode.length; i++) maxPC += passCode.charCodeAt(i);
  51. maxPCmod = maxPC;
  52. ifPC = 0;
  53. //Разбиваем строку на массив, который будет состоять из каждого закодированного символа
  54. var Incode = Incode.match(/\d+\w/g);
  55. var rexcode = "";
  56. var numPC = 0;
  57. for(var i=0; i<Incode.length; i++)
  58. {
  59. if(numPC == passCode.length) numPC = 0;
  60. if(maxPCmod < 1) maxPCmod = maxPC+ifPC;
  61. ifPC += maxPCmod % passCode.charCodeAt(numPC);
  62. var iscode = maxPCmod % passCode.charCodeAt(numPC);
  63. //В отличии от фунции кодирования, тут дейтсвие происходит в обратную сторону
  64. var nCode = (parseInt(Incode[i])*52)+parseInt(b52.indexOf(Incode[i].substr(-1)));
  65. maxPCmod -= passCode.charCodeAt(numPC);
  66. numPC++;
  67. //И в результате соответственно уже не сложение, а вычитание
  68. rexcode += String.fromCharCode(nCode-iscode);
  69. }
  70. //Уже можно вернуть return rexcode.
  71. //Но для корректного отображения в браузере, я преобразую некоторые символы во мнемоники, а урлы преобразую в ссылки.
  72. return rexcode.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/ /g, " ").replace(/\r\n|\r|\n/g,"<br />").replace(/(https?\:\/\/|www\.)([а-яА-Я\d\w#!:.?+=&%@!\-\/]+)/gi, function(url)
  73. {
  74. return '<a target="_blank" href="'+ (( url.match('^https?:\/\/') )?url:'http://' + url) +'">'+ url +'</a>';
  75. });
  76. }
  77.  
  78. var top_secret_info = txtencode('hello', 'qqqqq');
  79. print(txtdecode(top_secret_info, 'xxxxx'));
  80.  
  81.  
Success #stdin #stdout 0.01s 29720KB
stdin
Standard input is empty
stdout
hello