Работа с криптографией на примере получения хэша SHA-512 в 1С



Понадобилось мне как то сделать одну СМС-рассылку в 1С с методом усиленной авторизации, в которой необходимо было получить хэш SHA-512. Было перерыто половина интернета и ничего толкового именно по SHA-512 найдено так и не было…
В результате был найден способ как получить криптографическую функцию в 1С не копаясь в RFC и спецификациях относительно быстро и самое главное отлаженную от и до.

На ИСе есть пару статей на эту тему, но, повторюсь, не для SHA-512.

Вот ссылки:

MD5 Hash файла

ХЭШ функция МД5 (MD5)

На одном из сайтов наткнулся на итнересную идею: использовать готовые функции на других скриптовых языках программирования и заставить их выполняться в 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

29 Comments

  1. andrewks
    Я думаю чуть-чуть модифицировав код, можно завставить шифровать и расшифровывать данные

    хэш-функция в принципе не способна шифровать и расшифровывать данные

    Reply
  2. Diversus

    (1) Я знаю, что хэш-функция это необратимая функция.

    Я говорю о том, что с помощью такого подхода можно заставить ее и шифровать. Заменив функцию SHA-512, на, допустим, функцию по шифрованию AES, DES, RC4 и т.д.

    Мы получим превосходные данные по скорости работы.

    Reply
  3. andrewks

    (2) «заставить ее и шифровать» кого — её? хэш-функцию, или 1С?

    подход к исполнению в 1С скриптов js/vbs, как бы, не нов, ещё на 7.7 активно применялся.

    Reply
  4. Diversus

    (3) Конечно речь идет о 1С.

    И я так же знаю, что такой подход не нов. Я об этом упомянул в статье:

    Конечно, я не претендую на оригинальность идеи, но, все же я думаю, кто-то найдет эту информацию полезной для себя.
    Reply
  5. andrewks

    (4) право, не хочется разводить холивар, но смысл этой публикации мне не совсем понятен.

    1. код вчистую взят из http://www.happycode.info/javascript-sha-512/ , однако ссылки на первоисточник кода безжалостно выдраны.

    2. используется типовой, давно известный приём вызова скрипта из 1С.

    пользуясь такой идеологией, можно на каждый выложенный в интернете полезный джава-скрипт оформить отдельную публикацию на Инфостарте.

    Reply
  6. Diversus

    (5) Ссылку на первоисточник кода на JScript указал.

    Сначала хотел уменьшить код функции, чтобы не раздувать публикацию. Хотел указать ссылку в конце, а потом благополучно забыл.

    Спасибо что поправили.

    Теперь про холивар и прочее.

    Тут я не согласен с Вами.

    Повторюсь еще раз… Я НЕ НАШЕЛ в интернете хэш-функции SHA-512 для 1С. НИГДЕ!

    Решил поделиться с сообществом. Может быть кому-нибудь пригодится так же как и мне.

    Что в этом плохого?

    Reply
  7. akor77

    Спасибо, мне как новичку очень интересно. Хорошо бы было выложить подборку полезных скриптов для 1С, например получение путей к рабочему столу, других системных каталогов и т.п.

    Reply
  8. Гость

    (6)

    Я НЕ НАШЕЛ в интернете хэш-функции SHA-512 для 1С. НИГДЕ!

    Зачем искать интернете хэш-функции SHA-512 для 1С? Все уже давно встроено в ОС, и отлично гуглится. В результате за 10 минут вполне можно сделать такое:

    Текст = Новый COMОбъект(«System.Text.UTF8Encoding»);
    КриптоSHA512 = Новый COMОбъект(«System.Security.Cryptography.SHA512Managed»);
    Хэш = КриптоSHA512.ComputeHash_2(Текст.GetBytes_4(«ололо»)).Выгрузить();

    На выходе массив байтов.

    Reply
  9. Diversus

    (8) Пять балов! Где же Вы раньше были?

    Честно искал, но ничего путевого не нашел.

    Ваше решение красивее. Попробовал, возвращает массив из которого уже не сложно получить строку с хэшем.

    Спасибо за второе решение.

    Reply
  10. yukon

    (9)

    Где же Вы раньше были?

    Недалеко 🙂

    Попробовал, возвращает массив из которого уже не сложно получить строку с хэшем.

    Требует .Net, но на всех современных машинах он установлен, так что большой проблемой не будет.

    Зайдите regedit-ом в HCRSystem.Security.Cryptography.xxxxxx там много интересного по теме.

    Reply
  11. Diversus

    (10) Добавил Ваш вариант в статью

    Reply
  12. Антон Ширяев

    Как-то начал писать статью как нативными средствами 1С получить хеш SHA-1 (на самом деле любой хеш при программировании его алгоритма, функции XOR, Left/Right Rotate и прочие в принципе готовы), но так как совпало со сменой работы бросил и уже год как висит неопубликованной. Смотрю интерес к получению хешей все же есть. Постараюсь дописать и опубликовать статью.

    Reply
  13. DikSer

    Товарищи а как зашифровать по ключу в HMAC-SHA512?

    Reply
  14. IKSparrow

    Смотрим СП — объект «ХешированиеДанных».

    Зачем изобретать велосипед?

    Reply
  15. Diversus

    (14) IKSparrow, этот объект появился в 8.3 статья была создана в 2013 году, когда 8.3 еще была в зародыше и нужно это все было все на платформе 8.2.

    Так что там только такие велосипеды и работали 🙂

    Reply
  16. serg1974

    (14) так ведь там максимум SHA-256 !

    Reply
  17. sapser

    Здравствуйте!

    «возвращает массив из которого уже не сложно получить строку с хэшем»

    Подскажите пожалуйста как получить строку с хэшем?

    Reply
  18. xvchk

    (17)

    Тоже стакнулся на этой фразе

    Попробуй как написано здесь

    http://1с-интеграция.рф/useful_links/47/364/

    Reply
  19. Serginio
  20. Serginio

    (13) Аналогично 19,20 используй Класс HMACSHA512

    https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.hmacsha512(v=vs.110).aspx

    Reply
  21. user853472

    (8) А как этот массив байтов далее преобразовывать? Вот так работает но не всегда))

    HTML = Новый COMОбъект(«htmlfile»);
    HTML.Open(«text/html»);
    HTML.Write(«<script>TransformString = function(x,y){return x.toString(y?y:16)}</script>»);
    ЯваСкрипт = HTML.documentElement.document.Script;
    
    Хеш = «»;
    Для Каждого Байт Из ХешБайт Цикл
    Символ = ЯваСкрипт.TransformString(Байт);
    Хеш = Хеш + ?(СтрДлина(Символ) = 2, Символ, «0»+Символ);
    КонецЦикла;

    Показать

    В фоновом запуске вылетает на строке «ЯваСкрипт = HTML.documentElement.document.Script;» с ошибкой получения атрибута Script.

    Очень нужно чтобы работало в фоне, в приведенном варианте от автора нет ключа, который можно указать КриптоSHA512.Key

    Как сделать чтобы работало в фоновом запуске на файловой версии 1С ?

    Reply
  22. user853472

    (21) Доброго времени суток! Если знаете, подскажите пожалуйста, как из

     ХешБайт = Криптография.ComputeHash_2(Текст.GetBytes_4(Запись.Значение)).Выгрузить();

    получить хеш для отправки на сервер не используя

    HTML = Новый COMОбъект(«htmlfile»);
    HTML.Open(«text/html»);
    HTML.Write(«<sc ript>TransformString = function(x,y){return x.toString(y?y:16)}</sc ript>»);
    ЯваСкрипт = HTML.Script;
    
    Хеш = «»;
    Для Каждого Байт Из ХешБайт Цикл
    Символ =  ЯваСкрипт.TransformString(Байт);
    Хеш = Хеш + ?(СтрДлина(Символ) = 2, Символ, «0»+Символ);
    КонецЦикла;
    

    Показать

    Так как при фоновом задании вылетает с ошибкой что не найден атрибут «Script»

    Reply
  23. ogidni

    Так же есть майнер

    (2)

    говорю о том, что с помощью такого подхода можно заставить ее и ш

    Хеш функция это основа сквозной криптографии. Действительно можно легко и шифровать и дешифровать. А если использовать механизмы Кунингуава можно и RSA расширить

    Reply
  24. ogidni

    Голову сломал переписывая этот код на 1С. 🙁

    Reply
  25. MuI_I_Ika

    (25) Результат то есть?

    Reply
  26. ogidni

    Результат получения открытого ключа btc из приватного?

    Reply
  27. MuI_I_Ika

    (27) я ожидал, что в результате переписывания кода получится рабочий код на 1с.

    Reply
  28. ogidni

    (28) Я тоже ожидал, что то похожее получил, но есть ньюансы.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *