Всем доброго дня
Прошу помощи у более опытных коллег
у меня возникла необходимость выполнять код, который выполнялся на 1С, на языке Python
На моей машине установлен КриптоПро CSP 5.0.12417, КриптоПро ЭЦП SDK 2.0.14556
Вкратце: я получаю массив чисел типа VT_UI1, оборачиваю его в массив COMSafeArray, создаю объект HashedData и вычисляю хэш массива чисел
На 1С у меня код отрабатывает, но на той же машине на PyCharm я получаю ошибку "Класс CAdESCOM.HashedData не зарегистрирован".
Я для теста установил КриптоПро ЭЦП Browser plug-in (cadesplugin.exe), то код на Python выполняется, но я получаю другой результат хэша
элементы МассивCOM в 1С и в Python - одни и те же числа, я b[ сравнивал, все значения чисел и их порядок одинаковый
[48, 130, 9, 90, 48, 130, 9, 7, 160, 3, 2, 1, 2, 2, 17, 2, 187, 61, 216, 0, 57, 179, 190, 182, 72, 219, 170, 10, 183, 124, 236, 229, 48, ...
Подскажите, пожалуйста,
Код 1С:
Функция СформироватьХэшСертификата(Сертификат)
ДанныеСертификата = Сертификат.Выгрузить()
БуферДвоичныхДанных = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДанныеСертификата);
МассивДанных = Новый Массив;
k = БуферДвоичныхДанных.Размер - 1;
Для i = 0 По k Цикл
МассивДанных.Добавить(БуферДвоичныхДанных.Получить(i));
КонецЦикла;
МассивCOM = Новый COMSafeArray(МассивДанных, "VT_UI1");
HASH_ALGORITHM = 101;
HashedData = Новый COMОбъект("CAdESCOM.HashedData");
HashedData.Algorithm = HASH_ALGORITHM;
HashedData.Hash(МассивCOM);
БуферДвоичныхДанных = ПолучитьБуферДвоичныхДанныхИзHexСтроки(HashedData.Value);
ХэшСертификата = ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(БуферДвоичныхДанных);
Возврат ХэшСертификата;
КонецФункции
Код Python:
def calculate_certificate_hash(thumbprint_hex):
HASH_ALGORITHM = 101
cert_ctx = get_certificate_from_standard_cryptography_store(thumbprint_hex)
cert_bytes = cert_ctx.get_encoded()
cert = x509.load_der_x509_certificate(cert_bytes, default_backend())
cert_bytes = cert.public_bytes(serialization.Encoding.DER)
safe_array = cl.VARIANT(pythoncom.VT_UI1, list(cert_bytes)) # еще я пробовал cl.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_UI1, list(cert_bytes))
pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED)
hashed_data = cl.Dispatch('CAdESCOM.HashedData')
hashed_data.Algorithm = HASH_ALGORITHM
hashed_data.Hash(safe_array)
return hashed_data.Value
Справочно: Начало main.py
import wincertstore # НО ТЕМ НЕ МЕНЕЕ!!! все остальные библиотеки не помогли
import base64
import ssl
import sys
import os
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
import win32com.client as cl
import pythoncom