Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получение электронной подписи из подписанного файла / 25 сообщений из 39, страница 1 из 2
10.11.2014, 15:17
    #38800918
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
Добрый день.

Подскажите, как можно получить электронную подпись из подписанного файла? Например, у меня есть файл, который я подписал созданным мной сертификатом. После этого я отправляю его клиенту и хочу проверить его подпись. У клиента сертификат установлен.
Мне кажется, что нужно пользоваться методом VerifyData экземпляра RSACryptoServiceProvider, но как из подписанного файла извлечь подпись (signature - третий параметр в функции) до меня не доходит.

Спасибо.
...
Рейтинг: 0 / 0
10.11.2014, 15:41
    #38800963
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
shtuceron,

читайте здесь: 16687942
...
Рейтинг: 0 / 0
10.11.2014, 16:36
    #38801069
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
Спасибо, но в примерах из приведенного поста человек работал с отделенной цифровой подписью. Я работаю с присоединенной и как отделить ее, а потом проверить пока еще не дошло...
...
Рейтинг: 0 / 0
10.11.2014, 16:43
    #38801075
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
shtuceronСпасибо, но в примерах из приведенного поста человек работал с отделенной цифровой подписью. Я работаю с присоединенной и как отделить ее, а потом проверить пока еще не дошло...
Точно читали? http://msdn.microsoft.com/ru-ru/library/aedbc064(v=vs.110).aspx
...
Рейтинг: 0 / 0
10.11.2014, 16:43
    #38801077
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
А может быть я путая терминологию... может быть это ЭЦП внутри данных. Визуально я вижу в свойствах программы новую вкладку "Цифровые подписи"
...
Рейтинг: 0 / 0
11.11.2014, 02:02
    #38801423
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
shtuceronА может быть я путая терминологию... может быть это ЭЦП внутри данных. Визуально я вижу в свойствах программы новую вкладку "Цифровые подписи"

Т.е речь о цифровых подписях в исполняемых файлах ...
А на о CMS - присоединенная подпись...
...
Рейтинг: 0 / 0
11.11.2014, 02:14
    #38801426
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
shtuceron,

Тогда WinVerifyTrust в помощь...
и с ней же:
CryptCATAdminCalcHashFromFileHandle
CryptCATAdminEnumCatalogFromHash
CryptCATAdminReleaseCatalogContext
CryptCATAdminReleaseContext
...
Рейтинг: 0 / 0
11.11.2014, 10:48
    #38801694
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
sql2012, да, мой вопрос как раз о цифровых подписях в исполняемых файлах.

Простите, не понял, что значит "А на о CMS - присоединенная подпись..."?
...
Рейтинг: 0 / 0
11.11.2014, 11:12
    #38801745
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
shtuceronsql2012, да, мой вопрос как раз о цифровых подписях в исполняемых файлах.

Простите, не понял, что значит "А на о CMS - присоединенная подпись..."?

Читать как: "А не о CMS"

CMS - Cryptographic Message Syntax .
Т.е подписывается произвольный файл...

Или было не понятно что такое "присоединенная подпись..."?

shtuceronСпасибо, но в примерах из приведенного поста человек работал с отделенной цифровой подписью. Я работаю с присоединенной и как отделить ее, а потом проверить пока еще не дошло...
...
Рейтинг: 0 / 0
11.11.2014, 12:06
    #38801815
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
Я нашел кусочек кода. Он компилируется, но результат от входного параметра (файла) не меняется. У меня есть три файла. 1. Не подписанный 2. Подписанный мной (создал сертификат и подписал) 3. Подписанный сторонней компанией (взял AcroRd32.exe).

Каждый файл не подписан...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
BOOLEAN IsFileDigitallySigned(PWCHAR FilePath)
{
    //Author: AD, 2009
    PVOID Context;
    HANDLE FileHandle;
    DWORD HashSize = 0;
    PBYTE Buffer;
    PVOID CatalogContext;
    CATALOG_INFO InfoStruct;
    WINTRUST_DATA WintrustStructure;
    WINTRUST_CATALOG_INFO WintrustCatalogStructure;
    WINTRUST_FILE_INFO WintrustFileStructure;
    PWCHAR MemberTag;
    BOOLEAN ReturnFlag = FALSE;
    ULONG ReturnVal;
    GUID ActionGuid = WINTRUST_ACTION_GENERIC_VERIFY_V2;

    //Zero our structures.
    memset(&InfoStruct, 0, sizeof(CATALOG_INFO));
    InfoStruct.cbStruct = sizeof(CATALOG_INFO);
    memset(&WintrustCatalogStructure, 0, sizeof(WINTRUST_CATALOG_INFO));
    WintrustCatalogStructure.cbStruct = sizeof(WINTRUST_CATALOG_INFO);
    memset(&WintrustFileStructure, 0, sizeof(WINTRUST_FILE_INFO));
    WintrustFileStructure.cbStruct = sizeof(WINTRUST_FILE_INFO);

    //Get a context for signature verification.
    if( !CryptCATAdminAcquireContext(&Context, NULL, 0) )
    {
        return FALSE;
    }

    //Open file.
    FileHandle = CreateFileW(FilePath, GENERIC_READ, 7, NULL, OPEN_EXISTING, 0, NULL);
    if( INVALID_HANDLE_VALUE == FileHandle )
    {
        CryptCATAdminReleaseContext(Context, 0);
        return FALSE;
    }

    //Get the size we need for our hash.
    CryptCATAdminCalcHashFromFileHandle(FileHandle, &HashSize, NULL, 0);
    if( HashSize == 0 )
    {
        //0-sized has means error!
        CryptCATAdminReleaseContext(Context, 0);
        CloseHandle(FileHandle);
        return FALSE;
    }

    //Allocate memory.
    Buffer = (PBYTE)calloc(HashSize, 1);

    //Actually calculate the hash
    if( !CryptCATAdminCalcHashFromFileHandle(FileHandle, &HashSize, Buffer, 0) )
    {
        CryptCATAdminReleaseContext(Context, 0);
        free(Buffer);
        CloseHandle(FileHandle);
        return FALSE;
    }

    //Convert the hash to a string.
    MemberTag = (PWCHAR)calloc((HashSize * 2) + 1, sizeof(WCHAR));
    for( unsigned int i = 0; i < HashSize; i++ )
    {
        swprintf(&MemberTag[i * 2], L"%02X", Buffer[i ]);
    }

    //Get catalog for our context.
    CatalogContext = CryptCATAdminEnumCatalogFromHash(Context, Buffer, HashSize, 0, NULL);
    if ( CatalogContext )
    {
        //If we couldn't get information
        if ( !CryptCATCatalogInfoFromContext(CatalogContext, &InfoStruct, 0) )
        {
            //Release the context and set the context to null so it gets picked up below.
            CryptCATAdminReleaseCatalogContext(Context, CatalogContext, 0);
            CatalogContext = NULL;
        }
    }
        
    //If we have a valid context, we got our info.  
    //Otherwise, we attempt to verify the internal signature.
    if( !CatalogContext )
    {
        WintrustFileStructure.cbStruct = sizeof(WINTRUST_FILE_INFO);
        WintrustFileStructure.pcwszFilePath = FilePath;
        WintrustFileStructure.hFile = NULL;
        WintrustFileStructure.pgKnownSubject = NULL;

        WintrustStructure.cbStruct = sizeof(WINTRUST_DATA);
        WintrustStructure.dwUnionChoice = WTD_CHOICE_FILE;
        WintrustStructure.pFile = &WintrustFileStructure;
        WintrustStructure.dwUIChoice = WTD_UI_NONE;
        WintrustStructure.fdwRevocationChecks = WTD_REVOKE_NONE;
        WintrustStructure.dwStateAction = WTD_STATEACTION_IGNORE;
        WintrustStructure.dwProvFlags = WTD_SAFER_FLAG;
        WintrustStructure.hWVTStateData = NULL;
        WintrustStructure.pwszURLReference = NULL;
    } else
    {
        //If we get here, we have catalog info!  Verify it.
        WintrustStructure.cbStruct = sizeof(WINTRUST_DATA);
        WintrustStructure.pPolicyCallbackData = 0;
        WintrustStructure.pSIPClientData = 0;
        WintrustStructure.dwUIChoice = WTD_UI_NONE;
        WintrustStructure.fdwRevocationChecks = WTD_REVOKE_NONE;
        WintrustStructure.dwUnionChoice = WTD_CHOICE_CATALOG;
        WintrustStructure.pCatalog = &WintrustCatalogStructure;
        WintrustStructure.dwStateAction = WTD_STATEACTION_VERIFY;
        WintrustStructure.hWVTStateData = NULL;
        WintrustStructure.pwszURLReference = NULL;
        WintrustStructure.dwProvFlags = 0;
        WintrustStructure.dwUIContext = WTD_UICONTEXT_EXECUTE;

        //Fill in catalog info structure.
        WintrustCatalogStructure.cbStruct = sizeof(WINTRUST_CATALOG_INFO);
        WintrustCatalogStructure.dwCatalogVersion = 0;
        WintrustCatalogStructure.pcwszCatalogFilePath = InfoStruct.wszCatalogFile;
        WintrustCatalogStructure.pcwszMemberTag = MemberTag;
        WintrustCatalogStructure.pcwszMemberFilePath = FilePath;
        WintrustCatalogStructure.hMemberFile = NULL;
    }

    //Call our verification function.
    ReturnVal = WinVerifyTrust(0, &ActionGuid, &WintrustStructure);

    //Check return.
    ReturnFlag = SUCCEEDED(ReturnVal);

    //Free context.
    if( CatalogContext )
        CryptCATAdminReleaseCatalogContext(Context, CatalogContext, 0);

    //If we successfully verified, we need to free.
    if( ReturnFlag )
    {
        WintrustStructure.dwStateAction = WTD_STATEACTION_CLOSE;
        WinVerifyTrust(0, &ActionGuid, &WintrustStructure);
    }

    //Free memory.
    free(MemberTag);
    free(Buffer);
    CloseHandle(FileHandle);
    CryptCATAdminReleaseContext(Context, 0);

    return ReturnFlag;
}



Когда я читал о цифровых подписях и подписанных файлах у меня сложилось ощущение, что для того чтобы проверить подписанный файл необходимо

1. Вычислить контрольную сумму файла без цифровой подписи (т.е. отсоединить подпись от подписанного файла иначе контрольная сумма будет другой)
2. Прочитать открытый ключ и расшифровать контрольную сумму, которая содержится в цифровой подписи
3. Сравнить эти контрольные суммы и убедиться, что файл не изменялся.
...
Рейтинг: 0 / 0
11.11.2014, 12:16
    #38801831
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
shtuceron,

И какая ошибка, где не проходит AcroRd32.exe по коду проверку?
...
Рейтинг: 0 / 0
11.11.2014, 12:22
    #38801844
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
Код: plaintext
1.
CatalogContext = CryptCATAdminEnumCatalogFromHash(Context, Buffer, HashSize, 0, NULL);



CatalogContext - не инициализируется (0x00000000)
...
Рейтинг: 0 / 0
11.11.2014, 12:24
    #38801846
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
В идеале хотелось бы не только .exe проверять, .dll в перспективе тоже нужно.
...
Рейтинг: 0 / 0
11.11.2014, 12:56
    #38801921
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
shtuceronВ идеале хотелось бы не только .exe проверять, .dll в перспективе тоже нужно.

Нет разницы.
...
Рейтинг: 0 / 0
11.11.2014, 13:18
    #38801975
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
sql2012, спасибо

А с CatalogContext есть какие-нибудь предположения?
...
Рейтинг: 0 / 0
11.11.2014, 13:26
    #38802006
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
И еще один вопрос, WinVerifyTrust проверяет только наличие подписи (подписан файл или нет)?
...
Рейтинг: 0 / 0
11.11.2014, 15:45
    #38802293
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
Я попробовал вызвать функцию CryptCATAdminEnumCatalogFromHash для файла "C:\Windows\system32\kernel32.dll", CatalogContext != 0, но файл не подписан, так что результат такой же...

Может быть функция CryptCATAdminEnumCatalogFromHash работает не с каждым файлом?
...
Рейтинг: 0 / 0
11.11.2014, 16:20
    #38802342
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
И еще, как выяснилось опытным путем. Файл может не иметь цифровой подписи, но проходить проверку функцией
Код: plaintext
1.
WinVerifyTrust

если он по каким-либо причинам "нравится" windows (доверяет). Но если файл взят со "стороны", то только наличие сертификата у файла позволяет функции
Код: plaintext
1.
WinVerifyTrust

завершаться с нулевым результатом.
...
Рейтинг: 0 / 0
11.11.2014, 20:07
    #38802731
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
shtuceronИ еще, как выяснилось опытным путем. Файл может не иметь цифровой подписи, но проходить проверку функцией
Код: plaintext
1.
WinVerifyTrust

если он по каким-либо причинам "нравится" windows (доверяет). Но если файл взят со "стороны", то только наличие сертификата у файла позволяет функции
Код: plaintext
1.
WinVerifyTrust

завершаться с нулевым результатом.

Не верю... (с).

Без подписи - не проходит.
С испорченной - не проходит.
...
Рейтинг: 0 / 0
11.11.2014, 20:20
    #38802748
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
shtuceron,

проверь: http://rghost.ru/59013754
входной параметр командной строки - файл для проверки (можно перетащить на иконку программы).
...
Рейтинг: 0 / 0
12.11.2014, 10:26
    #38803091
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
sql2012shtuceron,

проверь: http://rghost.ru/59013754
входной параметр командной строки - файл для проверки (можно перетащить на иконку программы).

А вы сами проверьте. Возьмите файл d3dx10_34.dll или kernel32.dll например. В свойствах этих файлов нет вкладки "Цифровые подписи".
...
Рейтинг: 0 / 0
12.11.2014, 11:02
    #38803135
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
shtuceronsql2012shtuceron,

проверь: http://rghost.ru/59013754
входной параметр командной строки - файл для проверки (можно перетащить на иконку программы).

А вы сами проверьте. Возьмите файл d3dx10_34.dll или kernel32.dll например. В свойствах этих файлов нет вкладки "Цифровые подписи".

Отсутствие вкладки не говорит об отсутствии подписи .

Signature verification Signed file, verified signature
Signing date 6:21 PM 3/4/2014
Signers
[+] Microsoft Windows
[+] Microsoft Windows Verification PCA
[+] Microsoft Root Certificate Authority
Counter signers
[+] Microsoft Time-Stamp Service
[+] Microsoft Time-Stamp PCA
[+] Microsoft Root Certificate Authority
...
Рейтинг: 0 / 0
12.11.2014, 11:05
    #38803145
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
shtuceron,

соответственно, если этот файл (kernel32.dll) будет изменен - подпись не пройдет проверку в WinVerifyTrust.
...
Рейтинг: 0 / 0
12.11.2014, 11:49
    #38803235
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
авторОтсутствие вкладки не говорит об отсутствии подписи.

sql2012, спасибо, этого я не знал.
...
Рейтинг: 0 / 0
12.11.2014, 12:26
    #38803300
shtuceron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение электронной подписи из подписанного файла
После того как мы узнаем, что программа подписано необходимо отсоединить данные от подписи, вычислить хеш данных и сравнить с хешем, который содержится в цифровой подписи.

Гугл подсказал, что реализуется это с помощью функций CryptMsgOpenToDecode, CryptMsgUpdate, CryptMsgGetParam . В первом случае CryptMsgOpenToDecode я создаю объект для сообщения с присоединенной подписью, потом заполняю данными выделенный буфер для сообщения CryptMsgUpdate и извлекаю из него подпись CryptMsgGetParam

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
CMSG_STREAM_INFO StreamInfo;

       StreamInfo.cbContent = CMSG_INDEFINITE_LENGTH;
       StreamInfo.pfnStreamOutput = CmsgStreamOutputCallback;
       StreamInfo.pvArg = NULL;

	HCRYPTMSG hMsg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, 0, NULL, NULL, &StreamInfo);

	BOOL isFinal = FALSE;
	HANDLE hFile= CreateFile(filePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	do
	{
		DWORD readed = 0;
		BYTE buf[BUFSIZE];

        if (!ReadFile(hFile, buf, BUFSIZE, &readed, NULL))
		{
			printf("Cannot read file 0x0%X\n", GetLastError());

            exit(1);
        }
		
		printf("Read %u\n", readed);

        if( readed == 0)
			isFinal = TRUE;

        if (!CryptMsgUpdate(hMsg, buf, readed, isFinal))
		{
			printf("Cannot update message 0x0%X\n", GetLastError());
			
			exit(1);
        }

        if (isFinal)
		{
			DWORD size = 0;

			CryptMsgGetParam(hMsg, CMSG_ENCRYPTED_DIGEST, 0, NULL, &size);
		}
	}
	while (!isFinal);

	CloseHandle(hFile);



Но в функции CryptMsgUpdate происходит ошибка 0х08009310B, как ее нужно обходить и как можно достучаться до цифровой подписи.

Спасибо.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получение электронной подписи из подписанного файла / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]