Добрый день!
Возник вопрос как работает функция 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 все еще интереснее, там вообще происходит какая-то ерись, позже отпишу.....