Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. gost_crypt.js
  2. var GostCypher = {
  3.  
  4.     tableOfReplace : new Array(),
  5.  
  6.     Replace : function (i, j) {
  7.         return GostCypher.tableOfReplace[i*2][j & 0x0F] + (GostCypher.tableOfReplace[i*2+1][j >>> 4] << 4);
  8.     },
  9.  
  10.     MainStep : function (textBlock, elementKey) {
  11.         var N = textBlock.slice(0);
  12.         var X = elementKey;
  13.         var S = (N[0] + X) & 0xFFFFFFFF;
  14.         var cell;
  15.         var new_S = 0;
  16.         for (var i = 0; i < 4; i++) {
  17.             cell = (S >>> (i << 3)) & 0xFF;
  18.             new_S += GostCypher.Replace(i, cell) << (i << 3);
  19.         }
  20.         S = (((new_S << 11) + (new_S >>> 21)) & 0xFFFFFFFF) ^ N[1];
  21.         N[1] = N[0]; N[0] = S;
  22.         return N;
  23.     },
  24.  
  25.     Encrypt : function (textBlock, key) {
  26.         var N = textBlock.slice(0);
  27.         var i, j;
  28.         for (i = 1; i <= 3; i++)
  29.             for (j = 0; j < 8; j++)
  30.                 N = GostCypher.MainStep(N, key[j]);
  31.         for (i = 7; i >= 0; i--)
  32.             N = GostCypher.MainStep(N, key[i]);
  33.         N[0] ^= N[1]; N[1] ^= N[0]; N[0] ^= N[1];
  34.         return N;
  35.     },
  36.  
  37.     Decrypt : function (textBlock, key) {
  38.         var N = textBlock.slice(0);
  39.         var i, j;
  40.         for (i = 0; i < 8; i++)
  41.             N = GostCypher.MainStep(N, key[i]);
  42.         for (i = 1; i <= 3; i++)
  43.             for (j = 7; j >= 0; j--)
  44.                 N = GostCypher.MainStep(N, key[j]);
  45.         N[0] ^= N[1]; N[1] ^= N[0]; N[0] ^= N[1];
  46.         return N;
  47.     },
  48.  
  49.     generateAuthCode : function (textBlock, key) {
  50.         var N = textBlock.slice(0);
  51.         for (var i = 1; i <= 2; i++)
  52.             for (var j = 0; j < 8; j++)
  53.                 N = GostCypher.MainStep(N, key[j]);
  54.         return N;
  55.     },
  56.  
  57.     SimpleReplace : function (text, key, decrypt) {
  58.         var result = "";
  59.         var block;
  60.         var N = new Array();
  61.         for (var i = 0; i < text.length; i += 4) {
  62.             block = text.substr(i, 4);
  63.             N[0] = block.charCodeAt(0) + (block.charCodeAt(1) << 16);
  64.             N[1] = block.charCodeAt(2) + (block.charCodeAt(3) << 16);
  65.             if (decrypt) N = GostCypher.Decrypt(N, key);
  66.             else N = GostCypher.Encrypt(N, key);
  67.             result += String.fromCharCode(N[0] & 0xFFFF, N[0] >>> 16, N[1] & 0xFFFF, N[1] >>> 16);
  68.         }
  69.         return result;
  70.     },
  71.  
  72.     Xor : function (text, key, syncMessage) {
  73.         var S = syncMessage.slice(0);
  74.         var C1 = 0x1010101;
  75.         var C2 = 0x1010104;
  76.         var result = "", block, remain;
  77.         var N = new Array(), gamma = new Array();
  78.         S = GostCypher.Encrypt(S, key);
  79.         for (var i = 0; i < text.length; i += 4) {
  80.             S[0] = (S[0] + C1) & 0xFFFFFFFF;
  81.             if (S[1] > 0xFFFFFFFF-C2) S[1]++;
  82.             S[1] = (S[1] + C2) & 0xFFFFFFFF;
  83.             gamma = GostCypher.Encrypt(S, key);
  84.             block = text.substr(i, 4);
  85.             N[0] = (block.charCodeAt(0) + (block.charCodeAt(1) << 16)) ^ gamma[0];
  86.             N[1] = (block.charCodeAt(2) + (block.charCodeAt(3) << 16)) ^ gamma[1];
  87.             remain = text.length - i;
  88.             if (remain < 4)
  89.                 result += String.fromCharCode(N[0] & 0xFFFF, N[0] >>> 16, N[1] & 0xFFFF, N[1] >>> 16).substr(0, remain);
  90.             else
  91.                 result += String.fromCharCode(N[0] & 0xFFFF, N[0] >>> 16, N[1] & 0xFFFF, N[1] >>> 16);
  92.         }
  93.         return result;
  94.     },
  95.  
  96.     XorFeedBack : function (text, key, syncMessage, decrypt) {
  97.         var S = syncMessage.slice(0);
  98.         var result = "", block, remain;
  99.         for (var i = 0; i < text.length; i += 4) {
  100.             S = GostCypher.Encrypt(S, key);
  101.             block = text.substr(i, 4);
  102.             S[0] = S[0] ^ (block.charCodeAt(0) + (block.charCodeAt(1) << 16));
  103.             S[1] = S[1] ^ (block.charCodeAt(2) + (block.charCodeAt(3) << 16));
  104.             remain = text.length - i;
  105.             if (remain < 4)
  106.                 result += String.fromCharCode(S[0] & 0xFFFF, S[0] >>> 16, S[1] & 0xFFFF, S[1] >>> 16).substr(0, remain);
  107.             else
  108.                 result += String.fromCharCode(S[0] & 0xFFFF, S[0] >>> 16, S[1] & 0xFFFF, S[1] >>> 16);
  109.             if (decrypt) {
  110.                 S[0] = block.charCodeAt(0) + (block.charCodeAt(1) << 16);
  111.                 S[1] = block.charCodeAt(2) + (block.charCodeAt(3) << 16);
  112.             }
  113.         }
  114.         return result;
  115.     },
  116.  
  117.     AuthCode : function (text, key) {
  118.         var S = [0, 0];
  119.         for (var i = 0; i < text.length; i += 4) {
  120.             block = text.substr(i, 4);
  121.             S[0] = (block.charCodeAt(0) + (block.charCodeAt(1) << 16)) ^ S[0];
  122.             S[1] = (block.charCodeAt(2) + (block.charCodeAt(3) << 16)) ^ S[1];
  123.             S = GostCypher.generateAuthCode(S, key);
  124.         }
  125.         return S;
  126.     }
  127. }
  128. function ReadKey() {
  129.     var key = new Array();
  130.     for (var i = 0; i < 8; i++) {
  131.         key[i] = 0;
  132.         for (var indexNum = 0; indexNum < 8; indexNum++) {
  133.             key[i] += parseInt(document.getElementById("key_"+i).value.charAt(indexNum), 16) * Math.pow(16, 7-indexNum);
  134.         }
  135.     }
  136.     return key;
  137. }
  138.  
  139. function ReadTableOfReplace() {
  140.     var value;
  141.     var strings = document.app_form.tableOfReplace.value.split("\n");
  142.     for (i = 0; i < 8; i++) {
  143.         value = strings[i].split(" ");
  144.         GostCypher.tableOfReplace[i] = new Array();
  145.         for (j = 0; j < 16; j++)
  146.             GostCypher.tableOfReplace[i][j] = parseInt(value[j], 16);
  147.     }
  148. }
  149.  
  150. function ReadSyncMessage() {
  151.     var syncMessage = [0, 0];
  152.     for (var i = 0; i < 8; i++) {
  153.         syncMessage[1] += parseInt(document.app_form.syncMessage.value.charAt(i), 16) * Math.pow(16, 7-i);
  154.         syncMessage[0] += parseInt(document.app_form.syncMessage.value.charAt(8+i), 16) * Math.pow(16, 7-i);
  155.     }
  156.     return syncMessage;
  157. }
  158.  
  159. function ConvertToHex(text) {
  160.     var hexAlphabet = "0123456789ABCDEF";
  161.     var code;
  162.     var result = "";
  163.     for (var i = 0; i < text.length; i++) {
  164.         code = text.charCodeAt(i);
  165.         result += hexAlphabet[(code & 0xF000) >>> 12] +
  166.             hexAlphabet[(code & 0xF00) >>> 8] +
  167.             hexAlphabet[(code & 0xF0) >>> 4] +
  168.             hexAlphabet[code & 0xF];
  169.     }
  170.     return result;
  171. }
  172.  
  173. function ConvertFromHex(text) {
  174.     var result = "";
  175.     for (var i = 0; i < text.length; i += 4)
  176.         result += String.fromCharCode(parseInt(text.substr(i, 4), 16));
  177.     return result;
  178. }
  179.  
  180.  
  181. function EncodeAuthCode(authCode) {
  182.     return String.fromCharCode((authCode[1] & 0xFFFF0000) >>> 16) +
  183.         String.fromCharCode(authCode[1] & 0xFFFF) +
  184.         String.fromCharCode((authCode[0] & 0xFFFF0000) >>> 16) +
  185.         String.fromCharCode(authCode[0] & 0xFFFF);
  186. }
  187.  
  188. function DoGostEncrypt() {
  189.     var text = document.app_form.message.value;
  190.     var key = ReadKey();
  191.     ReadTableOfReplace();
  192.     var syncMessage = ReadSyncMessage();
  193.     var mode = document.app_form.mode.value;
  194.     var encrypt = (document.app_form.crypt_mode.value == 1);
  195.     var result;
  196.     switch (mode) {
  197.         case '1': result = GostCypher.SimpleReplace(ConvertFromHex(text), key, (!encrypt));
  198.             break;
  199.         case '2': result = GostCypher.Xor(ConvertFromHex(text), key, syncMessage);
  200.             break;
  201.         case '3': result = GostCypher.XorFeedBack(ConvertFromHex(text), key, syncMessage, (!encrypt));
  202.             break;
  203.         case '4': result = EncodeAuthCode(GostCypher.AuthCode(ConvertFromHex(text), key));
  204.             break;
  205.     }
  206.     document.app_form.result.value = ConvertToHex(result);
  207. }
  208.  
  209. ----------------------------------------------------------------------------------------
  210. index.html
  211.  
  212. <html>
  213. <head>
  214.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  215.     <script src="gost_crypt.js"></script>
  216. </head>
  217. <body>
  218. <p style="text-indent: 21px;">
  219.     Для удобства использования принимает входной текст
  220.     в виде 16-чного кода, в таком же виде выдаёт шифротекст. Для того, чтобы преобразовать текст в код и наоборот,
  221.     над полями добавлены соответствующие кнопки, при этом каждый символ текста преобразуется в 4-разрядный 16-чный код,
  222.     соответствующий ему (и наоборот).
  223. </p>
  224. <p style="text-indent: 21px;">
  225.     Параметры и значения, изначально установленные в полях, являются одним из проверочных векторов, приведённых в тексте
  226.     стандарта «ГОСТ Р 34.11-94». Если при выполнении шифрования с этими параметрами значение результата не изменится,
  227.     то программный сценарий работает правильно.
  228. </p>
  229. <P>
  230.     <form name="app_form">
  231.         <table width=100%>
  232.             <tr>
  233.                 <td>
  234.                     <input type=button onClick="document.app_form.message.value=ConvertFromHex(document.app_form.message.value);" value="Раскодировать" />
  235.                     &nbsp;<b>Текст</b>&nbsp;
  236.                     <input type=button onClick="document.app_form.message.value=ConvertToHex(document.app_form.message.value);" value="Закодировать" />
  237.                     <br /><textarea name="message" rows=5 cols=60>0000000000000000</textarea>
  238.                 </td>
  239.                 <td>
  240.                     <input type=button onClick="document.app_form.result.value=ConvertFromHex(document.app_form.result.value);" value="Раскодировать" />
  241.                     &nbsp;<b>Результат</b>&nbsp;
  242.                     <input type=button onClick="document.app_form.result.value=ConvertToHex(document.app_form.result.value);" value="Закодировать" />
  243.                     <br /><textarea name="result" rows=5 cols=60>0B1B32BCBCCE42AB</textarea>
  244.                 </td>
  245.             </tr>
  246.             <tr>
  247.                 <td>
  248. <p>Ключ:<br />
  249.     <input type=text id="key_0" size=8 maxlength=8 value="33206D54" />
  250.     <input type=text id="key_1" size=8 maxlength=8 value="326C6568" />
  251.     <input type=text id="key_2" size=8 maxlength=8 value="20657369" />
  252.     <input type=text id="key_3" size=8 maxlength=8 value="626E7373" />
  253.     <br />
  254.     <input type=text id="key_4" size=8 maxlength=8 value="79676120" />
  255.     <input type=text id="key_5" size=8 maxlength=8 value="74746769" />
  256.     <input type=text id="key_6" size=8 maxlength=8 value="65686573" />
  257.     <input type=text id="key_7" size=8 maxlength=8 value="733D2C20" />
  258. </p>
  259. <p>Синхропосылка:<br /><input type=text name="syncMessage" size=16 maxlength=16 value="0000000000000000" disabled /></p>
  260. </td>
  261. <td>
  262.     Таблица замен:<br />
  263.     <textarea name="tableOfReplace" rows=8 cols=31>4 A 9 2 D 8 0 E 6 B 1 C 7 F 5 3
  264. E B 4 C 6 D F A 2 3 8 1 0 7 5 9
  265. 5 8 1 D A 3 4 2 E F C 7 6 0 9 B
  266. 7 D A 1 0 8 9 F E 4 6 C B 2 5 3
  267. 6 C 7 1 5 F D 8 4 A 9 E 0 3 B 2
  268. 4 B A 0 7 2 1 D 3 6 8 5 9 C F E
  269. D B 4 1 3 F 5 9 0 A E 7 6 8 2 C
  270. 1 F D 0 5 7 A 4 9 2 3 E 6 B 8 C</textarea>
  271. </td>
  272. </tr>
  273. <tr>
  274.     <td>
  275.         Режим:<br />
  276.         <select name="mode">
  277.             <option value="1" onClick="document.app_form.crypt_mode.disabled=false;document.app_form.syncMessage.disabled=true;" selected />Простая замена<br />
  278.             <option value="2" onClick="document.app_form.crypt_mode.disabled=true;document.app_form.syncMessage.disabled=false;" />Xor<br />
  279.             <option value="3" onClick="document.app_form.crypt_mode.disabled=false;document.app_form.syncMessage.disabled=false;" />Xor с обратной связью<br />
  280.             <option value="4" onClick="document.app_form.crypt_mode.disabled=true;document.app_form.syncMessage.disabled=true;" />AuthCode
  281.         </select>
  282.         &nbsp;&nbsp;&nbsp;
  283.         <select name="crypt_mode">
  284.             <option value="1" selected />Зашифровать
  285.             <option value="2" />Расшифровать
  286.         </select>
  287.     </td>
  288.     <td valign=bottom align=center>
  289.         <input type="button" onClick="DoGostEncrypt();" value="Выполнить шифрование" />
  290.     </td>
  291. </tr>
  292. </table>
  293. </form>
  294. </body>
  295. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement