HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Безопасность и Анонимность > Защита ОС: вирусы, антивирусы, файрволы.
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 27.06.2021, 19:04
Marylin
Постоянный
Регистрация: 01.09.2019
Сообщений: 378
С нами: 3526561

Репутация: 0
По умолчанию

Windows Vista взошла на трон в 2007-ом, но спустя буквально 1.5 года была с позором свергнута общественными критиками. Уныло шагая прочь, она с тоскою поглядывала на кричащее вслед сообщество, которое даже не успело должным образом оценить все её достоинства. Злую шутку с Вистой сыграл второпях наляпанный интерфейс, а ведь система подряжалась прийти к нам не с пустыми руками и хотела представить миру массу новых разработок, которые мы всё-таки взяли на вооружение, и пользуемся ими по сей день.

Одним из новшеств стала "криптография нового поколения" под названием CNG, или Cryptorgaphy Next Generation. Инфраструктура была призвана заменить отживший свой век на XP интерфейс CAPI (Crypto-API), оставив его лишь для совместимости. Входящими в состав CNG примитивами тут-же поспешили воспользоваться изголодавшиеся на тот момент сетевые протоколы SSL/TLS (Secure-Socket-Layer, и Transport-Layer-Secure), и как следствие весь зоопарк интернет-браузеров. На особом месте стоит и герой этой статьи – метод шифрования с аутентификацией, реализованный в современной линейке Win алгоритмом AES в режиме GCM. Предлагаю посмотреть на CNG и AES со-всевозможных ракурсов, а в некоторых случаях и под микроскопом.

Содержание:


1. Базовые сведения;
2. Симметричные и асимметричные алгоритмы;
3. Примитивы CNG из библиотеки bcrypt.dll;
4. Алгоритм AES и режимы его работы;
5. Практика – сбор информации об алгоритмах CNG;
6. Заключение.
-------------------------------------------------------

1. Базовые сведения

Криптография является настолько объёмной наукой, что охватить всё направление в одной статье никак не получиться. По этой причине, придётся сделать акцент только на симметричных алгоритмах шифрования, как наиболее популярных с практической точки зрения. Есть ещё асимметричные алго, в которых применяются пара ключей – открытый и закрытый, в то время как симметричные функции требуют от нас только одного открытого ключа.

Все крипто-алгоритмы делятся на три генетических вида – вообще без ключей, с одним, и с двумя ключами. К примеру можно не передавать ключ функции шифрования, как это реализовано в генераторах случайных чисел RNG (RandomGen), или при хешировании данных алгоритмом SHA без соли. На рисунке ниже представлена зависимость функций от ключей:




Операционные системы начиная с Win7 вполне самодостаточны и не требуют для криптографии библиотек сторонних разработчиков. В то-же время, в некоторых компьюнити советуют использовать для этих целей левые модули типа OpenSSL, Crypto++, Sodium и прочие. Можно предположить, что подобные настроения возникают у программистов в большей степени из-за того, что они просто не могут разобраться с функциями библиотеки CNG bcrypt.dll, которая идёт в штатной поставке Win. И это не спроста, т.к. одни и те-же функции данной либы поддерживают работу как в пользовательском режиме, так и в режиме ядра. То-есть это библиотека низкого уровня и вести с ней диалог нужно только на лексиконе Unicode, поскольку ядро в упор не понимает строк ANSI. Благо всё уже прописано в сишном хидере bcrypt.h и нам остаётся лишь скопипастить его в свой инклуд (см.скрепку в подвале).

Эти и другие мелочи требуют особого внимания, за что система щедро отблагодарит нас мощной поддержкой шифрования, начиная от обычного DES и заканчивая современным AES/GCM с кодами аутентификации МАС. Если разобраться со-всеми нюансами, то можно будет с лёгкостью писать стиллеры паролей современных браузеров, расшифровывать перехваченные пакеты протоколов SSL/TLS, и многое другое. С приходом инфраструктуры CNG, алгоритм AES в режиме счётчика-Галуа (gcm) используется повсеместно, поскольку сочетает в себе как шифрование данных 32-байтным ключом (256-бит), так и проверку целостности этих данных на стороне получателя.

2. Симметричные и асимметричные алгоритмы

Нельзя утверждать, что симметричные алгоритмы предпочтительнее асимметричных хотя-бы потому, что у каждого из них своя область применения. В большей мере это зависит от того, какие цели мы преследуем. Основным недостатком симметричного шифрования является необходимость публичной передачи ключа, которым было зашифровано сообщение. Это не проблема, когда общаются двое, однако накладывает свой отпечаток на раздачу ключей нескольким пользователям в сети. В остальном, алго можно считать достаточно эффективным, особенно на фоне асимметричного шифрования.

Поставщики криптографических услуг Win-CSP (Cryptography Service Provider), реализуют симметричное шифрование посредством всего трёх алгоритмов – это AES, DES и RC2/4. Так выглядит типичная схема обмена зашифрованными сообщениями:




Здесь видно, что у каждого абонента должен быть свой симметричный ключ, который он передаёт в криптографическую функцию. Значение ключа и самой функции (в нашем случае AES), должно быть оговорено двумя сторонами заранее, чтобы на приёмном узле можно было расшифровать полученные данные. В этой схеме, главное в тайне согласовать с получателем ключ, а о том как решают эту проблему гиганты типа браузеров лиса и хром, мы поговорим в следующей части статьи.

Асимметричные-же алгоритмы имеют два ключа, что позволяет им без проблем распространять открытые ключи по сети. Не имея второго "приватного" ключа, пароль нельзя будет расшифровать, поэтому публичный ключ не представляет особой ценности (смотря для кого). На этом принципе работает сетевой протокол SSL – благодаря публичным ключам он устанавливает безопасное соединение с пользователем, т.к. закрытый ключ есть только на стороне сервера.

На подготовительном этапе, каждый из участников сети генерируют себе не один, а сразу пару ключей – приватный и публичный. Суть в том, что публичный ключ создаётся на основе приватного и гуляет по сети вместе с сообщением. После того-как ключи созданы, все юзеры выкладывают свои публичные ключи на всеобщее обозрение, чтобы при помощи них отправители шифровали послания получателям. Это можно сравнить с номером телефона в сотовой связи. В результате, ни один из участников сети не сможет расшифровать чужую корреспонденцию, поскольку для этого требуется приватный ключ того пользователя, публичным ключом которого было зашифровано сообщение.

На схеме ниже, комиссар со звездой во-лбу (С) пытается отправить зашифрованное асимметричным ключом письмо, своей зазнобе (А). Для этого, он берёт её публичный ключ из кеша (ну или запрашивает его напрямую, если кеша нет), и криптует полученным ключом свои данные. При этом ни приватный, ни публичный свой ключ он не использует – приватный нужен только для расшифровки входящих сообщений, а публичным ключом будут шифровать сообщения ему.

Теперь, не важно как (голубем, или по каналам связи) он отправляет письмо получателю, который расшифровывает его своим приватным (секретным) ключом. Исходя из того, что оба ключа юзера привязываются друг-к-другу на этапе их создания, расшифровать послание чужим приватным ключом не получится – нужна только конкретная пара. Приватные ключи все держат при себе, и хранят их как зеницу ока. Визуальная схема такого обмена выглядит примерно так:




Системные провайдеры Win из асимметричных поддерживают три алгоритма – это ECC (Elliptic Сurve Сryptosystem, крипт на эллиптических кривых), RSA и DH. Аббревиатуры двух последних взяты по именам их создателей (видимо сильно любили себя шельмы) – это Rivest-Shamir-Adelman, и Diffie-Hellman соответственно. Если посмотреть на реалии, то выходит, что для асимметричного шифрования используется только RSA, а остальные – для тайной передачи ключей на расстояния "Secret Agreement", и оформлении цифровой подписи данных "Signature".

Основной недостаток асимметричного шифрования упирается в низкую скорость работы функции, что обусловлено ресурсоёмкими внутренними операциями. Более того, имеется проблема защиты открытых ключей от фальсификации (джокер на рис.выше), ведь достаточно просто подставить свой публичный ключ вместо любого, чтобы снифать его сообщения открывая их своим приватным ключом. Впрочем, схема хранения и передачи ключей – тема отдельной статьи. Здесь-же достаточно запомнить, что симметричное шифрование используется гораздо чаще асимметричного, а потому остальная часть статьи будет посвящена исключительно симметричному крипту.

3. Примитивы CNGиз библиотеки Вcrypt.dll

Подсистема криптографии CNG в современных ОС устроена так, что глобальным движком является библиотека BCRYPTPRIMITIVE.DLL (см.папку system32). Если заглянуть в её экспорт, можно обнаружить там всего шесть функций, при помощи которых она запрашивает соответствующие интерфейсы ядра (имена всех функций начинаются с префикса Get и заканчиваются суффиксом Interface). На более дружелюбном к юзеру высоком уровне расположилась либа Bcrypt.dll, в тушке которой сосредоточены уже сами функции на все случаи жизни. Поскольку они являются отдельными элементами глобальной системы криптографии, их назвали "примитивами". Не сказать, что таких примитивов много – в экспорте Bcrypt.dll на моей Win7 зарегистрировано всего 54 функций, большая часть из которых если и применяется, то только в клинических случаях.




4. Алгоритм шифрования AES, и режимы его работы

AES (Advanced Encryption Standard) – это расширенная версия устаревшего DES. Алгоритм представляет собой симметричный блочный шифр. Такое определение означает, что на вход процедуры шифрования данных, информация должна поступать блоками. Размер одного блока для AES всегда равен 16-байт, в виде матрицы 4х4. По этой причине, блочные шифры называют ещё "матричными". AES увеличивает кодируемую информацию и делает её кратным размеру блока. Однако при использовании режима "GCM" размер остаётся прежним – сколько байт забросим в печь, столько-же и получим с выхлопной трубы.

Чтобы после процедуры крипта была возможность обратно восстановить информацию, алгоритму требуется ключ-шифрования. Разрядность ключа указывается в названии алгоритма, например AES-128, 192 или 256 бит. Другие размеры ключей AES не поддерживает, так-что мы ограничены ключами: 128/8=16 байт, 192/8=24 байта, и 256/8=32 байта. Разница между зоопарком AES заключается только в размере ключа и кол-ве используемых повторений (раундов), но не в размере блока – блок всегда одинаковый 16-байт. Счётчик раундов составляет 10,12,14 итераций соответственно.

В наиболее простом и интуитивно понятном классическом режиме "ECB" (Electronic Codebook), сложным преобразованиям подвергается каждый блок данных, при этом такая операция повторяется над каждым блоком несколько раз, что подразумевает собой "раунд". Главный недостаток режима ЕСВ заключается в том, что одинаковые блоки исходных данных (например цепочка из 32-х и более нулей) при шифровании дадут одинаковые блоки шифротекста – это существенно содействует взлому. Поэтому режим ECB не рекомендуется использовать при шифровании текстов, по длине превышающих один 16-байтный блок.

Благодаря этой проблеме, на свет появился ещё один режим AES под кличкой "CBC" (Сipher Block Chaining). Здесь уже каждый последующий блок шифруется выходным значением предыдущего, что связывает блоки между собой образуя цепочку "Chain". При такой схеме возникает резонный вопрос: -"Если следующий блок кодируется предыдущим, то чем тогда кодировать самый первый блок, ведь у него нет предыдущего?".

Для этого, режим CBC требует на входе ещё одно значение, которое назвали "вектор инициализации" IV (Initialization Vector). В зависимости от режима работы (а кроме CBC есть ещё и масса других), размер IV может варьироваться в диапазоне от 12 до 16-байт, не превышая размер блока AES. Как-правило, его значение программист должен сгенерировать рандомно, на подготовительном этапе шифрования. Вот как выглядят эти режимы в графике (Plain открытый, Cipher зашифрованный текст):




Глядя на эту схему становится очевидно, что режим электронной книжки ECB отжил уже свой век, и на практике не рекомендуется к использованию. В случае со-вторым вариантом CBC, мы сталкиваемся с необходимостью передавать получателю вместе с зашифрованными данными ключ, и значение вектора IV – иначе декодер на приёмном узле просто не сможет расшифровать закодированную информацию. Думаю не имеет смысла упоминать о том, что будет, если по дороге "потеряется" какой-нибудь промежуточный блок – чинить уже будет нечего, т.к. все блоки связаны между собой неразрывными узами.

Алгоритм AES оказался настолько удачным, что разработчики начали комбинировать различные схемы. К примеру ещё одной вариацией режима CBC стал модернезированный "CFB" (Feed-Back, обратная связь). Здесь, сначала шифруется вектор IV, который на выходе складывается ксором
Код:
XOR
со входным блоком данных. Весьма интересная схема, и вполне может занять своё место на практике:




4.1. AES в режиме цепочки и счётчика

Следующим шагом к достижению гармонии было внедрение в алгоритм AES внутреннего счётчика – режим получил название "CTR" (Counter). Это самый распространённый вариант реализации AES из-за своей крипткостойкости ко взлому. Не смотря на то, что здесь нет связывания блоков между собой, каждый последующий блок всё-равно шифруется новым значением IV, поскольку при переходе к следующему блоку счётчик автоматически увеличивается на 1. Счётчик вектора IV имеет размер 4-байта, и на старте шифрования сбрасывается алгоритмом в нуль.




Цитата:

Важно! Обратите внимание, что в режимах без счётчика, значение вектора IV должно совпадать с размером 16-байтного блока AES. Это обязательное требование, иначе функция шифрования BCryptEncrypt() будет возвращать ошибку
Код:
"INVALID_PARAMETR"
. При этом в стиле Microsoft, какой именно параметр из 10-ти возможных не указывается, что затрудняет поиск проблемы.

Если-же мы выбрали режим шифрования AES со-счётчиком (CTR, CCM, GCM), то вектор IV должен быть размером уже 12-байт, поскольку 4-байтный внутренний счётчик фактически является частью IV, занимая в нём младшие 4-байта из 16-ти. Не забывайте об этом!

5. Практика – сбор информации о провайдерах CNG

Теперь, когда мы получили дозу фундаментальных основ, можно рассмотреть несколько функций из Bcrypt.dll. Начнём с того, что перечислим все поддерживаемые стандартным поставщиком Win-CNG алгоритмы, ведь должны-же мы знать, какие из них доступны нам для использования в своих программах. Для этого предусмотрена функция BCryptEnumAlgorithm() с таким прототипом:


C-подобный:


Код:
NTSTATUS BCryptEnumAlgorithms
;
//
cinvoke  printf
,

invoke  BCryptEnumAlgorithms
,
[
operation
]
,
algCount
,
algList
,
0
call    GetAlgoName

         shl
[
operation
]
,
1
cinvoke  printf
,

invoke  BCryptEnumAlgorithms
,
[
operation
]
,
algCount
,
algList
,
0
call    GetAlgoName

         shl
[
operation
]
,
1
cinvoke  printf
,

invoke  BCryptEnumAlgorithms
,
[
operation
]
,
algCount
,
algList
,
0
call    GetAlgoName

         shl
[
operation
]
,
1
cinvoke  printf
,

invoke  BCryptEnumAlgorithms
,
[
operation
]
,
algCount
,
algList
,
0
call    GetAlgoName

         shl
[
operation
]
,
1
cinvoke  printf
,

invoke  BCryptEnumAlgorithms
,
[
operation
]
,
algCount
,
algList
,
0
call    GetAlgoName

         shl
[
operation
]
,
1
cinvoke  printf
,

invoke  BCryptEnumAlgorithms
,
[
operation
]
,
algCount
,
algList
,
0
call    GetAlgoName
;
// *********************************************
cinvoke  printf
,

invoke  BCryptEnumAlgorithms
,
BCRYPT_CIPHER_OPERATION
,
algCount
,
algList
,
0
call    GetAlgoProperty

@exit
:
cinvoke  _getch
        cinvoke  exit
,
0
;
//------------
;
//----- ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ ------------//
proc GetAlgoName
;
//
,
esi
         pop     ecx esi
@
01
:
lodsw
         cmp     ax
,
0
jne     @
01
loop    @b
         ret
endp
;
//------------
proc GetAlgoProperty
;
//
,
esi
;
// Открыть алгоритм по имени (указатель на имя лежит в ESI)
pop     esi
         invoke  BCryptOpenAlgorithmProvider
,
algHndl
,
esi
,
0
,
0
;
// Размер блока шифрования
invoke  BCryptGetProperty
,
[
algHndl
]
,
BCRYPT_BLOCK_LENGTH
,
pLen
,
4
,
pcbResult
,
0
cinvoke  printf
,

,
[
pLen
]
;
// Диапазон размеров ключей (и их шаг)
invoke  BCryptGetProperty
,
[
algHndl
]
,
BCRYPT_KEY_LENGTHS
,
keyLen
,
12
,
pcbResult
,
0
mov     eax
,
[
keyLen
.
dwMinLen
]
mov     ebx
,
[
keyLen
.
dwMaxLen
]
mov     ecx
,
[
keyLen
.
dwIncrement
]
cinvoke  printf
,

,
\
                                 eax
,
ebx
,
ecx
;
// Размер временного буфера под данные
invoke  BCryptGetProperty
,
[
algHndl
]
,
BCRYPT_OBJECT_LENGTH
,
objLen
,
4
,
pcbResult
,
0
cinvoke  printf
,

,
[
objLen
]
pop     ecx esi
@@
:
lodsw
         cmp     ax
,
0
jne     @b
         dec     ecx
         jnz     @f
         jmp     @stop
@@
:
jmp     @cycle
@stop
:
ret
endp
;
//------------
section
'.idata'
import data readable
library  kernel32
,
'kernel32.dll'
,
msvcrt
,
'msvcrt.dll'
,
bcrypt
,
'bcrypt.dll'
include
'api\kernel32.inc'
include
'api\msvcrt.inc'
include
'api\bcrypt.inc'


Таким образом нам удалось получить неплохую голограмму инфраструктуры CNG, и это данные лишь одной из операций – симметричное шифрование. Лог в очередной доказывает, что алгоритм AES имеет размер входного блока 16-байт, и поддерживает три типа ключей: 128, 192 и 256 бит.

Зато его предшественник DES всех мастей, оперирует блоками по 8-байт, с фиксированными размерами ключей. Если классический DES производит над каждым своим блоком всего одну операцию шифрования, то 3DES повторяет её трижды (см.раунды).

А вот алгоритмы RC2 и RC4 в корень отличаются друг от друга, хотя и посещают одну синагогу. RC2 это блочный симметричный шифр с диапазоном ключей от 40 до 128 бит (с шагом в байт), в то время как RC4 относится к потоковым шифрам, т.к. он оперирует не блоками данных, а процеживает информацию по-байтно, шифруя на уровне бит.

Алгоритмы SHA и MD для хеширования – это стандартная практика. А вот то-что появился для этих целей AES-GMAC – это уже гуд. Что это такое мы обсудим в следующей части статьи, но если-бы нам приспичило получить хеш AES/GMAC на системе Win-XP, то пришлось-бы звать на помощь библиотеки сторонних разработчиков, такие как Crypto++. Начиная-же с Win-Vista данный алгоритм уже включён в состав ОС, и необходимость грузить непонятно кем написанные либы сама-собой отпадает.

Из асимметричных алго маячит только RSA, а больше нам и не надо – в этом сегменте RSA занимает позицию лидера. Кроме того имеем широкий выбор для создания цифровых подписей "Signature", и базовую тройку для генерации случайных чисел – это RNG (RandomGen мастдая), алгоритм одобренный институтом FIPS (Federal Information Processing Standard Publication), и DUAL_EC_RNG, что подразумевает "детерминированный генератор случайных бит с двойной эллиптической кривой".

6. Заключение

Наука о криптографии, а тем-более практическая её реализация, затягивает не по-детски. Если подходить к ней осмысленно, она открывает двери в такие закоулки системы, о которых мы и не подозревали. Но как и любое начинание, сначала нужно разобраться с теорией, пусть и не на уровне конкретных примитивов.

В следующей части запланировано несколько пруфов, которые докажут всё выше сказанное. Мы более подробно разберём современный и широко распространённый вид шифрования с тегами аутентификации AES-256 в режиме "GCM", узнаем что такое AEAD и в каком виде передаются зашифрованные данные, чтобы их можно было расшифровать. К примеру браузеры Chrome версии 80 и выше шифруют пароли юзеров и кукисы именно в режиме AES/GCM и мы убедимся, как легко их можно будет поиметь.

В скрепку положил инклуд для работы с библиотекой CNG на фасме,

а так-же исполняемый файл для вывода лога системного поставщика. На этом занавес – пока!
 
Ответить с цитированием

  #2  
Старый 02.07.2021, 00:43
rusrst
Новичок
Регистрация: 18.04.2021
Сообщений: 0
С нами: 2670034

Репутация: 0
По умолчанию

Как всегда браво!
 
Ответить с цитированием

  #3  
Старый 02.07.2021, 22:05
w2ll3t0Rl1v3
Новичок
Регистрация: 01.07.2021
Сообщений: 0
С нами: 2562981

Репутация: 0
По умолчанию

Спасибо что разжевал, прочитал. что-то понял....сохраню и перечитаю позже ещё раз
 
Ответить с цитированием

  #4  
Старый 04.07.2021, 17:18
Evgeny D
Новичок
Регистрация: 03.07.2021
Сообщений: 0
С нами: 2560388

Репутация: 0
По умолчанию

Добрый день!
Спасибо за интересные статьи, хотел узнать есть возможность ваши статьи в pdf скачать?
 
Ответить с цитированием

  #5  
Старый 04.07.2021, 17:21
Marylin
Постоянный
Регистрация: 01.09.2019
Сообщений: 378
С нами: 3526561

Репутация: 0
По умолчанию

Привет!
В формате pdf у меня их нет, я пишу в ворде.
 
Ответить с цитированием

  #6  
Старый 04.07.2021, 17:33
Evgeny D
Новичок
Регистрация: 03.07.2021
Сообщений: 0
С нами: 2560388

Репутация: 0
По умолчанию

В ворде тоже хорошо

Выложите куда-нибудь пожалуйста или здесь прикрепите
 
Ответить с цитированием

  #7  
Старый 04.07.2021, 18:01
Mikl___
Новичок
Регистрация: 14.12.2019
Сообщений: 0
С нами: 3377258

Репутация: 0
По умолчанию

Evgeny D,
то есть самостоятельно перевести из HTML в pdf это для вас слишком сложно?
 
Ответить с цитированием

  #8  
Старый 04.07.2021, 18:07
Evgeny D
Новичок
Регистрация: 03.07.2021
Сообщений: 0
С нами: 2560388

Репутация: 0
По умолчанию

Mikl Совсем нет, дело в том, что корректно не сохраняется, в том числе вкладки.
Просьба была адресована автору.
 
Ответить с цитированием

  #9  
Старый 14.07.2021, 10:54
Marylin
Постоянный
Регистрация: 01.09.2019
Сообщений: 378
С нами: 3526561

Репутация: 0
По умолчанию

Цитата:

Evgeny D сказал(а):

хотел узнать есть возможность ваши статьи в pdf скачать?

смотрите здесь..
 
Ответить с цитированием

  #10  
Старый 14.07.2021, 12:59
Evgeny D
Новичок
Регистрация: 03.07.2021
Сообщений: 0
С нами: 2560388

Репутация: 0
По умолчанию

Marylin спасибо Вам большущее
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.