Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Как создать присоединенную подпись, чтобы исходное сообщение не кодировалось
Статус: Активный участник
Группы: Участники
Зарегистрирован: 21.12.2011(UTC) Сообщений: 45 Откуда: Москва
|
Здравствуйте. Помогите пожалуйста! Есть задача создать присоединенную подпись документа и сохранить ее в файл, таким образом, чтобы иходное содержание файла читалось. Так, как это делает КриптоАРМ. Нпример Код:
исходное сообщение:
Привет мир!!!
Hello world!!!
Файл с ЭЦП:
0Ђ *†H†ч
Ђ0Ђ10 + 0Ђ *†H†ч
Ђ$ЂПривет мир!!!
Hello world!!! ‚K0‚G0‚° ~ь'"±»Й20
*†H†ч
010 URU10
UhaiSam0...
Подпись получаю с помощю функции CryptoAPI CryptSignMessage(), потом успешно проверяю ее самописными средствами. Но нужно чтоб исходное сообщение было видно и проверку можно было осуществить и с помощью КриптоАРМ. Думаю ответ лежит на поверхности, но я его ни как не могу найти. Функция с помощью которой я получаю ЭЦП: Код:
bool SignMessage( PCCERT_CONTEXT *a_pCertContext, CRYPT_DATA_BLOB *pSignedMessageBlob, LPSTR sMsg )
{
bool fReturn = false;
BYTE* pbMessage;
DWORD cbMessage;
HCERTSTORE hCertStore = NULL;
//PCCERT_CONTEXT pSignerCert;
CRYPT_SIGN_MESSAGE_PARA SigParams;
DWORD cbSignedMessageBlob;
BYTE *pbSignedMessageBlob = NULL;
// Initialize the output pointer.
pSignedMessageBlob->cbData = 0;
pSignedMessageBlob->pbData = NULL;
// The message to be signed.
// Usually, the message exists somewhere and a pointer is
// passed to the application.
pbMessage =
(BYTE*) sMsg; //TEXT("The message: CryptoAPI is a good way to handle security.");
// Calculate the size of message. To include the
// terminating null character, the length is one more byte
// than the length returned by the strlen function.
cbMessage = (lstrlen((TCHAR*) pbMessage) + 1) * sizeof(TCHAR);
// Create the MessageArray and the MessageSizeArray.
const BYTE* MessageArray[] = {pbMessage};
DWORD_PTR MessageSizeArray[1];
MessageSizeArray[0] = cbMessage;
// Begin processing.
_tprintf(TEXT("The message to be signed is \"%s\".\n"),
pbMessage);
// Initialize the signature structure.
SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = m_Encoding_Type;
SigParams.pSigningCert = *a_pCertContext;
SigParams.HashAlgorithm.pszObjId = m_HashAlgorithm;
SigParams.HashAlgorithm.Parameters.cbData = NULL;
SigParams.cMsgCert = 1;
SigParams.rgpMsgCert = a_pCertContext;
SigParams.cAuthAttr = 0;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.rgAuthAttr = NULL;
// First, get the size of the signed BLOB.
if(CryptSignMessage(
&SigParams,
FALSE,
1,
MessageArray,
MessageSizeArray,
NULL,
&cbSignedMessageBlob))
{
_tprintf(TEXT("%d bytes needed for the encoded BLOB.\n"),
cbSignedMessageBlob);
}
else
{
MyHandleError(TEXT("Getting signed BLOB size failed"));
exit_SignMessage(pbSignedMessageBlob);
return fReturn;
}
// Allocate memory for the signed BLOB.
if(!(pbSignedMessageBlob =
(BYTE*)malloc(cbSignedMessageBlob)))
{
MyHandleError(
TEXT("Memory allocation error while signing."));
exit_SignMessage(pbSignedMessageBlob);
return fReturn;
}
// Get the signed message BLOB.
if(CryptSignMessage(
&SigParams,
FALSE,
1,
MessageArray,
MessageSizeArray,
pbSignedMessageBlob,
&cbSignedMessageBlob))
{
_tprintf(TEXT("The message was signed successfully. \n"));
// pbSignedMessageBlob now contains the signed BLOB.
fReturn = true;
if(pbSignedMessageBlob)
{
pSignedMessageBlob->cbData = cbSignedMessageBlob;
pSignedMessageBlob->pbData = pbSignedMessageBlob;
//DWORD cbEncodedBlob = SignedMessage.cbData;
}
}
else
{
MyHandleError(TEXT("Error getting signed BLOB"));
exit_SignMessage(pbSignedMessageBlob);
return fReturn;
}
return fReturn;
}
Отредактировано пользователем 21 декабря 2011 г. 21:19:28(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
Цитата:Есть задача создать присоединенную подпись документа и сохранить ее в файл, таким образом, чтобы иходное содержание файла читалос.
странный подход... чтобы pkcs7 формат смотреть\читать как текст.... делай отсоединенную подпись... Отредактировано пользователем 21 декабря 2011 г. 21:20:00(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
Цитата:Подпись получаю с помощю функции CryptoAPY CryptSignMessage(), потом успешно проверяю ее самописными средствами. Но нужно чтоб проверку можно было осуществить и с помощью КриптоАРМ. так значит КриптоАРМ сообщает об ошибке при проверке? ошибку и примеры ЭЦП в виде файлов выложи |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 21.12.2011(UTC) Сообщений: 45 Откуда: Москва
|
Цитата:странный подход...
чтобы pkcs7 формат смотреть\читать как текст....
делай отсоединенную подпись...
Согласен. В ЭЦП абсолютный новичок. В поем понимании присоединенная подпись, это что-то типа запечатанного конверта, не вскрыв не посмотришь что там внутри. Но заказчик хочет чтоб читалось. Плюс, если создать подпись с данными в КриптоАРМ получается выше приведенный файл. Именно такой и был прислан мне в качестве примера. Про отсоединенную подпись была самая первая мысль. Создать ее и простой склейкой прикрепить к файлу. Но помоему это не совсем правильно. У меня получается такая абра-кадабра. Код:
b8dcc0345ef7c34807caa24d30f056c0cc5183aac8698a799bcb3b080e66aa82051d3a4039552be861823ae1e145a03c8
230a76cbce70851cf9f8bb098ac28214004000513020203852a06060a3096af0100020000142c160a024f52502d4f54505
95243207265746e65432074736554161303045503061d301f314f52502d4f54505952430a130a0455030611301331555
20213060455030609300b3175722e6f72706f7470797263406f666e6911160109010df78648862a09061e30203165306
7a4693077308c868e2e6ec818eac36ad23623e5d6061234d5827ae92e4e34de022086476b40200409020203852a0606
0830a58130a88130ab8130ae81312f021009010df78648862a0b06be813013b59ce2af2bf33f85db11560e20b80ebb343
c2ca9ec9c5f4c72160f654d328a200422310409010df78648862a09062f305a3533363333313132323131310d170f31050
9010df78648862a09061c300107010df78648862a09060b310309010df78648862a090618302a0182a00005090202038
52a06060a3096af0100020000142c160a024f52502d4f5450595243207265746e65432074736554161303045503061d3
01f314f52502d4f54505952430a130a045503061130133155520213060455030609300b3175722e6f72706f7470797263
406f666e6911160109010df78648862a09061e30203165307330010102000282300402823157a296697f37d9923ee2bf
e8de7e911c51086b632efe3feeb21b17c3d4393c1212cf5eaea5d3ac4577f157128b582f16e9ec248a45e1eb731c89103c
65ca6c0e00410303020203852a060608307472632e2932284f52502d4f54505952433032257265746e65433032257473
65545f657469732d696b702f6c6c6f726e45747265432f75722e6f72706f74707972632e7777772f2f3a707474684d8602
3007050501062b080659306672732e7073636f2f636e7073636f2f75722e6f72706f74707972632e7777772f2f3a707474
682786013007050501062b08063330908130938104010107050501062b0806a081306c72632e2932284f52502d4f5450
5952433032257265746e6543303225747365542f6c6c6f726e45747265432f75722e6f72706f74707972632e7777772f2f
3a70747468448646a048a04a304c304e041f1d55030655302a107a373830059a951e941791ac5fd9055e8f6d14801630
1804231d5503061f30020307050501062b08060a300c04251d55030613308f302e5185155544812f0d5dfbdf3e3d73363
bad140416040e1d5503061d3015020203852a060608300a300c040f09010df78648862a09061930f00402030404ff0101
0f1d5503060e307a0182307e0182a36e99cf5fbb2d0b8784c4826043d212c8085e76b4f895e2d0124e37443b328263a45
165cf0325752240f277e7e838f8c8cc9ed89514e52f61432fe0a980fedd934004004303011e020203852a0706002402020
3852a0706123013020203852a06061c30633075722e72656c626d61724068686863796e61766914160109010df78648
862a0906213023315245505553051303045503060c300e3155520213060455030609300b3142305a313439303730343
0303134310d175a3232393435313130323131310d171e304f52502d4f5450595243207265746e6543207473655416130
3045503061d301f314f52502d4f54505952430a130a045503061130133155520213060455030609300b3175722e6f727
06f7470797263406f666e6911160109010df78648862a09061e302031653003020203852a0606083096af01000200001
42c160a0202010203a0cd0282301e038230220382a00064726f57206f6c6c65480b040da00107010df78648862a09061a
30000509020203852a06060a300c310101025b0582305f0582a00207010df78648862a09066e058230
При попытке проверить сообщение в КриптоАРМ выскакивает месседжбокс с текстом "Неверный формат данных (0x80070057)" Допускаю что при переводе в hex я что-то накосячил. Только что подумал: "А работает ли КриптоАРМ с hex?" Код:
LPSTR bin_to_hex(DWORD sizeData, BYTE* pbData)
{
// перевод из бинарного вида в текстовый.
LPSTR sig = static_cast<LPSTR>(malloc(sizeData*2));
ZeroMemory(sig, sizeData*2 + 1);
LPSTR tmp = static_cast<LPSTR>(malloc(sizeData));
ZeroMemory(tmp, sizeData + 1);
while(sizeData > 0)
{
sprintf(tmp,"%02x",pbData[--sizeData]);
strcat(sig, tmp);
}
if (tmp)
free(tmp);
return sig;
}
распаковываю:
BYTE* hex_to_bin(LPSTR sSignature, DWORD* dataSize)
{
DWORD dwLen =strlen(sSignature);
while( dwLen > 1 && (sSignature[dwLen-1] == '\r' || sSignature[dwLen-1] == '\n'))
sSignature[--dwLen]=0;
*dataSize = (DWORD)strlen(sSignature)/2 ;
BYTE* pbArray = new BYTE[*dataSize];
if(! hex_decode(sSignature,pbArray,TRUE))
{
MyHandleError(_T("Не удалось перевести сообщение в двоичное представление."),FALSE);
return FALSE;
}
return pbArray;
}
#define h2b(h) ( (h >='0' && h <='9') ? (h - '0') : (h >='a' && h <='f') ? (h - 'a'+ 10) : (h >='A' && h <='F') ? (h - 'A'+ 10): 0x100 )
BOOLEAN hex_decode(LPSTR lpStr,BYTE *pbDATA,BOOLEAN isReverse)
{
BYTE b;
LPSTR ptr=lpStr;
DWORD i = strlen(ptr);
if( i % 2 ) return FALSE;
i = isReverse ? i / 2-1 : 0;
while(*ptr){
if((b=h2b(*ptr)) == 0x100) return FALSE;
pbDATA[i] = b << 4;
ptr++;
if((b=h2b(*ptr)) == 0x100) return FALSE;
pbDATA[i] = pbDATA[i] | b;
ptr++;
i += isReverse ? -1 : 1;
}
return TRUE;
Отредактировано пользователем 21 декабря 2011 г. 22:05:04(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
Цитата:Про отсоединенную подпись была самая первая мысль. Создать ее и простой склейкой прикрепить к файлу. она на то и отсоединенная - в отдельном файле... как заказчик будет "смотреть" подписанный присоединенной подписью файл НЕ текстового формата (например xls,doc, pdf, jpg) ? Должно быть ПО (например, КриптоАРМ), которое после проверки позволяет извлечь подписанные данные и сохранить их в файл, чтобы открыть потом в нужном ПО (в зависимости от типа данных\расширения) Отредактировано пользователем 21 декабря 2011 г. 22:17:10(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 21.12.2011(UTC) Сообщений: 45 Откуда: Москва
|
Это была наипервейшая мысль.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
начни с теории (PKI, pkcs7 и т.п. ), а уж потом с практики... ( я про примеры... "кода")
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
Цитата:У меня получается такая абра-кадабра. Code:
b8dcc034.... Цитата:такая абра-кадабра. конечно... а мне что с этим делать? пришли файлы с присоединенной ЭЦП, а не в hex Отредактировано пользователем 21 декабря 2011 г. 22:20:40(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
кстати... риторический вопрос... как и к предыдущим\последующим участникам: почему перед написанием\копированием\ кода - не были просмотрены ветки "Встраивание" и т.п. + поиск по форуму ?
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 21.12.2011(UTC) Сообщений: 45 Откуда: Москва
|
Короче я балбес. Видимо начитавшись не совсем првильных источников, либо поняв не правильно их, стал пихать все в hex. Сохранив полученную подпись "чистом" виде, получил то что хотел. Кракозаблы, кусок текста, кракозяблы. Большое спасибо Андрею со звездочкой. С его словами про почитать литературу я полностью согласен. Но не всегда есть на это время. Приходится сходу в бой.
Вдруг кому-то поможет: Если сохранить полученную присоединенную подпись в файл, и просмотреть его не бинарно а как текст, то увидим исходное сообщение.
Это была первая часть моего вопроса. Полученный файл все равно не проверяется в КриптоАрм. Выдается сообщение:
Ошибка сохранения сообщения (0x80004005)
Произошла ошибка при загрузке сообщения. Вероятно сообщение имеет некорректный формат. (0x80004005)
Включено неверное значение тега ASN1. (0x8009310b) (0x80004005)
Но это тема другой рубрики.
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Как создать присоединенную подпись, чтобы исходное сообщение не кодировалось
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close