Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Проблема формирования MD5 при использовании CAdESCOM.HashedData
Статус: Новичок
Группы: Участники
Зарегистрирован: 20.04.2023(UTC) Сообщений: 3
|
Создал небольшую и простую функцию для расчёта контрольных сумм (синтаксис 1С v.7.7): Цитата:Функция глКонтрольнаяСумма(Знач СтрокаБаза, ВидАлгоритма=3) Перем Hashed;
//Hashed = СоздатьОбъект("CAPICOM.HashedData.1"); Hashed = СоздатьОбъект("CAdESCOM.HashedData"); Hashed.Algorithm = ВидАлгоритма; Hashed.DataEncoding = 0; Hashed.Hash(глUTF8(СтрокаБаза)); Возврат Hashed.Value;
КонецФункции Функция сразу заработала, и с использованием объекта "CAPICOM.HashedData.1", при указании единственного параметра "Algorithm = 3" - легко рассчитала контрольную сумму для строки "1971" равную: 9C9D31BC31D2C674FCEB0A580FCD39E1. Но все контрольные методы (начиная от интернет сервиса "http://onlinemd5.com/" и заканчивая командной строкой в Линукс "echo -n 1971 | md5sum" дают совершенно другой результат: de73998802680548b916f1947ffbad76. Резонно подумав что что-то неладно решил капитан что виновата команда…Сменил "устаревшую" "CAPICOM.HashedData.1" (что она может знать о кодировках?! - старая развалина!) на новомодную "CAdESCOM.HashedData", задал параметр "DataEncoding = 0" (для UTF8-строки) и - Вуаля! Получаем ровно ту же контрольную сумму для "1971" равную: 9C9D31BC31D2C674FCEB0A580FCD39E1. А нужна по всем контрольным источникам совсем даже наоборот: de73998802680548b916f1947ffbad76. Многократно перепроверено как выглядит UTF8-строка подаваемая методу Hashed.Hash (в HEX-редакторе это выглядит как: 31 39 37 31 и если отправить вывод команды echo -n 1971 в файл получаем тот же HEX-набор: 31 39 37 31) и для неё HEX-редактор так же рассчитывает контрольную сумму : de73998802680548b916f1947ffbad76. Прошу помочь понять мою ошибку. Почему значение Value возвращаемое объектом "CAdESCOM.HashedData": 9C9D31BC31D2C674FCEB0A580FCD39E1 не совпадает с контрольной суммой, которую (единогласно!) дают все остальные методы расчёта MD5: de73998802680548b916f1947ffbad76 ? Отредактировано пользователем 20 апреля 2023 г. 15:03:42(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 30.06.2016(UTC) Сообщений: 3,451 Сказал «Спасибо»: 53 раз Поблагодарили: 791 раз в 731 постах
|
Обсуждение вопроса ведется на портале технической поддержки в рамках обращения № 83219. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
icphasheddatadataencodingЦитата: По умолчанию свойство имеет значение CADESCOM_STRING_TO_UCS2LE. Задание свойства DataEncoding сбрасывает состояние объекта.
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
base64строка='MTk3MQ==';
Hashed.Algorithm = ВидАлгоритма; Hashed.DataEncoding = 1; Hashed.Hash(base64строка);
DE73998802680548B916F1947FFBAD76
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,322 Сказал «Спасибо»: 549 раз Поблагодарили: 2208 раз в 1723 постах
|
Автор: Северная чернь
Функция сразу заработала, и с использованием объекта "CAPICOM.HashedData.1", при указании единственного параметра "Algorithm = 3" - легко рассчитала контрольную сумму для строки "1971" равную: 9C9D31BC31D2C674FCEB0A580FCD39E1. Но все контрольные методы (начиная от интернет сервиса "http://onlinemd5.com/" и заканчивая командной строкой в Линукс "echo -n 1971 | md5sum" дают совершенно другой результат: de73998802680548b916f1947ffbad76. 9C9D31BC31D2C674FCEB0A580FCD39E1 получается (CADESCOM_STRING_TO_UCS2LE) при хешировании байтов (hex): 31 00 39 00 37 00 31 00 что даёт 1971 "текстом" а конвертируя (hex: 31 39 37 31 ) в base64 и выставив предварительно DataEncoding = 1, получаем ожидаемый хеш. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 20.04.2023(UTC) Сообщений: 3
|
Андрей, огромное спасибо за отклик.
Ошибку я свою теперь понимаю. Осталось понять как обойтись без конвертации в base64? Мне нужно работать с UCS2LE. Нужен метод перевода "Строки"(тип данных в 1С v.7.7) в UCS2LE. В 1С v.7.7 и типа данных то такого нет(строка в кодировке UCS2LE)…
Может быть кто-то откликнется с опытом подобной работы - Как перевести "Строку" в UCS2LE и в каком типе данных хранить это при обработке в 1С v.7.7?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 20.04.2023(UTC) Сообщений: 3
|
В результате добился работы через base64. Собственно функция расчёта контрольной суммы: Цитата://****************************************************************************** //ВидАлгоритма может принимать значения: // SHA1 - CAPICOM_HASH_ALGORITHM_SHA1 - 0; // MD2 - CAPICOM_HASH_ALGORITHM_MD2 - 1; // MD4 - CAPICOM_HASH_ALGORITHM_MD4 - 2; // MD5 - CAPICOM_HASH_ALGORITHM_MD5 - 3; // SHA-256 - CAPICOM_HASH_ALGORITHM_SHA_256 - 4; // SHA-384 - CAPICOM_HASH_ALGORITHM_SHA_384 - 5; // SHA-512 - CAPICOM_HASH_ALGORITHM_SHA_512 - 6. Функция глКонтрольнаяСумма(Знач СтрокаБаза, ВидАлгоритма=3) Перем Hashed, База; База = глBase64_ИзТекста(глUTF8(СтрокаБаза)); Hashed = СоздатьОбъект("CAdESCOM.HashedData"); Hashed.Algorithm = ВидАлгоритма; Hashed.DataEncoding = 1; Hashed.Hash(База); Возврат Hashed.Value; КонецФункции
Очень надеюсь что CAdESCOM, номера алгоритмов оставили соответствующие CAPICOM. Проверять нет времени. Используются две вспомогательные функции глUTF8() и глBase64_ИзТекста(), привожу их так же ниже: Цитата://****************************************************************************** Функция глBase64_ИзТекста(Знач ИсходныеДанные) Экспорт Перем Сдвиг8[3], Сдвиг6[4]; Если ПустаяСтрока(ИсходныеДанные)=1 Тогда Возврат "" КонецЕсли; Результат = ""; Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; Сдвиг8[1] = 65536; // 00000001 00000000 00000000 Сдвиг8[2] = 256; // 00000000 00000001 00000000 Сдвиг8[3] = 1; // 00000000 00000000 00000001 Сдвиг6[1] = 262144; // 000001 000000 000000 000000 Сдвиг6[2] = 4096; // 000000 000001 000000 000000 Сдвиг6[3] = 64; // 000000 000000 000001 000000 Сдвиг6[4] = 1; // 000000 000000 000000 000001 Шаги = Цел(СтрДлина(ИсходныеДанные)/3)+?(СтрДлина(ИсходныеДанные)%3=0,0,1); Для а = 1 По Шаги Цикл Группа = Сред(ИсходныеДанные,3*а-2,3); Значение = 0; Для аа = 1 По 3 Цикл Значение = Значение + КодСимв(Сред(Группа,аа,1)) * Сдвиг8[аа]; КонецЦикла; Для аа = 1 По 4 Цикл КодСимвола = Цел(Значение / Сдвиг6[аа]); Результат = Результат + Сред(Алфавит,КодСимвола+1,1); Значение = Значение - КодСимвола * Сдвиг6[аа]; КонецЦикла; КонецЦикла; Если ПустаяСтрока(Сред(Группа,2,1)) = 1 Тогда Результат = Лев(Результат,СтрДлина(Результат)-2)+"=="; ИначеЕсли ПустаяСтрока(Сред(Группа,3,1)) = 1 Тогда Результат = Лев(Результат,СтрДлина(Результат)-1)+"="; КонецЕсли; Возврат Результат; КонецФункции Цитата://****************************************************************************** Функция глUTF8(Стр) Экспорт Стр=СокрЛП(Стр); Длина=СтрДлина(Стр); Итог=""; Для Н=1 По Длина Цикл Знак=Сред(Стр,Н,1); Код=КодСимв(Знак); Если Код<128 Тогда Итог=Итог+Знак; Иначе Если (Код>=КодСимв("А"))И(Код<=КодСимв("п")) Тогда Итог=Итог+Симв(208)+Симв(144+Код-КодСимв("А")); ИначеЕсли (Код>=КодСимв("р"))И(Код<=КодСимв("я")) Тогда Итог=Итог+Симв(209)+Симв(128+Код-КодСимв("р")); ИначеЕсли (Знак="ё") Тогда Итог=Итог+Симв(209)+Симв(145); ИначеЕсли (Знак="Ё") Тогда Итог=Итог+Симв(208)+Симв(129); ИначеЕсли (Знак="№") Тогда Итог=Итог+Симв(226)+Симв(132)+Симв(150); КонецЕсли; КонецЕсли; КонецЦикла; Возврат Итог; КонецФункции
Ну и помните что для работы с CAdESCOM необходима установленная в системе соответствующая библиотека! Надеюсь мой опыт будет полезен другим…
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Проблема формирования MD5 при использовании CAdESCOM.HashedData
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close