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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline alexei366  
#1 Оставлено : 5 июня 2013 г. 13:21:43(UTC)
alexei366

Статус: Участник

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

Всем здравствуйте.
Делаю ком объект на c# для подписания и верификации подписанных сообщений.
Основываясь на имеющихся примерах, организовал подписание, а вот с верификацией какие-то проблемы.
Пробовал два варианта функции проверки, но оба всегда выдают false, тестировал на заведомо верных сообщениях.
Подскажите, что не так?

Вариант 1:
///////////////////////////

static void Main3()
{


X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certCollection = store.Certificates;
X509Certificate2 cert = certCollection[9];

string massage = "тут у нас исходный текст подписанного сообщения";
byte[] pbMessage = System.Text.Encoding.UTF8.GetBytes(massage);




Int32 cbMessage = pbMessage.Length;

// base64 подписанного сообщения
string massage_sign = "MIICOQYJKoZIhvcNAQcCoIICKjCCAiYCAQExDDAKBgYqhQMCAgkFADALBgkqhkiG9w0BBwExggIEMIICAAIBATBzMGUxIDAeBgkqhkiG9w0BCQEWEWluZm9AY3J5cHRvcHJvLnJ1MQswCQYDVQQGEwJSVTETMBEGA1UEChMKQ1JZUFRPLVBSTzEfMB0GA1UEAxMWVGVzdCBDZW50ZXIgQ1JZUFRPLVBSTwIKZTIq5AACAAQ+1DAKBgYqhQMCAgkFAKCCASowGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTMwNTIxMDY0NTQ4WjAvBgkqhkiG9w0BCQQxIgQgjw/LhkSZj8f2gna5q4fu4mAPjGwX7jUSfjYbO8Sm4Dwwgb4GCyqGSIb3DQEJEAIvMYGuMIGrMIGoMIGlMAgGBiqFAwICCQQgoWW4uwCURIWOSFtKX308YR7jXyGHH/1y2MDECzxn7FIwdzBppGcwZTEgMB4GCSqGSIb3DQEJARYRaW5mb0BjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMRMwEQYDVQQKEwpDUllQVE8tUFJPMR8wHQYDVQQDExZUZXN0IENlbnRlciBDUllQVE8tUFJPAgplMirkAAIABD7UMAoGBiqFAwICEwUABECTQoUA/SuSEEh7h+KudbAQKKMmrzvXDp62N79u42WcvxYqB272qg5SIz7Y+OZ1mcQSQeDCYX3aAhKJBtrL9qYX";

byte[] pbArray = Convert.FromBase64String(massage_sign);
Int32 cbArray = pbArray.Length;

IntPtr pSignerCert = cert.Handle;

IntPtr hCryptProv = IntPtr.Zero;
CryptAcquireContext(out hCryptProv, String.Empty, String.Empty, 75 /*PROV_GOST_2001_DH*/ , 4026531840 /*CRYPT_VERIFYCONTEXT*/);

CRYPT_VERIFY_MESSAGE_PARA VerifyParams = new CRYPT_VERIFY_MESSAGE_PARA();
VerifyParams.cbSize = Marshal.SizeOf(VerifyParams);
VerifyParams.dwMsgAndCertEncodingType = 0x00010001;
VerifyParams.hCryptProv = hCryptProv;
VerifyParams.pfnGetSignerCertificate = IntPtr.Zero;
VerifyParams.pvGetArg = pSignerCert;


IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(byte)) * pbMessage.Length);
Marshal.Copy(pbMessage, 0, buffer, pbMessage.Length);
IntPtr[] MessageArray = new IntPtr[1] { buffer };
Int32[] MessageSizeArray = new Int32[1];
MessageSizeArray[0] = pbMessage.Length;



Boolean rez = CryptVerifyDetachedMessageSignature(
ref VerifyParams, // Verify parameters.
0, // Signer index.
pbArray, // Pointer to signed BLOB.
cbArray, // Size of signed BLOB.
1,
MessageArray, // Buffer for decoded message.
MessageSizeArray, // Size of buffer.
pSignerCert // Pointer to signer certificate.
);

// X509Certificate x509 = new X509Certificate((IntPtr)pCertContext.Target);

int a = 5;


}



///////////////////////////




Второй Вариант:

////////////////////////

X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certCollection = store.Certificates;
X509Certificate2 cert = certCollection[9];

string massage = "тут у нас исходный текст подписанного сообщения";
byte[] pbMessage = System.Text.Encoding.UTF8.GetBytes(massage);



Int32 cbMessage = pbMessage.Length;


// base64 подписанного сообщения
string massage_sign = "MIICOQYJKoZIhvcNAQcCoIICKjCCAiYCAQExDDAKBgYqhQMCAgkFADALBgkqhkiG9w0BBwExggIEMIICAAIBATBzMGUxIDAeBgkqhkiG9w0BCQEWEWluZm9AY3J5cHRvcHJvLnJ1MQswCQYDVQQGEwJSVTETMBEGA1UEChMKQ1JZUFRPLVBSTzEfMB0GA1UEAxMWVGVzdCBDZW50ZXIgQ1JZUFRPLVBSTwIKZTIq5AACAAQ+1DAKBgYqhQMCAgkFAKCCASowGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTMwNTIxMDY0NTQ4WjAvBgkqhkiG9w0BCQQxIgQgjw/LhkSZj8f2gna5q4fu4mAPjGwX7jUSfjYbO8Sm4Dwwgb4GCyqGSIb3DQEJEAIvMYGuMIGrMIGoMIGlMAgGBiqFAwICCQQgoWW4uwCURIWOSFtKX308YR7jXyGHH/1y2MDECzxn7FIwdzBppGcwZTEgMB4GCSqGSIb3DQEJARYRaW5mb0BjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMRMwEQYDVQQKEwpDUllQVE8tUFJPMR8wHQYDVQQDExZUZXN0IENlbnRlciBDUllQVE8tUFJPAgplMirkAAIABD7UMAoGBiqFAwICEwUABECTQoUA/SuSEEh7h+KudbAQKKMmrzvXDp62N79u42WcvxYqB272qg5SIz7Y+OZ1mcQSQeDCYX3aAhKJBtrL9qYX";

byte[] pbArray = Convert.FromBase64String(massage_sign);
Int32 cbArray = pbArray.Length;

IntPtr pSignerCert = cert.Handle;




IntPtr hCryptProv = IntPtr.Zero;
IntPtr handle = IntPtr.Zero;
byte[] hash;

CryptAcquireContext(out hCryptProv, String.Empty, String.Empty, 75 /*PROV_GOST_2001_DH*/ , 4026531840 /*CRYPT_VERIFYCONTEXT*/);


CryptCreateHash(hCryptProv, 32798 /*CALG_GR3411*/, IntPtr.Zero, 0, ref handle);


CryptHashData(handle, pbMessage, (uint)pbMessage.Length, 0);

uint len = 32;
hash = new byte[len];
CryptGetHashParam(handle, 2 /*HP_HASHVAL*/, hash, ref len, 0);

Boolean rez = CryptVerifySignature(
handle, // дескриптор на hash объект
pbArray, // указатель на подпись
cbArray, // длина подписи
pSignerCert, // дескриптор на public key
String.Empty,
0);



int a = 5;


////////////////////////

Отредактировано пользователем 17 июня 2013 г. 18:19:14(UTC)  | Причина: Не указана

Offline alexei366  
#2 Оставлено : 27 августа 2013 г. 17:33:21(UTC)
alexei366

Статус: Участник

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

up
Offline Kirill Sobolev  
#3 Оставлено : 28 августа 2013 г. 11:02:02(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Делаю ком объект на c# для подписания и верификации подписанных сообщений.
Основываясь на имеющихся примерах, организовал подписание, а вот с верификацией какие-то проблемы.

почему не пользуетесь классом SignedCms? csptest проверяет подпись?
Техническую поддержку оказываем тут
Наша база знаний
Offline alexei366  
#4 Оставлено : 29 августа 2013 г. 9:28:44(UTC)
alexei366

Статус: Участник

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

SignedCms вроде как не поддерживает алгоритмы Крипто-Про (я конеш могу ошибаться), да и структура подписи у меня своеобразная, подписываются 2 части - и сам объект подписи и открытый сертификат X509
Offline Kirill Sobolev  
#5 Оставлено : 29 августа 2013 г. 10:18:23(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
SignedCms вроде как не поддерживает алгоритмы Крипто-Про

Поддерживает
Цитата:
подписываются 2 части - и сам объект подписи и открытый сертификат X509

Поподробнее пожалуйста, в Вашем примере никакой подписи сертификата не видно
Техническую поддержку оказываем тут
Наша база знаний
Offline alexei366  
#6 Оставлено : 24 сентября 2013 г. 16:00:02(UTC)
alexei366

Статус: Участник

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

в примерах уже попытка верификации готовой подписи, подписывалось сообщение изначально ключом который я беру в примере из хранилища
Offline Kirill Sobolev  
#7 Оставлено : 25 сентября 2013 г. 9:28:13(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
попробуйте с присоединенной подписью
Техническую поддержку оказываем тут
Наша база знаний
Offline alexei366  
#8 Оставлено : 28 октября 2013 г. 15:07:32(UTC)
alexei366

Статус: Участник

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

Кирилл, я особо не силен, а кусок кода привести сможешь, или строки какие мне заменить нужно. Я из этого кода буду делать Com Объект что-бы можно было вызывать из любого приложения на компе
Offline Kirill Sobolev  
#9 Оставлено : 29 октября 2013 г. 9:55:35(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
или строки какие мне заменить нужно.

Тогда покажи код подписи
Пример есть тут или в нашем SDK.
Техническую поддержку оказываем тут
Наша база знаний
Offline alexei366  
#10 Оставлено : 29 октября 2013 г. 17:17:29(UTC)
alexei366

Статус: Участник

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

Завтра открою проект,я не сильно шарю в C++ и C#. Понабрал кусков с интернета, используя реальные примеры подогнал до рабочего процесса подписания, так как нужно. А вот с верификацией те варианты которые находил в нете не прокатывали.
Так-что я завтра выложу пример подписания и пример его верификации. Если что впринципе можно тестовую подпись сделать и вместе с кодом подпись дать.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.