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

Учреждение образования «Белорусский государственный университет информатики и

радиоэлектроники»

Факультет вечернего, заочного и дистанционного обучения Кафедра ЭВМ

Контрольная работа по дисциплине «Защита информации в вычислительных сетях»

студента 6 курса 500502 учебной группы Авсеева С.П.

Минск 2010

Содержание

1

Задание

2

2

Реализация

3

1. Задание

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

2

2. Реализация

Реализация алгоритма шифрования Виженера (vigenere.erl)

-module(vigenere).

-export([encrypt/2, decrypt/2, encrypt/3, decrypt/3, normalize_key/2]).

encrypt(Message, Key) -> encrypt(Message, Key, {$A, $Z}).

encrypt(Message, Key, Range) ->

NormalizedKey = normalize_key(Key, length(Message)), encrypt(Message, NormalizedKey, Range, []).

encrypt([], [], _, Cipher) -> lists:reverse(Cipher);

encrypt([M|Message], [K|Key], {L, H}, Cipher)

when ((M < L) or (M > H) or (K < L) or (K > H)) -> encrypt(Message, Key, {L, H}, [M|Cipher]);

encrypt([M|Message], [K|Key], {L, H}, Cipher) -> N = H - L + 1,

C = (M - L + K - L) rem N + L, encrypt(Message, Key, {L, H}, [C|Cipher]).

decrypt(Cipher, Key) -> decrypt(Cipher, Key, {$A, $Z}).

decrypt(Cipher, Key, Range) ->

NormalizedKey = normalize_key(Key, length(Cipher)), decrypt(Cipher, NormalizedKey, Range, []).

decrypt([], [], _, Message) -> lists:reverse(Message);

decrypt([C|Cipher], [K|Key], {L, H}, Message)

when ((C < L) or (C > H) or (K < L) or (K > H)) -> decrypt(Cipher, Key, {L, H}, [C|Message]);

decrypt([C|Cipher], [K|Key], {L, H}, Message) -> N = H - L + 1,

M = ((C - K) + N) rem N + L, decrypt(Cipher, Key, {L, H}, [M|Message]).

normalize_key(Key, Length) -> normalize_key(Key, Key, Length, []).

normalize_key(_, _, 0, Accumulator) -> lists:reverse(Accumulator);

normalize_key(Key, [], Length, Accumulator) -> normalize_key(Key, Key, Length, Accumulator);

normalize_key(Key, [H|T], Length, Accumulator) -> normalize_key(Key, T, Length - 1, [H|Accumulator]).

3

Реализация задания на базе алгоритма шифрования Виженера (kr.erl)

-module(kr). -compile(export_all). -import(vigenere).

encrypt(Message, Key, Salt) -> encrypt(Message, Key, Salt, {$A, $Z}).

encrypt(Message, Key, Salt, Range) ->

Cipher = vigenere:encrypt(Message, Key, Range), put_salt(Cipher, Salt, []).

decrypt(SaltedCipher, Key, Salt) -> decrypt(SaltedCipher, Key, Salt, {$A, $Z}).

decrypt(SaltedCipher, Key, Salt, Range) -> Cipher = put_salt(SaltedCipher, -Salt, []), vigenere:decrypt(Cipher, Key, Range).

put_salt([], _, SaltedCipher) -> lists:reverse(SaltedCipher);

put_salt([C|Cipher], Salt, SaltedCipher) ->

put_salt(Cipher, Salt, [apply_salt(C, Salt)|SaltedCipher]).

apply_salt(Code, Salt) -> apply_salt(binary:encode_unsigned(Code), Salt, 0).

apply_salt(<<C:8, Code/bytes>>, Salt, Acc) ->

H = ((C bsr 4) + Salt) bsl 4, % add salt to higher byte L = ((C band 15) + Salt) band 15, % add salt to lower byte apply_salt(Code, Salt, (Acc bsl 8) + (H bor L));

apply_salt(<<>>, _, Acc) -> Acc.

4