Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовые / Протоколы защиты.doc
Скачиваний:
52
Добавлен:
16.04.2013
Размер:
262.66 Кб
Скачать

Протокол записейSsl.

Протокол записей SSLполучает данные от протоколов верхнего уровня в непустых блоках заданного размера. Он разбивает блоки информации на записи, способные передавать до 214байт информации. Границы сообщений клиента не сохраняются на уровне записей (т.е. множество сообщений с одинаковым типом содержимого могут быть объединены в одну запись или одно сообщение может быть разбито на несколько записей)

Структура записи может быть представлена следующим образом:

struct {

uint8 major, minor;

} ProtocolVersion;

enum {

change_cipher_spec(20), alert(21), handshake(22),

application_data(23), (255)

} ContentType;

struct {

ContentType type;

ProtocolVersion version;

uint16 length;

opaque fragment[TLSPlaintext.length];

} TLSPlaintext;

type

Протокол верхнего уровня, используемый для обработки содержащегося фрагмента данных.

version

Версия протокола. Для TLSver1.0 – {3,1}, дляSSLv3 – {3,0}

length

Длина в байтах следующего TLSPlaintext.fragment. Не может превышать 214.

fragment

Прикладные данные. Эти данные прозрачны и рассматриваются как независимый блок, обрабатываемый протокол верхнего протокола задаваемым полем type.

Все записи сжимаются с использованием протокола сжатия, определеямым текущим состоянием сеанса. В начальном состоянии он определяется как CompressionMethod.null. Алгоритм сжатие преобразует структуруTLSPlaintextв структуруTLSCompressed. Функции сжатия инициализируются начальным состоянием, каждый раз когда состояние соединения становится активным.

Алгоритмы сжатия должны быть без потери качества и не должны увеличивать длину содержимого более чем на 1024 байта. Если функция распаковки получает запись TLSCompressed.fragment, длина которой после распаковки превышает 214она должна сообщить о фатальной ошибке декомпрессии.

Запись TLSCompressedимеет следующую структуру:

struct {

ContentType type; /* same as TLSPlaintext.type */

ProtocolVersion version;/* same as TLSPlaintext.version */

uint16 length;

opaque fragment[TLSCompressed.length];

} TLSCompressed;

Функции шифрования и MACпреобразуют записьTLSCompressedвTLSCiphertext. Функции расшифровывания обращают процесс.MACзаписи также включает ее номер, что позволяет обнаружить потерю, получение лишних или повторение сообщений.

Структура TLSCiphertext:

struct {

ContentType type;

ProtocolVersion version;

uint16 length;

select (CipherSpec.cipher_type) {

case stream: GenericStreamCipher;

case block: GenericBlockCipher;

} fragment;

} TLSCiphertext;

Поточные шифры конвертируют TLSCompressed.fragmentиз/вTLSCiphertext.fragment.

stream-ciphered struct {

opaque content[TLSCompressed.length];

opaque MAC[CipherSpec.hash_size];

} GenericStreamCipher;

MACвычисляется следующим образом:

HMAC_hash(MAC_write_secret, seq_num + TLSCompressed.type +

TLSCompressed.version + TLSCompressed.length +

TLSCompressed.fragment));

где "+" обозначает конкатенацию строк.

При этом МАС вычисляется до шифрования. Поточный шифр шифрует весь блок включая МАС. Для поточных шифров не использующих вектор синхронизации (например, RC4), состояние шифра в конце одной записи используется для следующего пакета. ЕслиCipherSuiteравенTLS_NULL_WITH_NULL_NULL, шифрование не производится и МАС не вычисляется.

Для блочных шифров (например, RC2 илиDES), функции шифрования и МАС конвертируют структурыTLSCompressed.fragmentв/изTLSCiphertext.fragment.

block-ciphered struct {

opaque content[TLSCompressed.length];

opaque MAC[CipherSpec.hash_size];

uint8 padding[GenericBlockCipher.padding_length];

uint8 padding_length;

} GenericBlockCipher;

MACвычисляется также как и для поточных шифров.

padding

Заполнитель используется для дополнения открытого текста до размера кратного размеру входного блока шифра. Заполнитель может иметь произвольную длину до 255 байт. Заполнители с длиной большей чем необходимо могут использоваться для предотвращения атак на протокол, основанных на анализе длины сообщений. Каждый uint8-блок данных заполнителя должен быть заполнен значением длины заполнителя.

padding_length

Длина заполнителя должны быть такой, чтобы общая длина структуры GenericBlockCipherбыла кратна размеру блока шифра. Допустимы значения от 0 до 255. Эта длина включает длину всех полей заполнителя, за исключения самого поляpadding_length.

Длина зашифрованных данных (TLSCiphertext.length) на единицу больше суммыTLSCompressed.length,CipherSpec.hash_sizeиpadding_length.

Пример: Если длина блока 8 байт, длина содержимого (TLSCompressed.length) 61 байт и длинаMAC20 байт, то длина без заполнителя будет 82 байта. Таким образом, длина заполнителя по модулю 8 должна быть равна 6, чтобы получить общую длину кратную восьми. Длина заполнителя может быть 6, 14, 22 и т.д. до 254. Если выбрать минимальную длину, 6, заполнитель будет из 6 байт, каждый из которых содержит значение 6. Последние восемь байтGenericBlockCipherдо шифрования блока будутxx06 06 06 06 06 06 06, гдеexx– последний байт иммитовставки(МАС).

Замечание: для блочных шифров в режиме СВС (CipherBlockChaining) вектор инициализации (IV) для первой записи генерируется с другими ключами при установки параметров защиты. В качествеIVдля последующих записей берется последний блок зашифрованного текста из предыдущей записи.