Oleg Taraskin пишет:SvetovidovDM пишет:Oleg Taraskin пишет:Дело в том, что OID парамсета 1.2.643.2.2.35.1 говорит о том, что пару можно использовать только для подписи
а 1.2.643.2.2.36.0 как для подписи, так и для DH.
см. http://cpdn.cryptopro.ru/content/csp36/ … _OIDS.html
Это несмотря на то, что по сути кривые с OID 1.2.643.2.2.35.1 и 1.2.643.2.2.36.0 - одинаковые.
Поэтому CryptoPro CSP и "ругается". Если вы хотите использовать пару из PKCS#11 для DH то сгенерируйте ее с атрибутом
CKA_GOSTR3410_PARAMS равным 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x24, 0x00
Спасибо, правда я пошел несколько другим путем, потому как в реальной жизни ключи будут попадаться самые разные. Поэтому вместо того чтобы использовать ключ отправителя генерирую эфемерный ключ и использую его закрытую часть для шифрования сессионного ключа, а открытую часть собираю в блоб и передаю вместе с данными.
Теперь экспорт и импорт ключей отрабатывает,но при расшифровке самого сообщения через CryptDecrypt получаю абсолютно не те данные которые должен был, хотя длина считается корректно, и сам метод не возвращает ошибки.
А как тогда используется вторая неэфемеральная пара ? Т.е. я правильно понял, что вы решили сделать одностороннюю аутентификацию ?
Расшифровку через CryptDecrypt починил, оказалась проблема в несогласованном механизме шифрования.
Вторая пара не используется.
Механизм шифрования следующий:
1. Получаем параметры кривых открытого ключа получателя.
2. Генерируем эфемерную ключевую пару
3. Вырабатываем ключ согласования из открытого ключа отправителя и закрытого эфемерной пары
4. Генерируем сессионный ключ и шифруем его на ключе согласования
5. Собираем блоб открытого ключа эфемерной пары
6. шифруем данные сессионным ключом.
Собираем все это в структуру и передаем на сервер.
При расшифровке делаем так:
1. Берем закрытый ключ получателя
2. Берем значение открытого ключа из блоба
3. Получаем из этих ключей ключ согласования
4. Расшифровываем этим ключом сессионный ключ
5. Расшифровываем данные сессионным ключом.
Теперь работает - шифрование на PKCS#11 и CryptoAPI
Расшифровка - на CryptoAPI
На PKCS#11 расшифровка не проходит, при выработке общего ключа получаю ошибку 0x00000071, хотя та же функция работает и при выработке общего ключа для шифрования, и проходит успешно.