| ||||
| ||||
Программно создаётся подпись (PKCS7) в отдельном файле, всё отлично, подпись проверена - всё ок, но подпись над этим же файлом этим же ключом сделанная с помощью КриптоАРМ на 101 байт длиннее! Почему? | ||||
Ответы: | ||||
| ||||
Добавлю как я делаю подпись, вот: HCERTSTORE hSystemStore; if (!(hSystemStore = CertOpenSystemStore(NULL, "MY"))) { return; } // System store is opened PCCERT_CONTEXT pCert = NULL; bool found = false; while (pCert = CertEnumCertificatesInStore(hSystemStore, pCert)) { if(!strcmp(pCert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId, "1.2.643.2.2.19")) { DWORD dwKeySpec; HCRYPTPROV hProv; if(CryptAcquireCertificatePrivateKey(pCert, 0, NULL, &hProv, &dwKeySpec, NULL)) { CryptReleaseContext(hProv, 0); found = true; break; } } } CRYPT_SIGN_MESSAGE_PARA SignPara; ZeroMemory(&SignPara, sizeof(SignPara)); (CRYPT_SIGN_MESSAGE_PARA)); SignPara.cbSize = sizeof(SignPara); // = 68 SignPara.dwMsgEncodingType = PKCS_7_ASN_ENCODING; SignPara.HashAlgorithm.pszObjId = szOID_CP_GOST_R3411; SignPara.HashAlgorithm.Parameters.cbData = 0; SignPara.pSigningCert = pCert; SignPara.cMsgCert = 1; SignPara.rgpMsgCert = &pCert; SignPara.pvHashAuxInfo = NULL; SignPara.cMsgCrl = 0; const BYTE* DataArray[] = { (BYTE*)data }; DWORD SizeArray[] = { Len }; // Len = 269 DWORD *count = new DWORD(); *count = 0; if(!CryptSignMessage(&SignPara, true, 1, DataArray, SizeArray, NULL, count)) // count становится равным 1152 !!! { return; } BYTE *signature = static_cast<BYTE*>(malloc(*count)); if(!CryptSignMessage(&SignPara, true, 1, DataArray, SizeArray, signature, count)) { return; } // сохраняем подпись так в чём же разница между этой подписью и подписью КриптоАРМ? | ||||
| ||||
Насколько я знаю, КриптоАРМ добавляет различный атрибуты к подписи - например время. А вообще есть замечательная утилита dumpasn1, с помощью которой Вы сможете сравнить результаты и обнаружить отличия сами :) | ||||
| ||||
Много букав выдаёт dumpasn1! Но всё-же что-то я нашёл, в подписи от КриптоАРМ есть такие строки: SEQUENCE { OBJECT IDENTIFIER contentType (xxxxx) SET { OBJECT IDENTIFIER data (xxxxxxx) } } SEQUENCE { OBJECT IDENTIFIER messageDigest (xxxxx) SET { OCTET STRING xxxxxxxx } } } хотелось бы узнать что это такое и как это добавить... спасибо. | ||||
| ||||
для того чтобы это добавить надо знать какой OID скрывается под символами ххххх | ||||