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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline mikelneo  
#1 Оставлено : 23 января 2012 г. 15:14:16(UTC)
mikelneo

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.10.2011(UTC)
Сообщений: 40
Откуда: Moscow

Пытаюсь расшифровать сообщение таким образом:

IntPtr store = IntPtr.Zero;
IntPtr phProv = IntPtr.Zero;

var res = Crypto.CryptAcquireContext(ref phProv,
@"FAT12\24997833\le-5c699.000\2983",
"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider",
75,
Crypto.CRYPT_SILENT);

// открываем хранилище
store = Crypto.CertOpenStore(Crypto.CERT_STORE_PROV_SYSTEM,
Crypto.MY_ENCODING_TYPE,
phProv,
Crypto.CERT_SYSTEM_STORE_CURRENT_USER,
"MY");

var dpair = new Crypto.CRYPT_DECRYPT_MESSAGE_PARA
{
dwFlags = Crypto.CRYPT_MESSAGE_SILENT_KEYSET_FLAG,
dwMsgEncodingType = Crypto.MY_ENCODING_TYPE,
cCertStore = 1,
rghCertStore = new[] { store }
};
dpair.cbSize = Marshal.SizeOf(typeof (Crypto.CRYPT_DECRYPT_MESSAGE_PARA));

int dlength = 0;

// получаем размер сообщения
res = Crypto.CryptDecryptMessage(ref dpair, encRes, encRes.Length, null, ref dlength, IntPtr.Zero);

var dresult = new byte[dlength];
// расшифровка
res = Crypto.CryptDecryptMessage(ref dpair, encRes, encRes.Length, dresult, ref dlength, IntPtr.Zero);

Все функции возвращают положительный результат, кроме последней CryptDecryptMessage, которая говорит, что
"Cannot find the certificate and private key to use for decryption", хотя ключ и сертификат есть. Подскажите в чем дело.

Dll импорты CryptoAPI такие:

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CryptAcquireContext(
ref IntPtr hProv,
String pszContainer,
String pszProvider,
Int32 dwProvType,
Int32 dwFlags
);

[DllImport("Crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CertOpenStore(
Int32 lpszStoreProvider,
Int32 dwMsgAndCertEncodingType,
IntPtr hCryptProv,
Int32 dwFlags,
String pvPara
);

[DllImport("Crypt32.dll", SetLastError = true)]
public static extern bool CryptDecryptMessage(
ref CRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
byte[] pbEncryptedBlob,
int cbEncryptedBlob,
[In, Out] byte[] pbDecrypted,
ref int pcbDecrypted,
IntPtr ppXchgCert);
Offline informatik  
#2 Оставлено : 10 февраля 2012 г. 12:28:55(UTC)
informatik

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

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

Поблагодарили: 1 раз в 1 постах
Важное правило, ваш сертификат должен быть установлен в личное хранилище текущего пользователя (в вашем случае) и связан с контейнером закрытого ключа КриптоПро

Если это и так выполняется, то попробуйте в CRYPT_DECRYPT_MESSAGE_PARA.rghCertStore поставить не массив а указатель:

Вот так, это типа указатель на указатель
Код:

dpair.rghCertStore = Marshal.AllocHGlobal(Marshal.SizeOf(store));
Marshal.StructureToPtr(store, dpair.rghCertStore, false);


Во всяком случае у меня так работает.

Отредактировано пользователем 10 февраля 2012 г. 12:32:14(UTC)  | Причина: Не указана

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