Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.05.2012(UTC) Сообщений: 50
|
Задача - получить зашифрованную строку алгоритмом GOST3411withGOST3410EL. В Java и C++ разные результаты. Java: Код:X509Certificate x509Certificate = (X509Certificate) certificateFactory.generateCertificate(new ByteArrayInputStream(cert.getEncoded()));
PrivateKey privateKey = (PrivateKey)keyStore.getKey("mycert", "mypass".toCharArray());
Signature sig = Signature.getInstance("GOST3411withGOST3410EL");
sig.initSign(privateKey);
byte[] input_bytes = new String("ABCdef123").getBytes("UTF8");
sig.update(input_bytes);
byte[] signature_bytes = sig.sign();
System.out.println(new String(signature_bytes, "UTF8"));
System.out.println("signature_bytes.length: " + signature_bytes.length);
Цитата:На выходе имею строку байт длинной 64 символа signature_bytes.length: 64 C++: Код:HCRYPTKEY hCryptKey;
HCERTSTORE hStore = NULL; // Дескритор хранилища сертификатов
// Открытие хранилища сертификатов "MY" текущего пользователя.
hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_STORE_OPEN_EXISTING_FLAG |CERT_STORE_READONLY_FLAG | CERT_SYSTEM_STORE_CURRENT_USER, L"MY");
if(!hStore)
HandleError("The store could not be opened!\n");
else
printf("The store is open!\n");
// Получение сертификата с заданным именем из хранилища сертификатов.
PCCERT_CONTEXT pContext = NULL ; // Контекст сертификата
CRYPT_HASH_BLOB chb;
chb.pbData = hashData;
chb.cbData = hashDataLength;
pContext = CertFindCertificateInStore(hStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_HASH, &chb, NULL);
if(pContext == NULL)
{
HandleError("There is no such a certificate in the store\n");
}
BYTE *pbSignedMessageBlob;
DWORD cbSignedMessageBlob;
// Создаем и заполняем структуру для создания цифровой подписи
CRYPT_SIGN_MESSAGE_PARA SigParams;
SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
SigParams.pSigningCert = pContext;
SigParams.HashAlgorithm.pszObjId = szOID_CP_GOST_R3411_R3410;
SigParams.HashAlgorithm.Parameters.cbData = NULL;
SigParams.cMsgCert = 0;
SigParams.rgpMsgCert = NULL;
SigParams.cAuthAttr = 0;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.rgAuthAttr = NULL;
BYTE* pbMessage = (BYTE*)"ABCdef123";
DWORD cbMessage = (DWORD)strlen((char*) pbMessage)+1;
const BYTE* MessageArray[] = {pbMessage};
DWORD MessageSizeArray[1];
MessageSizeArray[0] = cbMessage;
//Включаем кэширование
DWORD cData;
PCCERT_CONTEXT pCert= SigParams.pSigningCert;
int ret = CertGetCertificateContextProperty(pCert, CERT_KEY_PROV_INFO_PROP_ID, NULL, &cData);
CRYPT_KEY_PROV_INFO* pCryptKeyProvInfo = NULL;
if (ret) {
pCryptKeyProvInfo = (CRYPT_KEY_PROV_INFO *)malloc(cData);
if(!pCryptKeyProvInfo)
HandleError("Error in allocation of memory.");
ret = CertGetCertificateContextProperty(pCert,CERT_KEY_PROV_INFO_PROP_ID, pCryptKeyProvInfo,&cData);
if (ret)
{
/* Установим флаг кеширования провайдера*/
pCryptKeyProvInfo->dwFlags = CERT_SET_KEY_CONTEXT_PROP_ID;
/* Установим свойства в контексте сертификата*/
ret = CertSetCertificateContextProperty(pCert, CERT_KEY_PROV_INFO_PROP_ID,0, pCryptKeyProvInfo);
}
}
// Получаем длину буфера подписи. Тут появляется окно ввода пина
if(CryptSignMessage(
&SigParams, // указатель на SigParams
TRUE, // подпись создается отдельно
1, // число сообщений
MessageArray, // сообщение
MessageSizeArray, // длина сообщения
NULL, // буфер для подписи
&cbSignedMessageBlob)) // размер буфера
{
printf("Signature size %d.\n",cbSignedMessageBlob);
}
else
{
HandleError("Error in CryptSignMessage.");
}
// выделяем память под подпись
if(!(pbSignedMessageBlob = new BYTE[cbSignedMessageBlob]))
{
HandleError("Error in new[].");
}
// формируем подпись.
if(CryptSignMessage(
&SigParams, // указатель на SigParams
TRUE, // подпись создается отдельно
1, // число сообщений
MessageArray, // сообщение
MessageSizeArray, // длина сообщения
pbSignedMessageBlob, // буфер для подписи
&cbSignedMessageBlob)) // размер буфера
{
print_signature(cbSignedMessageBlob, pbSignedMessageBlob);
}
else
{
HandleError("Errror in cryptsignmessage 2");
}
Цитата:На выходе имею Signature size 589. 64 явно != 589. В чем может быть причина разного результата?
|