Quiter Опубликовано 3 Июня 2014 Жалоба Поделиться Опубликовано 3 Июня 2014 Добрый день! Помогите, пожалуйста, с решением проблемы.Имеется контейнер с ключевой парой. Имеется связанный с этой парой сертификат. Нужно решить задачу экспорта сессионного ключа на открытом ключе сертификата. Написал такой код (C#): IntPtr providerHandler = IntPtr.Zero; IntPtr sessionKeyHandler = IntPtr.Zero; IntPtr publicKeyHandler = IntPtr.Zero; try { if (!CryptoApi.CryptAcquireContext( ref providerHandler, null, CryptoConstants.VPN_DEF_PROV, CryptoConstants.VPN_PROV_TYPE, CryptoConstants.CRYPT_VERIFYCONTEXT)) { throw new Win32Exception(); } if (!CryptoApi.CryptGenKey( providerHandler, CryptoConstants.CPCSP_ENCRYPT_ID, CryptoConstants.CRYPT_EXPORTABLE, ref sessionKeyHandler)) { throw new Win32Exception(); } X509Store store = new X509Store(STORE_NAME, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); X509Certificate2 cert = null; try { cert = store.Certificates.Find(X509FindType.FindByThumbprint, "285d213829798dac59d75274b247e3a35a5a0630", false)[0]; } finally { store.Close(); } IntPtr subjectPublicKeyInfoPointer = IntPtr.Zero; try { var certContextStruct = MarshalPtrToStructure<CryptoStructs.CERT_CONTEXT>(cert.Handle); var certInfoStruct = MarshalPtrToStructure<CryptoStructs.CERT_INFO>(certContextStruct.pCertInfo); subjectPublicKeyInfoPointer = Marshal.AllocHGlobal(Marshal.SizeOf(certInfoStruct.SubjectPublicKeyInfo)); Marshal.StructureToPtr(certInfoStruct.SubjectPublicKeyInfo, subjectPublicKeyInfoPointer, false); if (!CryptoApi.CryptImportPublicKeyInfo(providerHandler, CERT_ENCODING_TYPE, subjectPublicKeyInfoPointer, ref publicKeyHandler)) { throw new Win32Exception(); } } finally { Marshal.FreeHGlobal(subjectPublicKeyInfoPointer); subjectPublicKeyInfoPointer = IntPtr.Zero; } uint sessionKeyBlobLength = 0; if (!CryptoApi.CryptExportKey( sessionKeyHandler, publicKeyHandler, CryptoConstants.SIMPLEBLOB, 0, null, ref sessionKeyBlobLength)) { throw new Win32Exception(); } byte[] sessionKeyBlob = new byte[sessionKeyBlobLength]; if (!CryptoApi.CryptExportKey( sessionKeyHandler, publicKeyHandler, CryptoConstants.SIMPLEBLOB, 0, sessionKeyBlob, ref sessionKeyBlobLength)) { throw new Win32Exception(); } } finally { if (publicKeyHandler != IntPtr.Zero) { CryptoApi.CryptDestroyKey(publicKeyHandler); } if (sessionKeyHandler != IntPtr.Zero) { CryptoApi.CryptDestroyKey(sessionKeyHandler); } if (providerHandler != IntPtr.Zero) { CryptoApi.CryptReleaseContext(providerHandler, 0); } }На последней строчке до finally валится с ошибкой "Набор ключей не существует". Все указатели не нулевые, sessionKeyBlobLength = 71 (т.е. длина рассчитывается). Мучаюсь уже несколько дней. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.