Шифрование методом скремблеров - davaiknam.ru o_O
Главная
Поиск по ключевым словам:
страница 1
Похожие работы
Название работы Кол-во страниц Размер
Курсовая работа по дисциплине: «Методы и средства защиты информации» 1 124.31kb.
Задание состоит в следующем 1 69.83kb.
«Шифрование по методу uue» 1 70.73kb.
Ассиметричное шифрование 1 14.73kb.
Отчет по практике за I курс 2004-2005 учебный год 1 126.69kb.
Тема Фотоэлементы первого и второго поколения 1 171.49kb.
Изучить блочные алгоритмы шифрования: алгоритм перестановки, алгоритм... 1 83.13kb.
«Датирование зубной эмали методом электронного парамагнитного резонанса» 1 24.96kb.
Лабораторная работа №3-о определение скорости звука в воздухе методом... 1 46.92kb.
Влияние микролерирования на структуру и свойства быстрозакаленных... 1 31.69kb.
Управление горной средой методом гидроразрыва 1 362.01kb.
Kaspersky Security для бизнеса 1 61.5kb.
Направления изучения представлений о справедливости 1 202.17kb.

Шифрование методом скремблеров - страница №1/1

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное бюджетное образовательное учреждение высшего профессионального образования



«УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Кафедра «Вычислительная техника»



Отчёт по лабораторной работе №2

«Изучение работы блоковых шифров и способов их объединения»

Вариант №7
Выполнил:

студент группы ИСТд-41

Ильин А. Г.

Проверил:

доцент каф. «Вычислительная техника»

к.т.н. Мартынов А.И.

Ульяновск, 2012 г.



Задание на лабораторную работу

  1. Изучить блочные алгоритмы шифрования: алгоритм перестановки, алгоритм скремблеров, алгоритм замены по таблице, матричный метод преобразования и алгоритм Винжера;

  2. Изучить режимы использования блочных шифров (ECB, CBC, CFB и OFB);

  3. Изучить способы объединения блочных шифров (многократное шифрование, сеть Фейстела);

  4. Реализовать систему и оценить работу алгоритма;


Шифрование методом скремблеров


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

В данной реализации величина сдвига каждого блока определяется значением, которое выдаёт ГСПЧ Парка-Миллера. Далее работа идёт в зависимости от режима использования шифра.

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

Режим обратной связи по шифротексту (режим гаммирования с обратной связью)

Один из вариантов использования симметричного блочного шифра, при котором для шифрования следующего блока открытого текста он складывается по модулю 2 с перешифрованным (блочным шифром) результатом шифрования предыдущего блока.

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

c_0 = iv

c_i = e_k \left( c_{i-1} \right) \oplus p_i

p_i = e_k \left( c_{i-1} \right) \oplus c_i

где i — номера блоков, iv — вектор инициализации (синхропосылка), c_i и p_i — блоки зашифрованного и открытого текстов соответственно, а e_k — функция блочного шифрования.



c:\users\creitve\documents\edu\encryptcfb_2.pngc:\users\creitve\documents\edu\decryptcfb.png

Вектор инициализации iv, как и в режиме сцепления блоков шифротекста, можно делать известным, однако он должен быть уникальным.

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

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


Листинг программы


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

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from hashlib import md5


# Фунции преобразования строки битов в строку символов и наоборот

bits = lambda block: ''.join(bin(ord(x))[2:].zfill(8) for x in block)

chars = lambda bts: ''.join(chr(int(ch, 2)) for ch in (bts[i:i+8] for i in

xrange(0, len(bts),8)))


def scramble(bl, shift):

"""Превращает строку символов в строку бит и возвращает её, сдвинув

на величину shift, пришедшую из ГСПЧ

"""
rshift = lambda st, s: st[-s:] + st[:-s]

shifted = rshift(bits(bl), shift)

return shifted


def PRNG(pwd):

""" Собственно, ГСПЧ Парка-Миллера из первой л/р """

if pwd:


seed = 0

for i in xrange(len(pwd)):

seed += ord(pwd[i]) * (257 ** i)
last = seed

while 1:


last = (16807 * last % 2147483647)

yield (last % 55) + 1

else:

print "Invalid password to use"


def sxor(prim, sec):

""" 'Воркэраунд', xor, обрабатывающий строки бит.

Решает проблему потери бит """

if len(sec) < len(prim):

sec = sec.zfill(len(prim))

res = ''


for a,b in zip (prim, sec):

c = '0' if a == b else '1'

res += c

return res

def encrypt(inf, key, outf, mode='cfb'):
""" Шифрование, переключает тип четвёртым параметром, по умолчанию — cfb,

можно задать ecb. Работает с именами файлов и строкой пароля.


Сначала в файл пишется md5-хеш пароля, затем md5-хеш зашифрованного

содержимого. Затем три байта для обозначения режима шифрования.

Следом идёт сам шифрованный контент.
"""

if not mode == 'cfb':

mode = 'ecb'

print u'Начинаем шифрование в режиме ' + mode

hat = PRNG(key)

result = ''

if mode == 'cfb':

with open(inf, 'rb') as src:

cipher = '1111111'

block = bits(src.read(7))

while block:

t = sxor(block, scramble(cipher, hat.next()))

cipher = chars(t)

result += cipher

block = bits(src.read(7))

else:


with open(inf, 'rb') as src:

block = src.read(7)

while block:

result += chars(scramble(block, hat.next()))

block = src.read(7)
with open(outf, 'wb') as dest:

dest.write(md5(key).hexdigest() + md5(result).hexdigest() + mode +

result)
print u'Шифрование успешно завершено'

def decrypt(inf, key, outf):

""" Расшифровка, по аналогии, но режим шифрования определяется по файлу.

Сначала проверяем хеши паролей и шифротекста. Потом определяем

режим шифрования (cfb/ecb) и расшифровываенм.
"""

print u'Начинается расшифровка'

hat = PRNG(key)

result = ''


with open(inf, 'rb') as src:

if not md5(key).hexdigest() == src.read(32):

print u"Неверный пароль!"

return 0
_hash = src.read(32)

mode = src.read(3)

print u'Режим расшифровки: ' + mode

if _hash == md5(src.read()).hexdigest():

print u"Целостнось шифротекста в норме."

else:

print u"Тело сообщения повреждено!"



# return 0
src.seek(67)

block = src.read(7)

if mode == 'ecb':

while block:

result += chars(scramble(block, -hat.next()))
block = src.read(7)

else:


cipher = '1111111'

while block:


t = scramble(cipher, hat.next())
cipher = block
result += chars(sxor(bits(block),t))

block = src.read(7)


print u'Расшифровка завершена!'


with open(outf, 'wb') as dest:

dest.write(result)



if __name__ == '__main__':

pass




Если в первом акте на сцене висит ружье, то в последнем оно должно выстрелить. Перефразированный Антон Чехо
ещё >>