Имя: Пароль:
1C
1С v8
Помогите с хеш функцией MD5
0 Alex_MA
 
29.09.11
15:08
Всем доброго дня!

Функция MD5(КодируемаяСтрока, Хэш)
   
  ЗначениеВозврата = Истина;
  Попытка
      //http://pajhome.org.uk/crypt/md5/index.html
       
      ScrptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
      ScrptCtrl.Language = "JScript";
      ScrptCtrl.AddCode("
      |/*
      | * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
      | * Digest Algorithm, as defined in RFC 1321.
      | * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
      | * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
      | * Distributed under the BSD License
      | * See http://pajhome.org.uk/crypt/md5 for more info.
      | */
      |
      |/*
      | * Configurable variables. You may need to tweak these to be compatible with
      | * the server-side, but the defaults work in most cases.
      | */
      |var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
      |var b64pad  = """"; /* base-64 pad character. ""="" for strict RFC compliance   */
      |var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */
      |
      |/*
      | * These are the functions youll usually want to call
      | * They take string arguments and return either hex or base-64 encoded strings
      | */
      |function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
      |function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
      |function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
      |function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
      |function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
      |function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
      |
      |/*
      | * Perform a simple self-test to see if the VM is working
      | */
      |function md5_vm_test()
      |{
      |  return hex_md5(""abc"") == ""900150983cd24fb0d6963f7d28e17f72"";
      |}
      |
      |/*
      | * Calculate the MD5 of an array of little-endian words, and a bit length
      | */
      |function core_md5(x, len)
      |{
      |  /* append padding */
      |  x[len >> 5] |= 0x80 << ((len) % 32);
      |  x[(((len + 64) >>> 9) << 4) + 14] = len;
      |
      |  var a =  1732584193;
      |  var b = -271733879;
      |  var c = -1732584194;
      |  var d =  271733878;
      |
      |  for(var i = 0; i < x.length; i += 16)
      |  {
      |    var olda = a;
      |    var oldb = b;
      |    var oldc = c;
      |    var oldd = d;
      |
      |    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
      |    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
      |    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
      |    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
      |    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
      |    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
      |    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
      |    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
      |    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
      |    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
      |    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
      |    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
      |    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
      |    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
      |    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
      |    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
      |
      |    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
      |    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
      |    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
      |    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
      |    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
      |    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
      |    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
      |    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
      |    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
      |    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
      |    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
      |    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
      |    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
      |    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
      |    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
      |    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
      |
      |    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
      |    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
      |    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
      |    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
      |    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
      |    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
      |    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
      |    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
      |    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
      |    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
      |    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
      |    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
      |    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
      |    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
      |    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
      |    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
      |
      |    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
      |    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
      |    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
      |    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
      |    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
      |    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
      |    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
      |    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
      |    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
      |    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
      |    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
      |    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
      |    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
      |    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
      |    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
      |    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
      |
      |    a = safe_add(a, olda);
      |    b = safe_add(b, oldb);
      |    c = safe_add(c, oldc);
      |    d = safe_add(d, oldd);
      |  }
      |  return Array(a, b, c, d);
      |
      |}
      |
      |/*
      | * These functions implement the four basic operations the algorithm uses.
      | */
      |function md5_cmn(q, a, b, x, s, t)
      |{
      |  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
      |}
      |function md5_ff(a, b, c, d, x, s, t)
      |{
      |  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
      |}
      |function md5_gg(a, b, c, d, x, s, t)
      |{
      |  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
      |}
      |function md5_hh(a, b, c, d, x, s, t)
      |{
      |  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
      |}
      |function md5_ii(a, b, c, d, x, s, t)
      |{
      |  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
      |}
      |
      |/*
      | * Calculate the HMAC-MD5, of a key and some data
      | */
      |function core_hmac_md5(key, data)
      |{
      |  var bkey = str2binl(key);
      |  if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
      |
      |  var ipad = Array(16), opad = Array(16);
      |  for(var i = 0; i < 16; i++)
      |  {
      |    ipad[i] = bkey[i] ^ 0x36363636;
      |    opad[i] = bkey[i] ^ 0x5C5C5C5C;
      |  }
      |
      |  var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
      |  return core_md5(opad.concat(hash), 512 + 128);
      |}
      |
      |/*
      | * Add integers, wrapping at 2^32. This uses 16-bit operations internally
      | * to work around bugs in some JS interpreters.
      | */
      |function safe_add(x, y)
      |{
      |  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
      |  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
      |  return (msw << 16) | (lsw & 0xFFFF);
      |}
      |
      |/*
      | * Bitwise rotate a 32-bit number to the left.
      | */
      |function bit_rol(num, cnt)
      |{
      |  return (num << cnt) | (num >>> (32 - cnt));
      |}
      |
      |/*
      | * Convert a string to an array of little-endian words
      | * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
      | */
      |function str2binl(str)
      |{
      |  var bin = Array();
      |  var mask = (1 << chrsz) - 1;
      |  for(var i = 0; i < str.length * chrsz; i += chrsz)
      |    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
      |  return bin;
      |}
      |
      |/*
      | * Convert an array of little-endian words to a string
      | */
      |function binl2str(bin)
      |{
      |  var str = """";
      |  var mask = (1 << chrsz) - 1;
      |  for(var i = 0; i < bin.length * 32; i += chrsz)
      |    str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
      |  return str;
      |}
      |
      |/*
      | * Convert an array of little-endian words to a hex string.
      | */
      |function binl2hex(binarray)
      |{
      |  var hex_tab = hexcase ? ""0123456789ABCDEF"" : ""0123456789abcdef"";
      |  var str = """";
      |  for(var i = 0; i < binarray.length * 4; i++)
      |  {
      |    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
      |           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
      |  }
      |  return str;
      |}
      |
      |/*
      | * Convert an array of little-endian words to a base-64 string
      | */
      |function binl2b64(binarray)
      |{
      |  var tab = ""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"";
      |  var str = """";
      |  for(var i = 0; i < binarray.length * 4; i += 3)
      |  {
      |    var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
      |                | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
      |                |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
      |    for(var j = 0; j < 4; j++)
      |    {
      |      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
      |      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
      |    }
      |  }
      |  return str;
      |}
      |");
       
      Хэш = "";
      Хэш = ScrptCtrl.Run("hex_md5", КодируемаяСтрока);
  Исключение
      ЗначениеВозврата = Ложь;
      Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
  КонецПопытки;
  ScrptCtrl = "";
   
  Возврат ЗначениеВозврата;
   
КонецФункции // MD5()

Работает вроде нормально, как только начал проверять строки типа:
"туту, тата, пользователь, пароль" - начинает не правильно вычислять хеш. В чем здес проблема ?
1 vde69
 
29.09.11
15:10
где-то спионерил и чуток доработал


Функция Из_Число_В_16(Знач Значение)
   Результат = "";
   Пока Значение > 0 Цикл
       Остат = Значение % 16;
       Значение = (Значение - Остат) / 16;
       Результат = Сред("0123456789ABCDEF", Остат + 1, 1) + Результат
   КонецЦикла;
   
   Возврат Результат
КонецФункции

Функция ХэшБлоками(Строка, ДлинаБлока = 10, hash = 0, M = 31, TABLE_SIZE = 18446744073709551616)
   
   НачПозиция = 1;
   ДлинаСтроки = СтрДлина(Строка);
   Пока НачПозиция <= ДлинаСтроки Цикл
       СтрокаБлока = Сред(Строка, НачПозиция, ДлинаБлока);
       Для к = 1 По СтрДлина(СтрокаБлока) Цикл
           hash = M * hash + КодСимвола(СтрокаБлока, к)
       КонецЦикла;
       hash = hash % TABLE_SIZE;
       НачПозиция = НачПозиция + ДлинаБлока
   КонецЦикла;
   
   Возврат hash
КонецФункции

Функция ПолучитьХешТаблицы (ТЗ) Экспорт
   Результат = "";
   
   // работаем с копией
   _ТЗ = ТЗ.Скопировать();
   
   // приведем порядок ТЗ к единообразию
   // это исключит проблеммы с разным порядком элементов
   _ТЗ.Колонки.Добавить("СтрокаДляХеш");
   Для каждого эл Из _ТЗ Цикл
       эл.СтрокаДляХеш = СокрЛП(эл.Объект.УникальныйИдентификатор());
   КонецЦикла;    
   _ТЗ.Сортировать ("СтрокаДляХеш");
   
   // теперь строим строку для хеширования
   СтрокаСпискаДаных = "";
   Для каждого эл Из _ТЗ Цикл
       СтрокаСпискаДаных = СтрокаСпискаДаных + эл.СтрокаДляХеш + ";";
   КонецЦикла;    
   
   //ВнешняяКомпонента = Новый COMОбъект("CAPICOM.HashedData");
   //ВнешняяКомпонента.Algorithm = 3;
   //ВнешняяКомпонента.Hash(СтрокаСпискаДаных);
   //Результат = ВнешняяКомпонента.Value;
   //ВнешняяКомпонента = Неопределено;
   //
   // на 64х сервере работать не будет, нужно что-то придумать другое
   // типа:
   //
   //Dim sha As New SHA1CryptoServiceProvider()
   //Dim result As Byte() = sha.ComputeHash(dataArray)
   //
   // Пока сделал встроеным языком
   //
   
   Результат = Из_Число_В_16(ХэшБлоками(СтрокаСпискаДаных, 5381, 33));
   
   Возврат Результат;
КонецФункции
2 Alex_MA
 
29.09.11
15:21
(1)работает все Ок?
3 vde69
 
29.09.11
15:22
(2) у меня работает
4 vde69
 
29.09.11
15:23
(2) CAPICOM.HashedData - гарантировано работает, просто у меня 64х сервер и там не пашет
5 fisher
 
29.09.11
15:28
А через восьмерочный криптографический интерфейс не взлетит?
Кто вообще имел с ним реальный опыт?
6 vde69
 
29.09.11
15:34
(5) там обязательно требуется сертификат
7 Maxus43
 
29.09.11
15:34
(5) сертификат надо тудыть вставлять
v8: 1c 8.2 МенеджерКриптографии
8 Alex_MA
 
29.09.11
15:42
(3)что то у тебя там лишка закоментированно, ибо такими строчками кода не отделаешься хешируя строку. имхо
9 fisher
 
29.09.11
15:45
(6) А это проблема? Я в этом деле не спец просто.
10 vde69
 
29.09.11
15:46
(8)

строка хешируется
Результат = Из_Число_В_16(ХэшБлоками(СтрокаСпискаДаных, 5381, 33))


----------------------------------------------------
или 100% работает если CAPICOM.DLL совместима с текущей ОС

   
ВнешняяКомпонента = Новый COMОбъект("CAPICOM.HashedData");
ВнешняяКомпонента.Algorithm = 3;
ВнешняяКомпонента.Hash(СтрокаСпискаДаных);
Результат = ВнешняяКомпонента.Value;
11 Alex_MA
 
29.09.11
15:50
(10)CAPICOM.DLL для x64 и x32 как я понимаю разная и еще завязана на вид ОС. так ?
12 Alex_MA
 
29.09.11
15:54
(10)

Функция Захешировать(Хеш)

ВнешняяКомпонента = Новый COMОбъект("CAPICOM.HashedData");
ВнешняяКомпонента.Algorithm = 3;
ВнешняяКомпонента.Hash(СтрокаСпискаДаных);

РезультатCAPICOM = ВнешняяКомпонента.Value;

//А дальше переведем просто в hex

Возврат Из_Число_В_16(РезультатCAPICOM ); //Веренет hex md5

КонецФункции

Функция Из_Число_В_16(Знач Значение)
   Результат = "";
   Пока Значение > 0 Цикл
       Остат = Значение % 16;
       Значение = (Значение - Остат) / 16;
       Результат = Сред("0123456789ABCDEF", Остат + 1, 1) + Результат
   КонецЦикла;
   
   Возврат Результат
КонецФункции

Все правильно сделал ?
13 Alex_MA
 
29.09.11
15:55
Функция Захешировать(Хеш)

ВнешняяКомпонента = Новый COMОбъект("CAPICOM.HashedData");
ВнешняяКомпонента.Algorithm = 3;
ВнешняяКомпонента.Hash(Хеш);

РезультатCAPICOM = ВнешняяКомпонента.Value;

//А дальше переведем просто в hex


Возврат Из_Число_В_16(РезультатCAPICOM ); //Веренет hex md5


КонецФункции

Функция Из_Число_В_16(Знач Значение)
   Результат = "";
   Пока Значение > 0 Цикл
       Остат = Значение % 16;
       Значение = (Значение - Остат) / 16;
       Результат = Сред("0123456789ABCDEF", Остат + 1, 1) + Результат
   КонецЦикла;
   
   Возврат Результат
КонецФункции
14 vde69
 
29.09.11
15:57
Функция Захешировать(Хеш)

ВнешняяКомпонента = Новый COMОбъект("CAPICOM.HashedData");
ВнешняяКомпонента.Algorithm = 3;
ВнешняяКомпонента.Hash(Хеш);
Р = ВнешняяКомпонента.Value;
ВнешняяКомпонента=неопределено;
Возврат Р;

КонецФункции
15 vde69
 
29.09.11
15:58
(14)+

под 32х - работает
под 64х мне не удалось запустить
16 Vetal_978
 
29.09.11
15:58
А кто выступает криптопровайдером? CAPICOM не оно? Что-то типа КриптоПРО надоть?
17 vde69
 
29.09.11
16:00
(16) CAPICOM достаточно
18 skunk
 
29.09.11
16:03
на радуйся

http://zalil.ru/31779870
19 Alex_MA
 
29.09.11
16:03
(17) написал след. код:

Функция Захешировать(Хеш)

ВнешняяКомпонента = Новый COMОбъект("CAPICOM.HashedData");
ВнешняяКомпонента.Algorithm = 3;
ВнешняяКомпонента.Hash(Хеш);

РезультатCAPICOM = ВнешняяКомпонента.Value;

//А дальше переведем просто в hex
Сообщить(РезультатCAPICOM);

КонецФункции

Процедура Кнопка2Нажатие(Элемент)
   Захешировать(СокрЛП(ПарольВхода) );
КонецПроцедуры

ввожу "туту"
Результат "810503098561BE851BAFCD0FEC24C2FE" - он не корректный
20 Alex_MA
 
29.09.11
16:06
(18)твоя обработка вернула md5("туту")=6e1412fca31cbd35d0f50f12fcc70b0f, это не правильно, можешь проверить:
http://pajhome.org.uk/crypt/md5/index.html
21 vde69
 
29.09.11
16:12
(19) кто сказал, что он не корректный?

ты хочешь сказать что РОДНАЯ КРИПТО библиотека мелкомягких выдает некоректный результат?

есть много вариантов
1. - сайт левый и выдает фигню
2. - на сайте проблеммы с кодировкой русских букв
3. - на сайте кодируется бинарная строка (то есть коды сисмволов)

и т.д.
22 skunk
 
29.09.11
16:14
(20)ну вставь туда код из скрипта ... если тебе нужен 2.2 ...
23 skunk
 
29.09.11
16:15
(21)версий мд5 несколько ... последня 2.2 ... сыр скрипта на яве для данной версии доступен по ссылке из (20) ...
24 vde69
 
29.09.11
16:21
в капикоме реализованы алгоритмы хеширования

CAPICOM_HASH_ALGORITHM_SHA1    
SHA1 hashing algorithm.
CAPICOM_HASH_ALGORITHM_MD2    
MD2 hashing algorithm.
CAPICOM_HASH_ALGORITHM_MD4    
MD4 hashing algorithm.
CAPICOM_HASH_ALGORITHM_MD5    
MD5 hashing algorithm.
CAPICOM_HASH_ALGORITHM_SHA_256    
SHA-256 hash algorithm.
CAPICOM 2.0.0.3 and earlier:  This value is not supported.
Windows XP, Windows 2000:  This value is not supported.
CAPICOM_HASH_ALGORITHM_SHA_384    
SHA-384 hash algorithm.
CAPICOM 2.0.0.3 and earlier:  This value is not supported.
Windows XP, Windows 2000:  This value is not supported.
CAPICOM_HASH_ALGORITHM_SHA_512    
SHA-512 hash algorithm.
CAPICOM 2.0.0.3 and earlier:  This value is not supported.
Windows XP, Windows 2000:  This value is not supported.

http://msdn.microsoft.com/en-us/library/aa382443(v=VS.85).aspx
25 Alex_MA
 
29.09.11
16:23
(24)да, уже глянул, спасибо. Кстати, все что написано в (21) вряд ли. Т.к. проверял и этой ф-ей:
http://php.net/manual/ru/function.md5.php

На сайтах и php ф-я выдают одинаковые значения.
26 vde69
 
29.09.11
16:27
(25) сам алгоритм один, разные значения констатн и длинна получаемого хеша, поищи может их можно в крипторовайдере менять...

вообще сам много чего облазил, реализаций полно и далеко не все совместимы, а тебе вообще зачем?

может тебе ЭЦП нужно а не хеш?
27 Alex_MA
 
29.09.11
16:28
Дело в том, что пишу web сервис, авторизация использует в том числе и хеш функцию. Однако, ф-я md5 на php никак не хочет сходиться с ф-ей и (18) и (19). Что делать ?
28 vde69
 
29.09.11
16:34
(27) нафига при авторизации хешь функция?

абсолютно без разницы что ты передаешь на сервер хеш или открытый пароль, если перехватят - этого достаточно для генерации корректного запроса.

если хочешь обесопасится от перехвата - ssl спасет тебя, (сначало обмен открытыми сеансовыми ключами и потом шифрование всего трафика ими)
29 Alex_MA
 
29.09.11
16:35
(28)у меня еще есть загыгулистая формула :)
30 Alex_MA
 
29.09.11
16:50
можно из кода 1С обратиться к php функции ?
31 andrewks
 
29.09.11
16:55
32 Vetal_978
 
29.09.11
17:05
Народ, а как сгенерить самопальный сертификат? Чем это можно сделать?
33 Rebelx
 
29.09.11
17:12
openssl
34 Vetal_978
 
29.09.11
17:38
(33) спасибо, получилось
35 Alex_MA
 
30.09.11
09:20
пытаюсь встроить js сырец в код 1С, но почему то возникает ошибка:


{Форма.Форма.Форма(8)}: Ошибка при вызове метода контекста (AddCode): Произошла исключительная ситуация (Ошибка компиляции Microsoft JScript): Синтаксическая ошибка

Вот код:


функция стрМД5(стрЗначение) экспорт
   Ответ = неопределено;
   попытка
       олеСкрипт = новый COMОбъект("MSScriptControl.ScriptControl");
       олеСкрипт.Language = "JScript";
       олеСкрипт.AddCode("
       |var hexcase = 0;
       |var b64pad = """";
       |var chrsz = 8;
       |
       |function hex_md5(s)
       |{
       |    return binl2hex(core_md5(str2binl(s), s.length * chrsz));
       |}
       |
       |function b64_md5(s)
       |{
       |    return binl2b64(core_md5(str2binl(s), s.length * chrsz));
       |}
       |
       |function str_md5(s)
       |{
       |    return binl2str(core_md5(str2binl(s), s.length * chrsz));
       |}
       |
       |function hex_hmac_md5(key, data)
       |{
       |    return binl2hex(core_hmac_md5(key, data));
       |}
       |
       |function b64_hmac_md5(key, data)
       |{
       |    return binl2b64(core_hmac_md5(key, data));
       |}
       |
       |function str_hmac_md5(key, data)
       |{
       |    return binl2str(core_hmac_md5(key, data));
       |}
       |
       |function md5_vm_test()
       |{
       |    return hex_md5(""abc"") == ""900150983cd24fb0d6963f7d28e17f72"";
       |}
       |
       |function core_md5(x, len)
       |{
       |    x[len >> 5] |= 0x80 << ((len) % 32);
       |    x[(((len + 64) >>> 9) << 4) + 14] = len;
       |    var a =  1732584193;
       |    var b = -271733879;
       |    var c = -1732584194;
       |    var d =  271733878;
       |    for(var i = 0; i < x.length; i += 16)
       |    {
       |        var olda = a;
       |        var oldb = b;
       |        var oldc = c;
       |        var oldd = d;
       |        a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
       |        d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
       |        c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
       |        b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
       |        a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
       |        d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
       |        c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
       |        b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
       |        a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
       |        d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
       |        c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
       |        b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
       |        a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
       |        d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
       |        c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
       |        b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
       |        a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
       |        d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
       |        c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
       |        b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
       |        a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
       |        d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
       |        c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
       |        b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
       |        a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
       |        d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
       |        c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
       |        b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
       |        a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
       |        d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
       |        c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
       |        b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
       |        a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
       |        d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
       |        c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
       |        b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
       |        a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
       |        d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
       |        c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
       |        b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
       |        a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
       |        d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
       |        c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
       |        b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
       |        a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
       |        d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
       |        c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
       |        b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
       |        a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
       |        d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
       |        c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
       |        b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
       |        a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
       |        d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
       |        c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
       |        b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
       |        a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
       |        d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
       |        c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
       |        b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
       |        a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
       |        d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
       |        c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
       |        b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
       |        a = safe_add(a, olda);
       |        b = safe_add(b, oldb);
       |        c = safe_add(c, oldc);
       |        d = safe_add(d, oldd);
       |    }
       |    return Array(a, b, c, d);
       |}
       |
       |function md5_cmn(q, a, b, x, s, t)
       |{
       |    return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
       |}
       |
       |function md5_ff(a, b, c, d, x, s, t)
       |{
       |    return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
       |}
       |
       |function md5_gg(a, b, c, d, x, s, t)
       |{
       |    return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
       |}
       |
       |function md5_hh(a, b, c, d, x, s, t)
       |{
       |    return md5_cmn(b ^ c ^ d, a, b, x, s, t);
       |}
       |
       |function md5_ii(a, b, c, d, x, s, t)
       |{
       |    return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
       |}
       |
       |function core_hmac_md5(key, data)
       |{
       |    var bkey = str2binl(key);
       |    if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
       |    var ipad = Array(16), opad = Array(16);
       |    for(var i = 0; i < 16; i++)
       |    {
       |        ipad[i] = bkey[i] ^ 0x36363636;
       |        opad[i] = bkey[i] ^ 0x5C5C5C5C;
       |    }
       |    var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
       |    return core_md5(opad.concat(hash), 512 + 128);
       |}
       |
       |function safe_add(x, y)
       |{
       |    var lsw = (x & 0xFFFF) + (y & 0xFFFF);
       |    var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
       |    return (msw << 16) | (lsw & 0xFFFF);
       |}
       |
       |function bit_rol(num, cnt)
       |{
       |    return (num << cnt) | (num >>> (32 - cnt));
       |}
       |
       |function str2binl(str)
       |{
       |    var bin = Array();
       |    var mask = (1 << chrsz) - 1;
       |    for(var i = 0; i < str.length * chrsz; i += chrsz)
       |        bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
       |    return bin;
       |}
       |
       |function binl2str(bin)
       |{
       |    var str = """";
       |    var mask = (1 << chrsz) - 1;
       |    for(var i = 0; i < bin.length * 32; i += chrsz)
       |        str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
       |    return str;
       |}
       |
       |function binl2hex(binarray)
       |{
       |    var hex_tab = hexcase ? ""0123456789ABCDEF"" : ""0123456789abcdef"";
       |    var str = """";
       |    for(var i = 0; i < binarray.length * 4; i++)
       |    {
       |        str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
       |               hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
       |    }
       |    return str;
       |}
       |
       |function binl2b64(binarray)
       |{
       |    var tab = ""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"";
       |    var str = """";
       |    for(var i = 0; i < binarray.length * 4; i += 3)
       |    {
       |        var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
       |                    | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
       |                    |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
       |        for(var j = 0; j < 4; j++)
       |        {
       |            if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
       |            else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
       |        }
       |    }
       |    return str;
       |}
       |");
       Ответ = олеСкрипт.Run("hex_md5", стрЗначение);
   исключение
       Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
   конецпопытки;
   возврат Ответ;
конецфункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
   Сообщить(стрМД5(Данные));
КонецПроцедуры
36 Alex_MA
 
30.09.11
09:27
все, сделал
вот, кому интересно, MD5 v2.2 на js

Процедура РассчитатьMD5Нажатие(Элемент)
   
   Попытка
       
       ScrptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
       ScrptCtrl.Language = "JScript";
       ScrptCtrl.AddCode("

       |var hexcase = 0;   /* hex output format. 0 - lowercase; 1 - uppercase        */
       |var b64pad  = """";  /* base-64 pad character. ""="" for strict RFC compliance   */
       |
       |function hex_md5(s)    { return rstr2hex(rstr_md5(str2rstr_utf8(s))); }
       |function b64_md5(s)    { return rstr2b64(rstr_md5(str2rstr_utf8(s))); }
       |function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }
       |function hex_hmac_md5(k, d)
       |  { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
       |function b64_hmac_md5(k, d)
       |  { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
       |function any_hmac_md5(k, d, e)
       |  { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }
       |
       |function md5_vm_test()
       |{
       |  return hex_md5(""abc"").toLowerCase() == ""900150983cd24fb0d6963f7d28e17f72"";
       |}
       |
       |function rstr_md5(s)
       |{
       |  return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
       |}
       |
       |function rstr_hmac_md5(key, data)
       |{
       |  var bkey = rstr2binl(key);
       |  if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8);
       |
       |  var ipad = Array(16), opad = Array(16);
       |  for(var i = 0; i < 16; i++)
       |  {
       |    ipad[i] = bkey[i] ^ 0x36363636;
       |    opad[i] = bkey[i] ^ 0x5C5C5C5C;
       |  }
       |
       |  var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
       |  return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
       |}
       |
       |function rstr2hex(input)
       |{
       |  try { hexcase } catch(e) { hexcase=0; }
       |  var hex_tab = hexcase ? ""0123456789ABCDEF"" : ""0123456789abcdef"";
       |  var output = """";
       |  var x;
       |  for(var i = 0; i < input.length; i++)
       |  {
       |    x = input.charCodeAt(i);
       |    output += hex_tab.charAt((x >>> 4) & 0x0F)
       |           +  hex_tab.charAt( x        & 0x0F);
       |  }
       |  return output;
       |}
       |
       |function rstr2b64(input)
       |{
       |  try { b64pad } catch(e) { b64pad=''; }
       |  var tab = ""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"";
       |  var output = """";
       |  var len = input.length;
       |  for(var i = 0; i < len; i += 3)
       |  {
       |    var triplet = (input.charCodeAt(i) << 16)
       |                | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
       |                | (i + 2 < len ? input.charCodeAt(i+2)      : 0);
       |    for(var j = 0; j < 4; j++)
       |    {
       |      if(i * 8 + j * 6 > input.length * 8) output += b64pad;
       |      else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
       |    }
       |  }
       |  return output;
       |}
       |
       |function rstr2any(input, encoding)
       |{
       |  var divisor = encoding.length;
       |  var i, j, q, x, quotient;
       |
       |  var dividend = Array(Math.ceil(input.length / 2));
       |  for(i = 0; i < dividend.length; i++)
       |  {
       |    dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
       |  }
       |
       |  var full_length = Math.ceil(input.length * 8 /
       |                                    (Math.log(encoding.length) / Math.log(2)));
       |  var remainders = Array(full_length);
       |  for(j = 0; j < full_length; j++)
       |  {
       |    quotient = Array();
       |    x = 0;
       |    for(i = 0; i < dividend.length; i++)
       |    {
       |      x = (x << 16) + dividend[i];
       |      q = Math.floor(x / divisor);
       |      x -= q * divisor;
       |      if(quotient.length > 0 || q > 0)
       |        quotient[quotient.length] = q;
       |    }
       |    remainders[j] = x;
       |    dividend = quotient;
       |  }
       |
       |  var output = """";
       |  for(i = remainders.length - 1; i >= 0; i--)
       |    output += encoding.charAt(remainders[i]);
       |
       |  return output;
       |}
       |
       |function str2rstr_utf8(input)
       |{
       |  var output = """";
       |  var i = -1;
       |  var x, y;
       |
       |  while(++i < input.length)
       |  {
       |    x = input.charCodeAt(i);
       |    y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
       |    if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
       |    {
       |      x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
       |      i++;
       |    }
       |
       |    if(x <= 0x7F)
       |      output += String.fromCharCode(x);
       |    else if(x <= 0x7FF)
       |      output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
       |                                    0x80 | ( x         & 0x3F));
       |    else if(x <= 0xFFFF)
       |      output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
       |                                    0x80 | ((x >>> 6 ) & 0x3F),
       |                                    0x80 | ( x         & 0x3F));
       |    else if(x <= 0x1FFFFF)
       |      output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
       |                                    0x80 | ((x >>> 12) & 0x3F),
       |                                    0x80 | ((x >>> 6 ) & 0x3F),
       |                                    0x80 | ( x         & 0x3F));
       |  }
       |  return output;
       |}
       |
       |function str2rstr_utf16le(input)
       |{
       |  var output = """";
       |  for(var i = 0; i < input.length; i++)
       |    output += String.fromCharCode( input.charCodeAt(i)        & 0xFF,
       |                                  (input.charCodeAt(i) >>> 8) & 0xFF);
       |  return output;
       |}
       |
       |function str2rstr_utf16be(input)
       |{
       |  var output = """";
       |  for(var i = 0; i < input.length; i++)
       |    output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
       |                                   input.charCodeAt(i)        & 0xFF);
       |  return output;
       |}
       |
       |function rstr2binl(input)
       |{
       |  var output = Array(input.length >> 2);
       |  for(var i = 0; i < output.length; i++)
       |    output[i] = 0;
       |  for(var i = 0; i < input.length * 8; i += 8)
       |    output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);
       |  return output;
       |}
       |
       |function binl2rstr(input)
       |{
       |  var output = """";
       |  for(var i = 0; i < input.length * 32; i += 8)
       |    output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);
       |  return output;
       |}
       |
       |function binl_md5(x, len)
       |{
       |  x[len >> 5] |= 0x80 << ((len) % 32);
       |  x[(((len + 64) >>> 9) << 4) + 14] = len;
       |
       |  var a =  1732584193;
       |  var b = -271733879;
       |  var c = -1732584194;
       |  var d =  271733878;
       |
       |  for(var i = 0; i < x.length; i += 16)
       |  {
       |    var olda = a;
       |    var oldb = b;
       |    var oldc = c;
       |    var oldd = d;
       |
       |    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
       |    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
       |    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
       |    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
       |    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
       |    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
       |    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
       |    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
       |    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
       |    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
       |    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
       |    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
       |    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
       |    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
       |    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
       |    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
       |
       |    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
       |    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
       |    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
       |    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
       |    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
       |    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
       |    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
       |    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
       |    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
       |    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
       |    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
       |    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
       |    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
       |    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
       |    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
       |    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
       |
       |    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
       |    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
       |    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
       |    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
       |    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
       |    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
       |    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
       |    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
       |    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
       |    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
       |    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
       |    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
       |    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
       |    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
       |    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
       |    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
       |
       |    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
       |    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
       |    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
       |    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
       |    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
       |    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
       |    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
       |    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
       |    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
       |    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
       |    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
       |    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
       |    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
       |    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
       |    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
       |    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
       |
       |    a = safe_add(a, olda);
       |    b = safe_add(b, oldb);
       |    c = safe_add(c, oldc);
       |    d = safe_add(d, oldd);
       |  }
       |  return Array(a, b, c, d);
       |}
       |
       |function md5_cmn(q, a, b, x, s, t)
       |{
       |  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
       |}
       |function md5_ff(a, b, c, d, x, s, t)
       |{
       |  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
       |}
       |function md5_gg(a, b, c, d, x, s, t)
       |{
       |  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
       |}
       |function md5_hh(a, b, c, d, x, s, t)
       |{
       |  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
       |}
       |function md5_ii(a, b, c, d, x, s, t)
       |{
       |  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
       |}
       |
       |function safe_add(x, y)
       |{
       |  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
       |  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
       |  return (msw << 16) | (lsw & 0xFFFF);
       |}
       |
       |function bit_rol(num, cnt)
       |{
       |  return (num << cnt) | (num >>> (32 - cnt))
       |};");
       
       Хэш = "";
       Хэш = ScrptCtrl.Run("hex_md5", КодируемаяСтрока);
   Исключение
       Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
       Возврат;
   КонецПопытки;
   
   Сообщить(Хэш);
   
КонецПроцедуры
37 Alex_MA
 
30.09.11
09:27
(36)сходитсья с php- шной ф-ей
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс