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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline vasiliy78  
#1 Оставлено : 12 декабря 2018 г. 14:47:05(UTC)
vasiliy78

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

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

Поблагодарили: 4 раз в 2 постах
Добрый день!

Пытаюсь расшифровать защифрованный ответ от ФСС и кое что не получается. Пишу на питоне.

Делаю следующее:

1. CryptAcquireContextA с параметрами PROV_CRYPTOPRO_GOST_2001=75 и CRYPT_SILENT= 0x00000040. Тут же передаю указатель на имя контейнера. Имя такое:
'FAT12\\887F5300\\c7102edc.000\\1AA6\x0043f2ae8c6-f457-6399-b665-fdcd9751934\x00'
Код:

        # временый хардкод
        ivanov_name = b'FAT12\\887F5300\\c7102edc.000\\1AA6\x0043f2ae8c6-f457-6399-b665-fdcd9751934\x00'
        lp = cast(ivanov_name, LPCSTR)
        success = fCryptAcquireContextA(
            byref(self.prov),
            lp,
            None,
            PROV_CRYPTOPRO_GOST_2001,
            CRYPT_SILENT
        )


2. Вызываю CryptSetProvParam, в который передаю PP_KEYEXCHANGE_PIN и указатель на пароль.
Код:

        password = (BYTE * 5)(*(b'1234' + bytes([0])))
        pbData = cast(password, POINTER(BYTE))
        success = fCryptSetProvParam(prov, PP_KEYEXCHANGE_PIN, pbData, 0)

3. Получение дескриптора закрытого ключа
Код:

        prv = HCRYPTKEY()
        success = fCryptGetUserKey(prov, AT_KEYEXCHANGE, byref(prv))

4.Создаю структуру CRYPT_PUBLICKEYBLOB. Размер структуры получился 100 байт. Привожу ее пример(можно посмотреть в asn1-просмотрщике):
06200000232e00004d41473100020000301206072a85030202240006072a850302021e01b0dacce0161dc4d1b05f9e56a0b4c73ea3de689e2d27afad5bead75a62b47f0f6eacc1a0dcf99de30b546ded5dc81515d02930318bdf11e59a5f3d9044243408

5. Получаю ключ согласования импортом открытого эфемерного ключа отправителя на своем закрытом ключе.
Код:

        kek = HCRYPTKEY()
        blob_bytes = bytearray(pubKeyBlob)
        length = len(blob_bytes)
        public_blob = (BYTE * length)(*blob_bytes)
        pblob = cast(byref(public_blob), POINTER(BYTE))

        success = fCryptImportKey(prov, pblob, length, prv, 0, byref(kek))

6. На ключ согласования выставляю KP_ALGID
Код:

        calc = BYTE(CALG_PRO_EXPORT)
        pbData = cast(byref(DWORD(CALG_PRO_EXPORT)), POINTER(BYTE))
        success = fCryptSetKeyParam(kek, KP_ALGID, pbData, 0)


7. Формирую структуру CRYPT_SIMPLEBLOB. Почему-то она получается размером 72 байта, хотя если вручную подсчитать - то вроде должна быть 69.
привожу ее пример:
012000001e660000fd514a371e66000044fe1f0f4be240b5bd035c85aaa42cfcea1f6fc1268395646d02900ea00dba50db81bd3af965e89136bafe8e06072a850302021f01000000

8. пытаюсь получить сессионный ключ и выходит ошибка: [WinError -2146893799] Набор ключей не определен.

На всех предыдущих этапах ошибок не возникает.

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