В результате был найден способ как получить криптографическую функцию в 1С не копаясь в RFC и спецификациях относительно быстро и самое главное отлаженную от и до.
На ИСе есть пару статей на эту тему, но, повторюсь, не для SHA-512.
Вот ссылки:
На одном из сайтов наткнулся на итнересную идею: использовать готовые функции на других скриптовых языках программирования и заставить их выполняться в 1С. Таким образом можно компенсировать в 1С отсутсвие побитовых операций, доступ к WMI и всего прочего. Сделать нам это поможет Microsoft Script Control.
Объект Microsoft Script Control позволит исполнить код на VBScript или JScript. Присутствует в Windows начиная с версии 2000, в более ранних может быть установлен.
Конечно, я не претендую на оригинальность идеи, но, все же я думаю, кто-то найдет эту информацию полезной для себя.
Таким макаром получилось очень быстро сделать функцию для работы с хэшем SHA-512. Вот, что получилось:
Функция SHA512(Стр)
ScrptCtrl = Новый COMОбъект(«MSScriptControl.ScriptControl»);
ScrptCtrl.Language = «JScript»;
ScrptCtrl.AddCode(
«function SHA512(str) {
| function int64(msint_32, lsint_32) {
| this.highOrder = msint_32;
| this.lowOrder = lsint_32;
| }
| var H = [new int64(0x6a09e667, 0xf3bcc908), new int64(0xbb67ae85, 0x84caa73b),
| new int64(0x3c6ef372, 0xfe94f82b), new int64(0xa54ff53a, 0x5f1d36f1),
| new int64(0x510e527f, 0xade682d1), new int64(0x9b05688c, 0x2b3e6c1f),
| new int64(0x1f83d9ab, 0xfb41bd6b), new int64(0x5be0cd19, 0x137e2179)];
| var K = [new int64(0x428a2f98, 0xd728ae22), new int64(0x71374491, 0x23ef65cd),
| new int64(0xb5c0fbcf, 0xec4d3b2f), new int64(0xe9b5dba5, 0x8189dbbc),
| new int64(0x3956c25b, 0xf348b538), new int64(0x59f111f1, 0xb605d019),
| new int64(0x923f82a4, 0xaf194f9b), new int64(0xab1c5ed5, 0xda6d8118),
| new int64(0xd807aa98, 0xa3030242), new int64(0x12835b01, 0x45706fbe),
| new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, 0xd5ffb4e2),
| new int64(0x72be5d74, 0xf27b896f), new int64(0x80deb1fe, 0x3b1696b1),
| new int64(0x9bdc06a7, 0x25c71235), new int64(0xc19bf174, 0xcf692694),
| new int64(0xe49b69c1, 0x9ef14ad2), new int64(0xefbe4786, 0x384f25e3),
| new int64(0x0fc19dc6, 0x8b8cd5b5), new int64(0x240ca1cc, 0x77ac9c65),
| new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
| new int64(0x5cb0a9dc, 0xbd41fbd4), new int64(0x76f988da, 0x831153b5),
| new int64(0x983e5152, 0xee66dfab), new int64(0xa831c66d, 0x2db43210),
| new int64(0xb00327c8, 0x98fb213f), new int64(0xbf597fc7, 0xbeef0ee4),
| new int64(0xc6e00bf3, 0x3da88fc2), new int64(0xd5a79147, 0x930aa725),
| new int64(0x06ca6351, 0xe003826f), new int64(0x14292967, 0x0a0e6e70),
| new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
| new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, 0x9d95b3df),
| new int64(0x650a7354, 0x8baf63de), new int64(0x766a0abb, 0x3c77b2a8),
| new int64(0x81c2c92e, 0x47edaee6), new int64(0x92722c85, 0x1482353b),
| new int64(0xa2bfe8a1, 0x4cf10364), new int64(0xa81a664b, 0xbc423001),
| new int64(0xc24b8b70, 0xd0f89791), new int64(0xc76c51a3, 0x0654be30),
| new int64(0xd192e819, 0xd6ef5218), new int64(0xd6990624, 0x5565a910),
| new int64(0xf40e3585, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
| new int64(0x19a4c116, 0xb8d2d0c8), new int64(0x1e376c08, 0x5141ab53),
| new int64(0x2748774c, 0xdf8eeb99), new int64(0x34b0bcb5, 0xe19b48a8),
| new int64(0x391c0cb3, 0xc5c95a63), new int64(0x4ed8aa4a, 0xe3418acb),
| new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, 0xd6b2b8a3),
| new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
| new int64(0x84c87814, 0xa1f0ab72), new int64(0x8cc70208, 0x1a6439ec),
| new int64(0x90befffa, 0x23631e28), new int64(0xa4506ceb, 0xde82bde9),
| new int64(0xbef9a3f7, 0xb2c67915), new int64(0xc67178f2, 0xe372532b),
| new int64(0xca273ece, 0xea26619c), new int64(0xd186b8c7, 0x21c0c207),
| new int64(0xeada7dd6, 0xcde0eb1e), new int64(0xf57d4f7f, 0xee6ed178),
| new int64(0x06f067aa, 0x72176fba), new int64(0x0a637dc5, 0xa2c898a6),
| new int64(0x113f9804, 0xbef90dae), new int64(0x1b710b35, 0x131c471b),
| new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
| new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, 0x9c100d4c),
| new int64(0x4cc5d4be, 0xcb3e42b6), new int64(0x597f299c, 0xfc657e2a),
| new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)];
| var W = new Array(64);
| var a, b, c, d, e, f, g, h, i, j;
| var T1, T2;
| var charsize = 8;
| function utf8_encode(str) {
| return unescape(encodeURIComponent(str));
| }
| function str2binb(str) {
| var bin = [];
| var mask = (1 << charsize) — 1;
| var len = str.length * charsize;
| for (var i = 0; i < len; i += charsize) {
| bin[i >> 5] |= (str.charCodeAt(i / charsize) & mask) << (32 — charsize — (i % 32));
| }
| return bin;
| }
| function binb2hex(binarray) {
| var hex_tab = «»0123456789abcdef»»;
| var str = «»»»;
| var length = binarray.length * 4;
| var srcByte;
| for (var i = 0; i < length; i += 1) {
| srcByte = binarray[i >> 2] >> ((3 — (i % 4)) * 8);
| str += hex_tab.charAt((srcByte >> 4) & 0xF) + hex_tab.charAt(srcByte & 0xF);
| }
| return str;
| }
| function safe_add_2(x, y) {
| var lsw, msw, lowOrder, highOrder;
| lsw = (x.lowOrder & 0xFFFF) + (y.lowOrder & 0xFFFF);
| msw = (x.lowOrder >>> 16) + (y.lowOrder >>> 16) + (lsw >>> 16);
| lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);
| lsw = (x.highOrder & 0xFFFF) + (y.highOrder & 0xFFFF) + (msw >>> 16);
| msw = (x.highOrder >>> 16) + (y.highOrder >>> 16) + (lsw >>> 16);
| highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);
| return new int64(highOrder, lowOrder);
| }
| function safe_add_4(a, b, c, d) {
| var lsw, msw, lowOrder, highOrder;
| lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF);
| msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (lsw >>> 16);
| lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);
| lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (msw >>> 16);
| msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (lsw >>> 16);
| highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);
| return new int64(highOrder, lowOrder);
| }
| function safe_add_5(a, b, c, d, e) {
| var lsw, msw, lowOrder, highOrder;
| lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF) + (e.lowOrder & 0xFFFF);
| msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (e.lowOrder >>> 16) + (lsw >>> 16);
| lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);
| lsw = (a.highOrder & 0xFFFF)+(b.highOrder & 0xFFFF)+(c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (e.highOrder & 0xFFFF) + (msw >>> 16);
| msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (e.highOrder >>> 16) + (lsw >>> 16);
| highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);
| return new int64(highOrder, lowOrder);
| }
| function maj(x, y, z) {
| return new int64(
| (x.highOrder & y.highOrder) #k8SjZc9Dxk (x.highOrder & z.highOrder) #k8SjZc9Dxk (y.highOrder & z.highOrder),
| (x.lowOrder & y.lowOrder) #k8SjZc9Dxk (x.lowOrder & z.lowOrder) #k8SjZc9Dxk (y.lowOrder & z.lowOrder)
| );
| }
| function ch(x, y, z) {
| return new int64(
| (x.highOrder & y.highOrder) #k8SjZc9Dxk (~x.highOrder & z.highOrder),
| (x.lowOrder & y.lowOrder) #k8SjZc9Dxk (~x.lowOrder & z.lowOrder)
| );
| }
| function rotr(x, n) {
| if (n | return new int64(
| (x.highOrder >>> n) | (x.lowOrder << (32 — n)),
| (x.lowOrder >>> n) | (x.highOrder << (32 — n))
| );
| } else {
| return new int64(
| (x.lowOrder >>> n) | (x.highOrder << (32 — n)),
| (x.highOrder >>> n) | (x.lowOrder << (32 — n))
| );
| }
| }
| function sigma0(x) {
| var rotr28 = rotr(x, 28);
| var rotr34 = rotr(x, 34);
| var rotr39 = rotr(x, 39);
| return new int64(
| rotr28.highOrder #k8SjZc9Dxk rotr34.highOrder #k8SjZc9Dxk rotr39.highOrder,
| rotr28.lowOrder #k8SjZc9Dxk rotr34.lowOrder #k8SjZc9Dxk rotr39.lowOrder
| );
| }
| function sigma1(x) {
| var rotr14 = rotr(x, 14);
| var rotr18 = rotr(x, 18);
| var rotr41 = rotr(x, 41);
| return new int64(
| rotr14.highOrder #k8SjZc9Dxk rotr18.highOrder #k8SjZc9Dxk rotr41.highOrder,
| rotr14.lowOrder #k8SjZc9Dxk rotr18.lowOrder #k8SjZc9Dxk rotr41.lowOrder
| );
| }
| function gamma0(x) {
| var rotr1 = rotr(x, 1), rotr8 = rotr(x, 8), shr7 = shr(x, 7);
| return new int64(
| rotr1.highOrder #k8SjZc9Dxk rotr8.highOrder #k8SjZc9Dxk shr7.highOrder,
| rotr1.lowOrder #k8SjZc9Dxk rotr8.lowOrder #k8SjZc9Dxk shr7.lowOrder
| );
| }
| function gamma1(x) {
| var rotr19 = rotr(x, 19);
| var rotr61 = rotr(x, 61);
| var shr6 = shr(x, 6);
| return new int64(
| rotr19.highOrder #k8SjZc9Dxk rotr61.highOrder #k8SjZc9Dxk shr6.highOrder,
| rotr19.lowOrder #k8SjZc9Dxk rotr61.lowOrder #k8SjZc9Dxk shr6.lowOrder
| );
| }
| function shr(x, n) {
| if (n | return new int64(
| x.highOrder >>> n,
| x.lowOrder >>> n | (x.highOrder << (32 — n))
| );
| } else {
| return new int64(
| 0,
| x.highOrder << (32 — n)
| );
| }
| }
| str = utf8_encode(str);
| strlen = str.length*charsize;
| str = str2binb(str);
| str[strlen >> 5] |= 0x80 << (24 — strlen % 32);
| str[(((strlen + 128) >> 10) << 5) + 31] = strlen;
| for (var i = 0; i < str.length; i += 32) {
| a = H[0];
| b = H[1];
| c = H[2];
| d = H[3];
| e = H[4];
| f = H[5];
| g = H[6];
| h = H[7];
| for (var j = 0; j < 80; j++) {
| if (j < 16) {
| W[j] = new int64(str[j*2 + i], str[j*2 + i + 1]);
| } else {
| W[j] = safe_add_4(gamma1(W[j — 2]), W[j — 7], gamma0(W[j — 15]), W[j — 16]);
| }
| T1 = safe_add_5(h, sigma1(e), ch(e, f, g), K[j], W[j]);
| T2 = safe_add_2(sigma0(a), maj(a, b, c));
| h = g;
| g = f;
| f = e;
| e = safe_add_2(d, T1);
| d = c;
| c = b;
| b = a;
| a = safe_add_2(T1, T2);
| }
| H[0] = safe_add_2(a, H[0]);
| H[1] = safe_add_2(b, H[1]);
| H[2] = safe_add_2(c, H[2]);
| H[3] = safe_add_2(d, H[3]);
| H[4] = safe_add_2(e, H[4]);
| H[5] = safe_add_2(f, H[5]);
| H[6] = safe_add_2(g, H[6]);
| H[7] = safe_add_2(h, H[7]);
| }
| var binarray = [];
| for (var i = 0; i < H.length; i++) {
| binarray.push(H[i].highOrder);
| binarray.push(H[i].lowOrder);
| }
| return binb2hex(binarray);
|}»
);
Хэш = ScrptCtrl.Run(«SHA512», Стр);
ScrptCtrl = «»;
Возврат Хэш;
КонецФункции
Код функции на JScript взят с: http://www.happycode.info/javascript-sha-512/
Я думаю чуть-чуть модифицировав код, можно завставить шифровать и расшифровывать данные, добавить другие хэш-функции и т.д. Да и вообще использовать подобный подход в других направлениях.
PS: В комментариях к статье пользователь yukon предложил способ, который позволяет добиться того же, но испоьзуя другие возможности (требуется .Net):
Текст = Новый COMОбъект("System.Text.UTF8Encoding"); КриптоSHA512 = Новый COMОбъект("System.Security.Cryptography.SHA512Managed"); Хэш = КриптоSHA512.ComputeHash_2(Текст.GetBytes_4("ололо")).Выгрузить();
Этот код вернет массив из которого не сложно получить хэш строкой.
Сайт: www.softonit.ru
хэш-функция в принципе не способна шифровать и расшифровывать данные
(1) Я знаю, что хэш-функция это необратимая функция.
Я говорю о том, что с помощью такого подхода можно заставить ее и шифровать. Заменив функцию SHA-512, на, допустим, функцию по шифрованию AES, DES, RC4 и т.д.
Мы получим превосходные данные по скорости работы.
(2) «заставить ее и шифровать» кого — её? хэш-функцию, или 1С?
подход к исполнению в 1С скриптов js/vbs, как бы, не нов, ещё на 7.7 активно применялся.
(3) Конечно речь идет о 1С.
И я так же знаю, что такой подход не нов. Я об этом упомянул в статье:
(4) право, не хочется разводить холивар, но смысл этой публикации мне не совсем понятен.
1. код вчистую взят изhttp://www.happycode.info/javascript-sha-512/ , однако ссылки на первоисточник кода безжалостно выдраны.
2. используется типовой, давно известный приём вызова скрипта из 1С.
пользуясь такой идеологией, можно на каждый выложенный в интернете полезный джава-скрипт оформить отдельную публикацию на Инфостарте.
(5) Ссылку на первоисточник кода на JScript указал.
Сначала хотел уменьшить код функции, чтобы не раздувать публикацию. Хотел указать ссылку в конце, а потом благополучно забыл.
Спасибо что поправили.
Теперь про холивар и прочее.
Тут я не согласен с Вами.
Повторюсь еще раз… Я НЕ НАШЕЛ в интернете хэш-функции SHA-512 для 1С. НИГДЕ!
Решил поделиться с сообществом. Может быть кому-нибудь пригодится так же как и мне.
Что в этом плохого?
Спасибо, мне как новичку очень интересно. Хорошо бы было выложить подборку полезных скриптов для 1С, например получение путей к рабочему столу, других системных каталогов и т.п.
(6)
Зачем искать интернете хэш-функции SHA-512 для 1С? Все уже давно встроено в ОС, и отлично гуглится. В результате за 10 минут вполне можно сделать такое:
На выходе массив байтов.
(8) Пять балов! Где же Вы раньше были?
Честно искал, но ничего путевого не нашел.
Ваше решение красивее. Попробовал, возвращает массив из которого уже не сложно получить строку с хэшем.
Спасибо за второе решение.
(9)
Недалеко 🙂
Требует .Net, но на всех современных машинах он установлен, так что большой проблемой не будет.
Зайдите regedit-ом в HCRSystem.Security.Cryptography.xxxxxx там много интересного по теме.
(10) Добавил Ваш вариант в статью
Как-то начал писать статью как нативными средствами 1С получить хеш SHA-1 (на самом деле любой хеш при программировании его алгоритма, функции XOR, Left/Right Rotate и прочие в принципе готовы), но так как совпало со сменой работы бросил и уже год как висит неопубликованной. Смотрю интерес к получению хешей все же есть. Постараюсь дописать и опубликовать статью.
Товарищи а как зашифровать по ключу в HMAC-SHA512?
Смотрим СП — объект «ХешированиеДанных».
Зачем изобретать велосипед?
(14) IKSparrow, этот объект появился в 8.3 статья была создана в 2013 году, когда 8.3 еще была в зародыше и нужно это все было все на платформе 8.2.
Так что там только такие велосипеды и работали 🙂
(14) так ведь там максимум SHA-256 !
Здравствуйте!
«возвращает массив из которого уже не сложно получить строку с хэшем»
Подскажите пожалуйста как получить строку с хэшем?
(17)
Тоже стакнулся на этой фразе
Попробуй как написано здесь
http://1с-интеграция.рф/useful_links/47/364/
19+Вот пример шифрования HMAC
(13) Аналогично 19,20 используй Класс HMACSHA512
https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.hmacsha512(v=vs.110).aspx
(8) А как этот массив байтов далее преобразовывать? Вот так работает но не всегда))
Показать
В фоновом запуске вылетает на строке «ЯваСкрипт = HTML.documentElement.document.Script;» с ошибкой получения атрибута Script.
Очень нужно чтобы работало в фоне, в приведенном варианте от автора нет ключа, который можно указать КриптоSHA512.Key
Как сделать чтобы работало в фоновом запуске на файловой версии 1С ?
(21) Доброго времени суток! Если знаете, подскажите пожалуйста, как из
получить хеш для отправки на сервер не используя
Показать
Так как при фоновом задании вылетает с ошибкой что не найден атрибут «Script»
Так же есть майнер
(2)
Хеш функция это основа сквозной криптографии. Действительно можно легко и шифровать и дешифровать. А если использовать механизмы Кунингуава можно и RSA расширить
Голову сломал переписывая этот код на 1С. 🙁
(25) Результат то есть?
Результат получения открытого ключа btc из приватного?
(27) я ожидал, что в результате переписывания кода получится рабочий код на 1с.
(28) Я тоже ожидал, что то похожее получил, но есть ньюансы.