Самоучитель по программированию систем защиты



Локальная аутентификация пользователя в Windows NT



Локальная аутентификация пользователя в Windows NT

В ОС Windows NT для идентификации используется имя пользователя, а для подтверждения введенного имени - процедура аутентификации, использующая символьный пароль пользователя.

Обозначим через:

PasswordUniCode - пароль пользователя в формате UniCode;

PasswordASCII[0..13] - массив из 14 байт, пароль пользователя в формате ASCII;

PasswordDES[0..15] - массив из 16 байт, который назовем образом пароля пользователя, полученным при помощи алгоритма DES;

PasswordMD4 [0.. 15] - массив из 16 байт, который назовем образом пароля пользователя, полученным при помощи алгоритма MD4.

EncryptedText = DES(ClearText, Key) - функция преобразования по алгоритму DES, где ClearText и EncryptedText массивы по 8 байт - открытый и шифрованный текст соответственно, Key - массив из 7 байт, являющийся ключом;

HashText = MD4(ClearText) - функция преобразования по алгоритму хэширования MD4, где ClearText массив из 64 байт - открытый текст, HashText массив из 16 байт -хэшированный текст. .

Алгоритм локальной идентификации пользователя состоит из следующих шагов:

Шаг 1; Пользователь вводит с клавиатуры в ответ на запрос рабочей станции свое имя, имя домена и пароль в формате UniCode: PasswordUniCode.

Шаг 2. PasswordUniCode преобразуется в формат ASCII, причем маленькие латинские буквы преобразуются в большие, результат записывается в PasswordASCII - массив из 14 байт. Если пароль короче 14 символов, оставшиеся байты массива PasswordASCII заполняются нулями.

Далее осуществляется преобразование:

PasswordDES[0..7]:= DES(ClearText, PasswordASCII[0..6]);

PasswordDES[8..15]:= DES(ClearText, PasswordASCII[7..13]),

где ClearText = (4B, 47, 53, 21, 40, 23, 24, 25) = «KGS!@#$%».

Шаг З. Осуществляется преобразование пароля пользователя с помощью алгоритма хэширования MD4:

PasswordMD4:= MD4(PasswordUniCode).

Шаг 4. PasswordMD4 сравнивается с данными, которые вычисляются путем расшифрования данных, хранящихся в реестре, в начале загрузки операционной системы.

Шаг 5. В случае успешной проверки на шаге 4 разрешается дальнейшая загрузка системы, в противном случае осуществляется переход к шагу 1.

При входе пользователя в систему из введенного им пароля выбираются 14 байт (при меньшей длине пароль дополняется нулями), которые затем дважды используются в качестве ключей для шифрования согласно алгоритму DES 8-ми байт, а именно: Ox4b,0x47,0x53,0x21,0x40,0x23,0x24,0x25, находящихся в файле advapi32.dll и являющихся заранее заданными постоянными значениями. При этом 14 байт пароля пользователя разбиваются на два отрезка по 7 байт каждый, которые затем представляются в виде последовательности из восьми 7-ми битовых векторов. Для получения ключа алгоритма DES с каждой из последовательностей выполняются следующие действия: каждый 7-ми битовый вектор переписывается в обратном порядке, расширяется до байта с приписыванием справа единицы, и к полученным 8-ми байтам применяется операция конкатенации. Полученный таким образом двоичный вектор длины 64 используется в качестве ключа.

Результаты шифрования исходных 8-ми байт на двух различных ключах, полученных из пароля пользователя, разбитые на два блока по 8 байт, дополняются справа нулями и разбиваются на три блока по 7 байт, из которых затем снова получаются в соответствии с описанным выше способом три 64-битовые вектора, используемые в качестве трех различных ключей при трех независимых вызовах процедуры шифрования, применяемых к полученному от сервера значении сеансового ключа (меняющегося от сессии к сессии). Результат шифрования в виде последовательности 24-х байт рассматривается как результат обработки пароля пользователя.

Оценка адекватности описанного преобразования реальному производилась путем соотнесения дизассемблированной процедуры шифрования и аналогичной процедуры, записанной на языке высокого уровня. При этом выяснилось, что используется блочный алгоритм, имеющий итеративную структуру - к исходному тексту - блоку из 64-х бит - применяется подстановка. Результат применения подстановки разбивается на два блока по 32 бита, один из которых путем повторения некоторых бит расширяется до 48-ми битового блока, который складывается покоординатно с выборкой из ключа той же размерности и разбивается на восемь блоков по 6 байт, поступающих на узлы замены. К полученному в результате 32-х битовому блоку снова применяется подстановка. Затем блоки складываются и меняются местами. Этот процесс итеративно повторяется 16 раз. Затем снова применяется подстановка. Таким образом, стало понятно, что речь идет о DES-подобной схеме, и вопрос состоит лишь в совпадении параметров алгоритма. Для того, чтобы решить этот вопрос, была проделана работа по выделению участков процедуры, реализующих ту или иную часть алгоритма, и их сравнению с аналогичными частями алгоритма DES.

Первоначальная подстановка.

Первоначальная подстановка открытого текста осуществляется в соответствии со следующей процедурой:

for(i=0; i<63; i++)

Text[i]«Plaintext[Tabl[i]];

где массив Plaintext содержит исходный открытый текст, массив Text содержит обрабатываемый массив из 64 бит, поступающий затем на вход итеративной части алгоритма, а массив Tab! содержит нижнюю строку подстановки открытого текста и имеет вид:

57,49,41/33,25,17, 9,1,

59,51,43,35,27,19,11,3,

61,53,45,37,29,21,13,5,

63,55,47,39,31,23,15,7,

56,48,40,32,24,16, 8,0,

58,50,42,34,26,18,10,2,

60,52,44,36,28,20,12,4,

62,54,46,38,30,22,14,6;

что совпадает с первоначальной подстановкой для открытого текста алгоритма DES с учетом различий в нумерации бит текста (в описании DES вс

е нумерации начинаются с 1).

Функция расширения. Функция расширения 32-х битового блока обрабатываемого текста применяется следующим образом: при i, изменяющемся от 0 до 47, i-й бит результирующего блока вычисляется по формуле:

Text[32+Tab2[i]];

где Таb2 имеет вид:

31, 0, 1, 2, 3, 4, 3, 4,

5, 6, 7, 8, 7, 8, 9,10;.

11,12,11,12,13,14,15,16,,

15,16,17,18,19,20,19,20, ,

21,22,23,24,23,24,25,26,

27,28,27,28,29,30,31, 0; '

что непосредственно совпадает с функцией расширения алгоритма DES.

S-боксы. Узлы замены, именуемые S-боксами, применяются следующим образом: Пусть ah(i) - i-й 6-ти битовый блок 48-ми битовой последовательности, получаемой в результате побитового сложения выхода с функции расширения с ключом на итерацию bx=(i-l)*64, al(i) - i-й блок результирующей 32-х битовой последовательности - результат применения узла замены, 1=1..8. Тогда al(i) вычисляется следующим образом:

ah+=bx;

al=Tab3[ah/2];

if(ah&l) al/=16;

al%=16;

при этом ТаbЗ имеет вид:

ОхОе, Oxf 4, Ox7d, 0x41, Охе2, Ox2f, Oxdb., 0x18,

ОхаЗ,Охба,Охсб,Oxbc,0x95,0x59,0x30,0x87,

Oxf4, Oxcl,Ох8е,0x28,Ox4d,0x96,0x12,Ox7b,

Ox5f,.Oxbc,Ox39,Oxe7,.Oxa3,OxQa,Ox€5,OxdO, Ox3f,0xdl,0x48,Ox7e,0xf6,0x2b,0x83,Oxe4/ Oxc9,0x07,0x12,Oxad,Охбс,0x90,Oxb5,Ox5a, OxdO,Ox8e,Oxa7,Oxlb,ОхЗа,Oxf4,0x4d,0x21, Oxb5,0x68,Ox7c,Охсб,0x09,0x53,Oxe2,Ox9f, Oxda,0x70,0x09,Ox9e,0x36,0x43,Ox6f,Oxa5, 0x21,Ox8d,Ox5c,Oxe7,Oxcb,Oxb4,Oxf2,0x18, Oxld, Охаб, Oxd4, 0x09, 0x68, Ox9f, 0x83, Ox7CT, Ox4b,Oxf1,Oxe2,ОхЗс,Oxb5,Ox5a,Ox2e,Oxc7, Oxd7,Ox8d,Oxbe,0x53,0x60,Oxf6,0x09,ОхЗа, 0x41, 0x72, 0x28, Oxc5, Oxlb, Oxa'c, Oxe4, Ox9f, ОхЗа,Oxf6,0x09,0x60,Oxac,Oxlb,Oxd7,Ox8d, Ox9.f, 0x41, 0x53, Oxbe, Oxc5, 0x72, 0x28, Oxe4, Oxe2, Oxbe,0x24,Oxcl,0x47,Ox7a,Oxdb,0x16, 0x58,0x05,Oxf3,Oxaf,Ox3d,0x90,Ox8e,0x69, Oxb4, 0x82,Oxcl,Ox7b,Oxla,Oxed,0x27,Oxd8, Ox6f,Oxf9,OxOc,0x95,Охаб,0x43,0x50,ОхЗе, Oxac,Oxf1,0х4а,Ox2f,0x79,Oxc2,0x96,0x58, 0x60,Oxld,Oxd3,Oxe4,OxOe,Oxb7,0x35,Ox8b, 0x49,ОхЗе,Ox2f,Oxc5;0x92,0x58,Oxfc,ОхаЗ, Oxb7,OxeO,0x14,Ox7a,0x61,OxOd,Ox8b,Oxd6, Oxd4., OxOb, Oxb2, Ox7e, Ox4f, 0x90, 0x18, Oxad, ОхеЗ,ОхЗс,Ох59/0хс7,0x25,Oxfa,0x86,0x61, 0x61,Oxb4,Oxdb,Ox8d,Oxlc,0x43,Oxa7,Ox7e, Ox9a,Ox5f,0x06,Oxf8,OxeO,0x25,0x39,Oxc2, Oxld,Oxf2,Oxd8,0x84,Охаб,Ox3f,Ox7b,0x41, Oxca,0x59,0x63,Oxbe,0x05,OxeO,Ox9c,0x27, 0x27,Oxlb,Oxe4,0x71,0x49,Oxac,Ox8e,Oxd2, Oxf0,Охсб,Ox9a,OxOd,Ox3f,0x53,0x65,Oxb8

Легко видеть, что, с учетом изменения порядка адресации, узлы замены могут быть изображены в традиционном виде в результате выполнения следующей процедуры:

for (i=0; i<8;

{

for(j=0; j<64; j

{

l=tab[j/2+32*i];

if(j&l == 1)

1/=16;

box[i] [j%2+(j/32)*2]

Результаты выполнения этой процедуры выглядят следующим образом:

бокс номер 0

1.4 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7

О 15 7 4 14 2 13 1 10 б 12 11 9 5 3 8

4 1 14 8 .13 б 2 11 15 12 9 7 3 10 5 О

15 12 8 2 4 9 1 7 5 11 3 14 10 0 б 13

бокс номер 1

15 1 8 14 б 11 3 4 9 7 2 13 12 0 5 10

3 13 4 7 15 2 8 14 12 О 1 10 6 9 11 5

0 14 7 11 10 4.13 1 5 8 12 б 9 3 2 15

13 8 10 1 3 15 4 2 11 б 7 12 0 5 14 9

бокс номер 2

10 0 9 14 б 3 15 5 1 13 12 7 11 4 2 8

13 7 0 9 3 4 б 10 2 8,5 14 12 11 15 1

13 б 4 9 8 15 3 0 11 1 2 12 5 10 14 7

1 10 13 0 б 9 8 7 4 15 14 3 11 5 2 12

бокс номер 3

7 13 14 3 0 б 9 10 1 2 8 5 11 12 4 15

13 8 11 5 б 15 0 3 4 7 2 12 1 10 14 9

10 б 9 0 12 11 7 13 15 1 3 14 5 2 8 4

3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14

бокс номер 4

2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9

14 11 2 12 4 7 13 150 15 10 3 9 8 б

4 2 1 11 10 13 7 8 15 9 12 5 б 3 0 14

11 8 12 7 1 14 2 13 б 15 0, 9 10 4 5 3

бокс номер 5

12 1 10 15 92 б 80 13 3 4 14 7 5 11

10 15 4 2 7 12 9 5 б 1 13 14 0 11 3 8

9.14 15 5 2 8 12 37 0 4 10 1 13-11 б

4 3 2 12 9 5 15 10 11 14 1 7 б 0 8 13

бокс номер

6 4 11 2 14 15 0 8 13 3 12 9 7 5 10 б 1

13 0 11 7 4 9 1 10 14 3 5 12 2 15 8 6 1

4 11 13 12 3 7 14 10 15 б 8 0 5 9 2

6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12

бокс номер 7

13 2 8 4 б 15 11 1 10 9 3 14 5 0 12 7

1 15 13 8 10 3 7 4 12 5 б 11 0 14 9 2

7 11 4 1 9 12 14 2 0 б 10 13 15 3 5 8

2 1 14 7 4 10 8 13 15 12 9 О 3 5 6 11

что полностью совпадает с узлами замены (подстановками) алгоритма DES.

 




Содержание  Назад  Вперед