Не понятное поведение функции хэширования
(1 чел.) (1) гость
  • Страница:
  • 1
  • 2

ТЕМА: Не понятное поведение функции хэширования

Не понятное поведение функции хэширования 3 нед., 6 д. назад #5123

  • DudeLS
  • Новый участник
  • Постов: 7
  • Репутация: 0
Добрый день!
Возник вопрос как работает функция HashData в библиотеке KalkanCOM.
Прикладываю файл с тестовым приложением где видно что функция работает на мой взгляд не правильно!!!!!!!
Архив тут yadi.sk/d/JcEAYzzZSfBXmA

Немного подробнее о проблеме.
С помощью NCALayer 1.2 подписывается строка "My test string" в формате base64 выглядит так "TXkgdGVzdCBzdHJpbmc=".
Параметры которые передаются в NCALayer
"module": "kz.gov.pki.knca.commonUtils",
"method": "createCAdESFromBase64",
"args": ["PKCS12", "AUTHENTICATION", "TXkgdGVzdCBzdHJpbmc=", true]

Затем подпись разбираем с помощью парсера ASN.1, находим OID 1.2.840.113549.1.9.4 (messageDigest) и видим значение в HEX формате равное "5358C37942B0126084BB16F7D602788D00416E01BC3FD0132F4458DD355D8E76". Затем берем и пишем небольшую программу на C# с подключенной библиотекой KalkanCOM.dll. В этой программе рассчитываем хэш для base64 "TXkgdGVzdCBzdHJpbmc=" с помощью библиотеки KalkanCOM.dll, а именно функции HashData() с алгоритмом хэширования "sha256" и получаем хэш в формате base64 равный "heuGWt8cWsrsQ4DnNAT1KRPhHnJ8s08ghuTR6qMvlBo=". Переводим этот хэш в HEX и получаем значение "85EB865ADF1C5ACAEC4380E73404F52913E11E727CB34F2086E4D1EAA32F941A".
И возникает хороший вопрос почему хэш в подписи не совпадает с хэшем посчитанным с помощью KalkanCOM.dll.????? Как это так????
На этом не останавливаемся. Нам же интересно что лежит внутри подписи....что это за магический хэш. Дописываем программу, пишем расчет хэша с помощью объекта HashAlgorithm из пространства имен "System.Security.Cryptography".
Получаем простую функцию
static string GetHashByNet(byte[] bytes)
{
    var md5Hasher = HashAlgorithm.Create("SHA256");
    byte[] data = md5Hasher.ComputeHash(bytes);
    return Convert.ToBase64String(data);
}

С помощью этой функции считаем хэш для base64 "TXkgdGVzdCBzdHJpbmc=" и получаем следующее значение в base64 "U1jDeUKwEmCEuxb31gJ4jQBBbgG8P9ATL0RY3TVdjnY=". Затем переводим этот хэш из base64 в HEX и получаем значение "5358C37942B0126084BB16F7D602788D00416E01BC3FD0132F4458DD355D8E76". И о боже это значение сошлось с тем что лежит в подписи. В итоге что делает функция HashData() из библиотеки KalkanCOM.dll
С подписание хэша в NCALayer все еще интереснее, там вообще происходит какая-то ерись, позже отпишу.....
Изменено: 3 нед., 6 д. назад от DudeLS.

Re: Не понятное поведение функции хэширования 3 нед., 6 д. назад #5125

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
Добрый день!

С какими значениями параметров Вы вызываете метод HashData()?

Вы не передали флаг в метод HashData, что у Вас входные данные в формате base64.
Необходимо добавить к значению флага KC_IN_BASE64.
Модератор
Изменено: 3 нед., 6 д. назад от Murat Seisenov.

Re: Не понятное поведение функции хэширования 3 нед., 6 д. назад #5126

  • DudeLS
  • Новый участник
  • Постов: 7
  • Репутация: 0
Добрый день!
Если бы Вы открыли архив, то заметили бы флаги
var flags = (int) KALKANCRYPTCOM_FLAGS.KC_SIGN_CMS | (int) KALKANCRYPTCOM_FLAGS.KC_IN_BASE64 | (int) KALKANCRYPTCOM_FLAGS.KC_OUT_BASE64;


Весь метод
/// <summary>
/// Получить хэш с помощью kalkan
/// </summary>
/// <param name="bytes">Байты для хэширования</param>
/// <returns>Хэш в base64</returns>
static string GetHashByKalkan(byte[] bytes)
{
            var flags = (int) KALKANCRYPTCOM_FLAGS.KC_SIGN_CMS | (int) KALKANCRYPTCOM_FLAGS.KC_IN_BASE64 | (int) KALKANCRYPTCOM_FLAGS.KC_OUT_BASE64;
            var bytesBase64 = Convert.ToBase64String(bytes);
            string hashBase64;

            _kalkanCom.HashData("sha256", flags, bytesBase64, out hashBase64);

            return hashBase64;
}
Изменено: 3 нед., 6 д. назад от DudeLS.

Re: Не понятное поведение функции хэширования 3 нед., 6 д. назад #5127

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
Яндекс диск у нас недоступен. Архив ваш не могу скачать.

Без флага KC_IN_BASE64 у меня выходит хэш "heuGWt8cWsrsQ4DnNAT1KRPhHnJ8s08ghuTR6qMvlBo="
С флагом KC_IN_BASE64 - "U1jDeUKwEmCEuxb31gJ4jQBBbgG8P9ATL0RY3TVdjnY="
Модератор

Re: Не понятное поведение функции хэширования 3 нед., 6 д. назад #5128

  • DudeLS
  • Новый участник
  • Постов: 7
  • Репутация: 0
Как это так получается, вот версия библиотеки что у меня есть
Версия файла: 2.5.1.0
Размер: 3.97МВ

Re: Не понятное поведение функции хэширования 3 нед., 6 д. назад #5129

  • DudeLS
  • Новый участник
  • Постов: 7
  • Репутация: 0
Архив с приложением гугл диск Файл
Изменено: 3 нед., 6 д. назад от DudeLS.
  • Страница:
  • 1
  • 2
FaLang translation system by Faboba