Добрый день!
Пытаюсь осуществить дешифровку байтового массива, но получаю ошибку AccessViolationException при второми вызове метода CryptDecryptMessage: "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
Остальные вызовы CryptoApi проходят успешно. Не уверен, верно ли проставлены параметры вызова CertOpenStore. Сертификаты установлены в реестр. КриптоПро показывает 2 сертификата в контейнере (дешифровка должна происходить одним из этих сертификатов). В реестре же вижу бОльшее количество личных сертификатов. Заранее спасибо!
Код программы:
class Program
{
static void Main(string[] args)
{
// byte[] encodedBytes;
...
// открываем хранилище
var store = Crypto.CertOpenStore(Crypto.CERT_STORE_PROV_MEMORY, Crypto.MY_TYPE, IntPtr.Zero, Crypto.CERT_STORE_CREATE_NEW_FLAG, null);
var dpair = new Crypto.CRYPT_DECRYPT_MESSAGE_PARA
{
cbSize = Marshal.SizeOf(typeof(Crypto.CRYPT_DECRYPT_MESSAGE_PARA)),
dwMsgAndCertEncodingType = Crypto.MY_TYPE,
cCertStore = 1,
rghCertStore = store
};
int dlength = 0;
// получаем размер сообщения
var result = Crypto.CryptDecryptMessage(ref dpair, encodedBytes, encodedBytes.Length, null, ref dlength, IntPtr.Zero);
var dresult = new byte[dlength];
// расшифровка (здесь возникает ошибка)
result = Crypto.CryptDecryptMessage(ref dpair, encodedBytes, encodedBytes.Length, dresult, ref dlength, IntPtr.Zero);
}
}
public static class Crypto
{
public const int CERT_STORE_PROV_MEMORY = 2;
public const int CERT_STORE_CREATE_NEW_FLAG = 0x00002000;
public const Int32 X509_ASN_ENCODING = 0x00000001;
public const Int32 PKCS_7_ASN_ENCODING = 0x00010000;
public const Int32 MY_TYPE = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;
[StructLayout(LayoutKind.Sequential)]
public struct CRYPT_DECRYPT_MESSAGE_PARA
{
public int cbSize;
public uint dwMsgAndCertEncodingType;
public int cCertStore;
public IntPtr rghCertStore;
}
[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);
}