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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline andreyxvo  
#1 Оставлено : 21 декабря 2011 г. 21:08:20(UTC)
andreyxvo

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Андрей Писарев  
#2 Оставлено : 21 декабря 2011 г. 21:12:20(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Цитата:
Есть задача создать присоединенную подпись документа и сохранить ее в файл, таким образом, чтобы иходное содержание файла читалос.

странный подход...

чтобы pkcs7 формат смотреть\читать как текст....

делай отсоединенную подпись...



Отредактировано пользователем 21 декабря 2011 г. 21:20:00(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#3 Оставлено : 21 декабря 2011 г. 21:19:15(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Цитата:
Подпись получаю с помощю функции CryptoAPY CryptSignMessage(), потом успешно проверяю ее самописными средствами. Но нужно чтоб проверку можно было осуществить и с помощью КриптоАРМ.


так значит КриптоАРМ сообщает об ошибке при проверке?

ошибку и примеры ЭЦП в виде файлов выложи


Техническую поддержку оказываем тут
Наша база знаний
Offline andreyxvo  
#4 Оставлено : 21 декабря 2011 г. 21:57:21(UTC)
andreyxvo

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Андрей Писарев  
#5 Оставлено : 21 декабря 2011 г. 22:10:12(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Цитата:
Про отсоединенную подпись была самая первая мысль. Создать ее и простой склейкой прикрепить к файлу.


она на то и отсоединенная - в отдельном файле...



как заказчик будет "смотреть" подписанный присоединенной подписью файл НЕ текстового формата (например xls,doc, pdf, jpg) ?
Должно быть ПО (например, КриптоАРМ), которое после проверки позволяет извлечь подписанные данные и сохранить их в файл, чтобы открыть потом в нужном ПО (в зависимости от типа данных\расширения)







Отредактировано пользователем 21 декабря 2011 г. 22:17:10(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline andreyxvo  
#6 Оставлено : 21 декабря 2011 г. 22:11:21(UTC)
andreyxvo

Статус: Активный участник

Группы: Участники
Зарегистрирован: 21.12.2011(UTC)
Сообщений: 45
Мужчина
Откуда: Москва

Это была наипервейшая мысль.
Offline Андрей Писарев  
#7 Оставлено : 21 декабря 2011 г. 22:16:21(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
начни с теории (PKI, pkcs7 и т.п. ), а уж потом с практики... ( я про примеры... "кода")



Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#8 Оставлено : 21 декабря 2011 г. 22:18:29(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Цитата:
У меня получается такая абра-кадабра.
Code:

b8dcc034....


Цитата:
такая абра-кадабра.


конечно... а мне что с этим делать?

пришли файлы с присоединенной ЭЦП, а не в hex



Отредактировано пользователем 21 декабря 2011 г. 22:20:40(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#9 Оставлено : 21 декабря 2011 г. 22:20:20(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
кстати... риторический вопрос... как и к предыдущим\последующим участникам:
почему перед написанием\копированием\ кода - не были просмотрены ветки "Встраивание" и т.п. + поиск по форуму ?


Техническую поддержку оказываем тут
Наша база знаний
Offline andreyxvo  
#10 Оставлено : 22 декабря 2011 г. 15:22:09(UTC)
andreyxvo

Статус: Активный участник

Группы: Участники
Зарегистрирован: 21.12.2011(UTC)
Сообщений: 45
Мужчина
Откуда: Москва

Короче я балбес.
Видимо начитавшись не совсем првильных источников, либо поняв не правильно их, стал пихать все в hex.
Сохранив полученную подпись "чистом" виде, получил то что хотел. Кракозаблы, кусок текста, кракозяблы.
Большое спасибо Андрею со звездочкой. С его словами про почитать литературу я полностью согласен. Но не всегда есть на это время. Приходится сходу в бой.

Вдруг кому-то поможет:
Если сохранить полученную присоединенную подпись в файл, и просмотреть его не бинарно а как текст, то увидим исходное сообщение.

Это была первая часть моего вопроса. Полученный файл все равно не проверяется в КриптоАрм. Выдается сообщение:

Ошибка сохранения сообщения (0x80004005)

Произошла ошибка при загрузке сообщения.
Вероятно сообщение имеет некорректный формат. (0x80004005)

Включено неверное значение тега ASN1. (0x8009310b) (0x80004005)

Но это тема другой рубрики.

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.