Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Северная чернь  
#1 Оставлено : 20 апреля 2023 г. 15:00:14(UTC)
Северная чернь

Статус: Новичок

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Александр Лавник  
#2 Оставлено : 21 апреля 2023 г. 16:41:22(UTC)
Александр Лавник

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 30.06.2016(UTC)
Сообщений: 3,404
Мужчина
Российская Федерация

Сказал «Спасибо»: 53 раз
Поблагодарили: 779 раз в 721 постах
Обсуждение вопроса ведется на портале технической поддержки в рамках обращения № 83219.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#3 Оставлено : 21 апреля 2023 г. 16:52:10(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
icphasheddatadataencoding

Цитата:

По умолчанию свойство имеет значение CADESCOM_STRING_TO_UCS2LE. Задание свойства DataEncoding сбрасывает состояние объекта.

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#4 Оставлено : 21 апреля 2023 г. 16:58:16(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
base64строка='MTk3MQ==';

Hashed.Algorithm = ВидАлгоритма;
Hashed.DataEncoding = 1;
Hashed.Hash(base64строка);

DE73998802680548B916F1947FFBAD76
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#5 Оставлено : 21 апреля 2023 г. 17:16:43(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Автор: Северная чернь Перейти к цитате


Функция сразу заработала, и с использованием объекта "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, получаем ожидаемый хеш.
Техническую поддержку оказываем тут
Наша база знаний
Offline Северная чернь  
#6 Оставлено : 24 апреля 2023 г. 13:57:07(UTC)
Северная чернь

Статус: Новичок

Группы: Участники
Зарегистрирован: 20.04.2023(UTC)
Сообщений: 3

Андрей, огромное спасибо за отклик.

Ошибку я свою теперь понимаю. Осталось понять как обойтись без конвертации в base64? Мне нужно работать с UCS2LE. Нужен метод перевода "Строки"(тип данных в 1С v.7.7) в UCS2LE. В 1С v.7.7 и типа данных то такого нет(строка в кодировке UCS2LE)…

Может быть кто-то откликнется с опытом подобной работы - Как перевести "Строку" в UCS2LE и в каком типе данных хранить это при обработке в 1С v.7.7?
Offline Северная чернь  
#7 Оставлено : 24 апреля 2023 г. 15:02:30(UTC)
Северная чернь

Статус: Новичок

Группы: Участники
Зарегистрирован: 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 необходима установленная в системе соответствующая библиотека!

Надеюсь мой опыт будет полезен другим…
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.