Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- gost_crypt.js
- var GostCypher = {
- tableOfReplace : new Array(),
- Replace : function (i, j) {
- return GostCypher.tableOfReplace[i*2][j & 0x0F] + (GostCypher.tableOfReplace[i*2+1][j >>> 4] << 4);
- },
- MainStep : function (textBlock, elementKey) {
- var N = textBlock.slice(0);
- var X = elementKey;
- var S = (N[0] + X) & 0xFFFFFFFF;
- var cell;
- var new_S = 0;
- for (var i = 0; i < 4; i++) {
- cell = (S >>> (i << 3)) & 0xFF;
- new_S += GostCypher.Replace(i, cell) << (i << 3);
- }
- S = (((new_S << 11) + (new_S >>> 21)) & 0xFFFFFFFF) ^ N[1];
- N[1] = N[0]; N[0] = S;
- return N;
- },
- Encrypt : function (textBlock, key) {
- var N = textBlock.slice(0);
- var i, j;
- for (i = 1; i <= 3; i++)
- for (j = 0; j < 8; j++)
- N = GostCypher.MainStep(N, key[j]);
- for (i = 7; i >= 0; i--)
- N = GostCypher.MainStep(N, key[i]);
- N[0] ^= N[1]; N[1] ^= N[0]; N[0] ^= N[1];
- return N;
- },
- Decrypt : function (textBlock, key) {
- var N = textBlock.slice(0);
- var i, j;
- for (i = 0; i < 8; i++)
- N = GostCypher.MainStep(N, key[i]);
- for (i = 1; i <= 3; i++)
- for (j = 7; j >= 0; j--)
- N = GostCypher.MainStep(N, key[j]);
- N[0] ^= N[1]; N[1] ^= N[0]; N[0] ^= N[1];
- return N;
- },
- generateAuthCode : function (textBlock, key) {
- var N = textBlock.slice(0);
- for (var i = 1; i <= 2; i++)
- for (var j = 0; j < 8; j++)
- N = GostCypher.MainStep(N, key[j]);
- return N;
- },
- SimpleReplace : function (text, key, decrypt) {
- var result = "";
- var block;
- var N = new Array();
- for (var i = 0; i < text.length; i += 4) {
- block = text.substr(i, 4);
- N[0] = block.charCodeAt(0) + (block.charCodeAt(1) << 16);
- N[1] = block.charCodeAt(2) + (block.charCodeAt(3) << 16);
- if (decrypt) N = GostCypher.Decrypt(N, key);
- else N = GostCypher.Encrypt(N, key);
- result += String.fromCharCode(N[0] & 0xFFFF, N[0] >>> 16, N[1] & 0xFFFF, N[1] >>> 16);
- }
- return result;
- },
- Xor : function (text, key, syncMessage) {
- var S = syncMessage.slice(0);
- var C1 = 0x1010101;
- var C2 = 0x1010104;
- var result = "", block, remain;
- var N = new Array(), gamma = new Array();
- S = GostCypher.Encrypt(S, key);
- for (var i = 0; i < text.length; i += 4) {
- S[0] = (S[0] + C1) & 0xFFFFFFFF;
- if (S[1] > 0xFFFFFFFF-C2) S[1]++;
- S[1] = (S[1] + C2) & 0xFFFFFFFF;
- gamma = GostCypher.Encrypt(S, key);
- block = text.substr(i, 4);
- N[0] = (block.charCodeAt(0) + (block.charCodeAt(1) << 16)) ^ gamma[0];
- N[1] = (block.charCodeAt(2) + (block.charCodeAt(3) << 16)) ^ gamma[1];
- remain = text.length - i;
- if (remain < 4)
- result += String.fromCharCode(N[0] & 0xFFFF, N[0] >>> 16, N[1] & 0xFFFF, N[1] >>> 16).substr(0, remain);
- else
- result += String.fromCharCode(N[0] & 0xFFFF, N[0] >>> 16, N[1] & 0xFFFF, N[1] >>> 16);
- }
- return result;
- },
- XorFeedBack : function (text, key, syncMessage, decrypt) {
- var S = syncMessage.slice(0);
- var result = "", block, remain;
- for (var i = 0; i < text.length; i += 4) {
- S = GostCypher.Encrypt(S, key);
- block = text.substr(i, 4);
- S[0] = S[0] ^ (block.charCodeAt(0) + (block.charCodeAt(1) << 16));
- S[1] = S[1] ^ (block.charCodeAt(2) + (block.charCodeAt(3) << 16));
- remain = text.length - i;
- if (remain < 4)
- result += String.fromCharCode(S[0] & 0xFFFF, S[0] >>> 16, S[1] & 0xFFFF, S[1] >>> 16).substr(0, remain);
- else
- result += String.fromCharCode(S[0] & 0xFFFF, S[0] >>> 16, S[1] & 0xFFFF, S[1] >>> 16);
- if (decrypt) {
- S[0] = block.charCodeAt(0) + (block.charCodeAt(1) << 16);
- S[1] = block.charCodeAt(2) + (block.charCodeAt(3) << 16);
- }
- }
- return result;
- },
- AuthCode : function (text, key) {
- var S = [0, 0];
- for (var i = 0; i < text.length; i += 4) {
- block = text.substr(i, 4);
- S[0] = (block.charCodeAt(0) + (block.charCodeAt(1) << 16)) ^ S[0];
- S[1] = (block.charCodeAt(2) + (block.charCodeAt(3) << 16)) ^ S[1];
- S = GostCypher.generateAuthCode(S, key);
- }
- return S;
- }
- }
- function ReadKey() {
- var key = new Array();
- for (var i = 0; i < 8; i++) {
- key[i] = 0;
- for (var indexNum = 0; indexNum < 8; indexNum++) {
- key[i] += parseInt(document.getElementById("key_"+i).value.charAt(indexNum), 16) * Math.pow(16, 7-indexNum);
- }
- }
- return key;
- }
- function ReadTableOfReplace() {
- var value;
- var strings = document.app_form.tableOfReplace.value.split("\n");
- for (i = 0; i < 8; i++) {
- value = strings[i].split(" ");
- GostCypher.tableOfReplace[i] = new Array();
- for (j = 0; j < 16; j++)
- GostCypher.tableOfReplace[i][j] = parseInt(value[j], 16);
- }
- }
- function ReadSyncMessage() {
- var syncMessage = [0, 0];
- for (var i = 0; i < 8; i++) {
- syncMessage[1] += parseInt(document.app_form.syncMessage.value.charAt(i), 16) * Math.pow(16, 7-i);
- syncMessage[0] += parseInt(document.app_form.syncMessage.value.charAt(8+i), 16) * Math.pow(16, 7-i);
- }
- return syncMessage;
- }
- function ConvertToHex(text) {
- var hexAlphabet = "0123456789ABCDEF";
- var code;
- var result = "";
- for (var i = 0; i < text.length; i++) {
- code = text.charCodeAt(i);
- result += hexAlphabet[(code & 0xF000) >>> 12] +
- hexAlphabet[(code & 0xF00) >>> 8] +
- hexAlphabet[(code & 0xF0) >>> 4] +
- hexAlphabet[code & 0xF];
- }
- return result;
- }
- function ConvertFromHex(text) {
- var result = "";
- for (var i = 0; i < text.length; i += 4)
- result += String.fromCharCode(parseInt(text.substr(i, 4), 16));
- return result;
- }
- function EncodeAuthCode(authCode) {
- return String.fromCharCode((authCode[1] & 0xFFFF0000) >>> 16) +
- String.fromCharCode(authCode[1] & 0xFFFF) +
- String.fromCharCode((authCode[0] & 0xFFFF0000) >>> 16) +
- String.fromCharCode(authCode[0] & 0xFFFF);
- }
- function DoGostEncrypt() {
- var text = document.app_form.message.value;
- var key = ReadKey();
- ReadTableOfReplace();
- var syncMessage = ReadSyncMessage();
- var mode = document.app_form.mode.value;
- var encrypt = (document.app_form.crypt_mode.value == 1);
- var result;
- switch (mode) {
- case '1': result = GostCypher.SimpleReplace(ConvertFromHex(text), key, (!encrypt));
- break;
- case '2': result = GostCypher.Xor(ConvertFromHex(text), key, syncMessage);
- break;
- case '3': result = GostCypher.XorFeedBack(ConvertFromHex(text), key, syncMessage, (!encrypt));
- break;
- case '4': result = EncodeAuthCode(GostCypher.AuthCode(ConvertFromHex(text), key));
- break;
- }
- document.app_form.result.value = ConvertToHex(result);
- }
- ----------------------------------------------------------------------------------------
- index.html
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <script src="gost_crypt.js"></script>
- </head>
- <body>
- <p style="text-indent: 21px;">
- Для удобства использования принимает входной текст
- в виде 16-чного кода, в таком же виде выдаёт шифротекст. Для того, чтобы преобразовать текст в код и наоборот,
- над полями добавлены соответствующие кнопки, при этом каждый символ текста преобразуется в 4-разрядный 16-чный код,
- соответствующий ему (и наоборот).
- </p>
- <p style="text-indent: 21px;">
- Параметры и значения, изначально установленные в полях, являются одним из проверочных векторов, приведённых в тексте
- стандарта «ГОСТ Р 34.11-94». Если при выполнении шифрования с этими параметрами значение результата не изменится,
- то программный сценарий работает правильно.
- </p>
- <P>
- <form name="app_form">
- <table width=100%>
- <tr>
- <td>
- <input type=button onClick="document.app_form.message.value=ConvertFromHex(document.app_form.message.value);" value="Раскодировать" />
- <b>Текст</b>
- <input type=button onClick="document.app_form.message.value=ConvertToHex(document.app_form.message.value);" value="Закодировать" />
- <br /><textarea name="message" rows=5 cols=60>0000000000000000</textarea>
- </td>
- <td>
- <input type=button onClick="document.app_form.result.value=ConvertFromHex(document.app_form.result.value);" value="Раскодировать" />
- <b>Результат</b>
- <input type=button onClick="document.app_form.result.value=ConvertToHex(document.app_form.result.value);" value="Закодировать" />
- <br /><textarea name="result" rows=5 cols=60>0B1B32BCBCCE42AB</textarea>
- </td>
- </tr>
- <tr>
- <td>
- <p>Ключ:<br />
- <input type=text id="key_0" size=8 maxlength=8 value="33206D54" />
- <input type=text id="key_1" size=8 maxlength=8 value="326C6568" />
- <input type=text id="key_2" size=8 maxlength=8 value="20657369" />
- <input type=text id="key_3" size=8 maxlength=8 value="626E7373" />
- <br />
- <input type=text id="key_4" size=8 maxlength=8 value="79676120" />
- <input type=text id="key_5" size=8 maxlength=8 value="74746769" />
- <input type=text id="key_6" size=8 maxlength=8 value="65686573" />
- <input type=text id="key_7" size=8 maxlength=8 value="733D2C20" />
- </p>
- <p>Синхропосылка:<br /><input type=text name="syncMessage" size=16 maxlength=16 value="0000000000000000" disabled /></p>
- </td>
- <td>
- Таблица замен:<br />
- <textarea name="tableOfReplace" rows=8 cols=31>4 A 9 2 D 8 0 E 6 B 1 C 7 F 5 3
- E B 4 C 6 D F A 2 3 8 1 0 7 5 9
- 5 8 1 D A 3 4 2 E F C 7 6 0 9 B
- 7 D A 1 0 8 9 F E 4 6 C B 2 5 3
- 6 C 7 1 5 F D 8 4 A 9 E 0 3 B 2
- 4 B A 0 7 2 1 D 3 6 8 5 9 C F E
- D B 4 1 3 F 5 9 0 A E 7 6 8 2 C
- 1 F D 0 5 7 A 4 9 2 3 E 6 B 8 C</textarea>
- </td>
- </tr>
- <tr>
- <td>
- Режим:<br />
- <select name="mode">
- <option value="1" onClick="document.app_form.crypt_mode.disabled=false;document.app_form.syncMessage.disabled=true;" selected />Простая замена<br />
- <option value="2" onClick="document.app_form.crypt_mode.disabled=true;document.app_form.syncMessage.disabled=false;" />Xor<br />
- <option value="3" onClick="document.app_form.crypt_mode.disabled=false;document.app_form.syncMessage.disabled=false;" />Xor с обратной связью<br />
- <option value="4" onClick="document.app_form.crypt_mode.disabled=true;document.app_form.syncMessage.disabled=true;" />AuthCode
- </select>
-
- <select name="crypt_mode">
- <option value="1" selected />Зашифровать
- <option value="2" />Расшифровать
- </select>
- </td>
- <td valign=bottom align=center>
- <input type="button" onClick="DoGostEncrypt();" value="Выполнить шифрование" />
- </td>
- </tr>
- </table>
- </form>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement