Всем здравствуйте.
Делаю ком объект на 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)
| Причина: Не указана