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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline AlexDev  
#1 Оставлено : 12 августа 2014 г. 13:57:38(UTC)
AlexDev

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

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

Добрый день!

Пытаюсь осуществить дешифровку байтового массива, но получаю ошибку 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);
}
Offline Kirill Sobolev  
#2 Оставлено : 12 августа 2014 г. 15:37:38(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
В объявлении CryptDecryptMessage вместо byte[] pbDecrypted попробуйте использовать IntPtr pbDecrypted.
Техническую поддержку оказываем тут
Наша база знаний
Offline AlexDev  
#3 Оставлено : 12 августа 2014 г. 18:04:21(UTC)
AlexDev

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

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

Кирилл, спасибо за ответ. Объявления не менял.

В итоге заработало так:
dpair.rghCertStore = Marshal.AllocHGlobal(IntPtr.Size);
Marshal.WriteIntPtr(dpair.rghCertStore, store);
Offline AlexDev  
#4 Оставлено : 15 августа 2014 г. 12:00:33(UTC)
AlexDev

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

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

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