Анимация
JavaScript
|
Главная Библионтека .ENDIF inc edi mov al,byte ptr[esi] and al,OFh .IF al<=9 add al,"0" mov byte ptr[edi],al . ELSE sub al,10 add al,"A" mov byte ptr [edi],al .ENDIF inc inc dec cmp ecx,I jnz XX edi esi ecx mov xor ret ByteToStr ENDP byte ptr[edi],0 eax,eax End DllEntry mscapit.def LIBRARY EXPORTS mscapit TestFunction Целью MS Crypto API является предоставить разработчику программ универсальный способ для использования криптографических модулей, поэтому интерфейс не ограничен какими-либо конкретными алгоритмами. Выбор конкретного алгоритма задается параметрами функций и зависит от используемого криптопровайдера. Перечислим основные задачи, решаемые с помощью крипторафйческого API Windows: шифрование и расшифровка данных, выработка и проверка цифровой подписи (контрольной суммы), средства работы с цифровыми сертификатами, кодирование и декодирование данных, выработка и хранение криптофафических ключей. Порядок взаимодействия приложений с криптофафическими модулями операционной системы регламентирует документ, который называется Microsoft Cryptographic Application Programming Interface (MS Crypto API). Функции, описанные в нем, поддерживаются Windows 95/98, Windows NT, 2000, XP. В последней ОС функции Crypto API содержатся в модулях crypt32.dll и advapi32.dll. На самом деле эти модули не реализуют криптофафИ ческие алгоритмы, а обращаются к другим модулям, называемым Cryptographic Service Providers (CSP). Одновременно в операционной системе можно установить несколько CSP-При первом обращении к Crypto API прикладная профамма выбирает, с каким именно дудем CSP она будет работать, в зависимости от того, какие криптофафические алго- ритмы ей необходимы. Эффективность криптозащиты зависит не только от использования определенных Mexai Лйзмов (криптопротоколов), таких, как шифрование или цифровая подпись, но и от выбора конкретных алгоритмов (криптопримитивов), реализуемых конкретным CSP. Список всех (-§р (криптопровайдеров), установленных в Windows 2000, можно получить в разделе jY LOCAL MACHINE\SOFTWARE\ Microsoft\Cryptography\Defeults\Provider системногс реестра Windows. Большинство протоколов защиты данных фебует использования конкретных криптоалгоритмов. Для того чтобы прикладные профаммы соответствовали общепринятым стандартам. Crypto API вводит специальные типы CSP, например PROVRSAFULL mv PR0V RSA SCHANNEL. Криптопровайдер указанного типа должен реализовывать все криптоалгоритмы, определенные соответствующим стандартом. Так, к примеру PROV RSA SCHANNEL используется для реализации протокола SSL и должен поддерживать алгоритм RSA для цифровой подписи и обмена ключами, алгоритмы хеширования SHA и MD5 и специальную функцию CALG SSL3 SHAMD5 и т. д. Наша библиотека mscapit.dll организовьшает простой интерфейс к MS Crypto API а точнее, к его средствам хеширования MD5. Рассмофим текст функции TestFunction. TestFunction proc uses esi edi lpstring:DWORD LOCAL hCryptProv:HCRYPTPROV LOCAL hHas:HCRYPTHASH LOCAL dwLength:DWORD LOCAL sHash[512]:BYTE (хеш-образа) описатель криптопровайдера описатель объекта хеширования ; длина входной строки ; массив контрольной суммь invoke CryptAcquireContext,ADDI hCryptProv,NULL,NULL, PROV RSA FULL,CRYPT VERIFYCONTEXT .IF eax==0 .ELSE jmp error invoke CryptCreateHash,hCryptProv,CALG MD5,0,0,ADDR hHash .IF eax==0 jmp error .ELSE invoke Istrlen,Ipstring mov dwLength,eax invoke СryptHashData, hHash, Ipstring, dwLength,0 .IF eax==0 dwLength, О jmp error .ELSE mov invoke CryptGetHashParam,hHash,HP HASHVAL,ADDR dwLength,SIZEOF sHash sHash,Ac- .IF eax==0 jmp error .ELSE invoke ByteToStr,dwLength,ADDR sHash,Ipstring /convert byte array to hex string invoke . CryptDestroyHash,hHash xor eax,eax jmp exit .ENDIF .ENDIF invoke CryptReleaseContext,hCryptProv,0 .ENDIF error: exit: .ENDIF invoke GetLastError invoke DisplayError,eax mov . eax,-1 TestFunction endp DisplayError PROC Error ID;DWORD Директива LOCAL резервирует память в стеке для локальных переменных функций Все директивы LOCAL должны следовать непосредственно за директивой PROC. Обращение к локальным переменным в тексте программы происходит без каких бы то ни бы ло команд манипулирования стеком. Вызов CryptAcquireContext требуется любой программе, работающей с MS Сгур API, именно этой функцией пользователь задает имя используемого криптопровайдер его тип и имя рабочего ключевого контейнера. Функция CryptAcquireContext возврат описатель криптопровайдера, который в дальнейщем может быть использован при р те его функционалом. CryptAcquireContext proto hpProv: DWORD, / pszContainer: DWORD, / pszProvider: DWORD, / dwProvType: DWORD, / dwFlags: DWORD hpProv - указатель на описатель криптопровайдера.-pszContainer - имя контейнера ключей. pszProvider - имя криптопровайдера. dwProvType - тип запрашиваемого криптопровайдера. dwFlags - дополнительные флаги. Для инициализации операции хэширования потока данных нам потребуется вызов ryptCreateHash, который создаст новый объект хэщ-функции и вернет его описатель. CryptCreateHash proto hProv:DWORD, / Algid: DWORD, / hKey: DWORD, / dwFlags: DWORD, phHash: DWORD hpProv - описатель криптопровайдера. Algid - идентификатор используемого алгоритма хэширования. hKey - описатель сессионного ключа, используется в алгоритмах .эширования с секретным ключом. dwFlags - зарезервирован для дальнейшего использования phHash - адрес переменной, в которую возвращается описатель но-":эго объекта хэш-функции. Следующей операцией, выполняемой функцией TestFunction, является вычисление значения контрольной суммы (хэша) переданной строки - вызов CryptHashData. Он используется для добавления данных к объекту хэщ-функции. Многократный вызов функции CryptHashData позволяет вычисление значения хэша для последовательностей, разбитых на блоки. CryptHashData proto hHash:DWORD, / pbData: DWORD, / dwDataLen: DWORD, / dwFlags: DWORD, hHash - описатель объекта хэш-функции. pbData - буфер, содержащий хэшируемые данные. dwDataLen - размер хэшируемых данных в байтах. dwFlags - флаги. Следующая задача - получить результат работы криптоалгоритма. И эту операщ,, для операций хэширования выполняет вызов CryptGetHashParam, возвращающий пара, метры объекта хэщ-функции. CryptGetHashParam proto hHash:DHORD, / dwParam: DWORD, / pbData: DWORD, / pbDataLen: DWORD, dwFlags: DWORD, hHash - описатель объекта хэш-функции. dwParam - тип получаемой информации, результат хэширования ид список поддерживаемых алгоритмов. pbData - буфер для запрашиваемых данных. dwDataLen - указатель на размер буфера данных в байтах. dwFlags - флаги. Для корректного завершения работы с криптопровайдером необходимо разрушить объект хэш-функции и освободить описаталь криптопровайдера. Это, соответственно, реализуют вызовы CryptDestroyHash и CryptReleaseContext. CryptDestroyHash proto hHash:DWORD Функция уничтожает объект хэш-функции, определенный описателем hHash, после уничтожения его описатель становится недействительным. CryptDestroyHash proto hProv:DWORD, / dwFlags-. DWORD Эта функция освобождает описатель криптопровайдера hProv, созданный вызовом CrypAcquireContext. Параметр dwFlags зарезервирован для использования в будущем. Полученное значение контрольной суммы в функции TestFunction дополнительно конвертируется в символьную строку шестнадцатеричного дампа для удобного отображения на экране. В заключение еще раз перечислим круг вопросов, обсуждавшихся на протяжении данной главы: Ш предпосылки к выбору инструментария разработки программ на языке ассемблер для ОС Windows; структура приложения ОС Windows на языке ассемблер; т механизмы взаимодействия приложения с системными сервисами ОС Windows на ассемблере; Ш разработка динамически загружаемых библиотек на языке ассемблер для Windows; т криптофафические средства ОС Windows и их использование в профаммах на языке ассемблере. Глава 6 Оптимизация для процессоров семейства Pentium 6.1. Введение В этой главе подробно рассказывается о том, как писать оптимизированный код на ассемблере для семейства микропроцессоров Intel Pentium. В табл. 6.1 приводятся аббревиатуры, используемые в тексте для ссылки на то или иное поколение процессоров Pentium, подчеркивая его уникальные особенности: Табл. 6.1. Основные поколения семейства процессоров Intel Pentium
Поколение микропроцессоров PI и РММХ, в отличие от остальных более поздних, имеет много уникальных особенностей оптимизации часто используемых операций и их комбинаций. Поэтому можно сказать, что не существует общих методик оптимизации для всех поколений. Правила оптимизации кода весьма сложны и имеют много исключений, но возможный выигрыш в производительности весьма значителен. У процесоров РРго, Р2 и РЗ также существуют значительные отличия внутренней реализации архитертуры Х86 в том, как процессор оптимизирует исполнение потока инструкций, не говоря уже про Постоянное расширение их набора. Современное поколение микропроцессоров Pentium 4 наиболее значительно отличается от предыдущих поколений своей внуфенней реализацией. По этому обсуждение приемов оптимизации для него - отдельная тема исследования и в данной главе будет Опущена - читатель может обратиться к соответствующим руководствам от Intel. Прежде чем начать реализовывать на некотором языке профаммирования решение Поставленной задачи, следует убедиться, что используемый в нем алгоритм оптимален. Зачас- 0 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 |