Разработка криптографической программы (стандарт DES)
Разработка программы, реализующей процедуры шифрования и расшифрования текста по стандарту DES (Data Encryption Standard). Структура алгоритма шифрования, схема выработки ключевых элементов. Использование криптографического программного средства.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 15.06.2013 |
Размер файла | 1,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
Дальневосточный государственный университет путей сообщения
Кафедра «ИТиС»
Курсовой проект
«Разработка криптографической программы (стандарт DES)»
Выполнил: Пинаев П.С.,
студент группы 23К.
Проверил: Анисимов В.В.
Хабаровск 2013 г.
Оглавление
1. Краткие сведения о стандарте шифрования DES
2. Режим DES-ECB
2.1 Общая схема шифрования
2.2 Пример шифрования и расшифрования
3. Режим DES-CBC
3.1 Общая схема шифрования
3.2 Пример шифрования и расшифрования
4. Режим тройной DES
4.1 Общие схемы шифрования
4.2 Пример шифрования и расшифрования
5. Руководство пользователя программы
- 5.1 Общие сведения
- 5.2 Назначение программы
- 5.3 Используемые технические средства
- 5.4 Входные и выходные данные
- 5.5 Ввод в действие программного средства
- 5.5.1 Интерфейс
- 5.5.2 Использование программного средства
- 6. Код программы
Задание на выполнение курсового проекта
Разработать программу, реализующую процедуры шифрования и расшифрования по стандарту DES (Data Encryption Standard). В программе предусмотреть возможность шифрования/расшифрования в режимах: электронная кодовая книга ЕСВ, сцепление блоков шифра СВС, тройной DES (EEE3, EDE3, EEE2 и EDE2). Программа должна выдавать промежуточные результаты шифрования/расшифрования.
1. Краткие сведения о стандарте шифрования DES
DES (Data Encryption Standard) симметричный алгоритм шифрования, разработанный фирмой IBM и утвержденный правительством США в 1977 году как официальный стандарт (FIPS 46-3). DES имеет блоки по 64 бита и 16 цикловую структуру сети Фейстеля. Для шифрования использует ключ с длиной 56 бит. Алгоритм использует комбинацию нелинейных (S-блоки) и линейных (перестановки E, IP, IP-1) преобразований. Для DES рекомендовано несколько режимов использования:
· режим электронной кодовой книги (ECB -- Electronic Code Book),
· режим сцепления блоков (СВС -- Cipher Block Chaining),
· режим обратной связи по шифротексту (CFB -- Cipher Feed Back),
· режим обратной связи по выходу (OFB -- Output Feed Back).
Прямым развитием DES в настоящее время является Triple DES.
Основные достоинства алгоритма DES:
· используется только один ключ длиной 56 битов;
· зашифровав сообщение с помощью одного пакета, для расшифровки вы можете использовать любой другой;
· относительная простота алгоритма обеспечивает высокую скорость обработки информации;
· достаточно высокая стойкость алгоритма.
2. Режим DES-ECB
В этом режиме исходный файл M разбивается на 64-битовые блоки (по 8 байтов): M = M(1)M(2)...M(n). Каждый из этих блоков кодируется независимо с использованием одного и того же ключа шифрования. Основное достоинство этого алгоритма - простота реализации. Недостаток - относительно слабая устойчивость против квалифицированных криптоаналитиков. В частности, не рекомендуется использовать данный режим работы для шифрования EXE файлов, потому что первый же блок - заголовок файла, является вполне удачным началом для взлома всего шифра.
В то же время следует признать, что этот режим в силу своей простой реализации наиболее популярен.
2.1 Общая схема шифрования
Процесс шифрования заключается в начальной перестановке битов 64-битового блока, шестнадцати циклах шифрования и обратной перестановки битов (рисунок 1). Все перестановки и коды в таблицах подобраны разработчиками таким образом, чтобы максимально затруднить процесс расшифровки путем подбора ключа. Структура алгоритма DES приведена на рисунке 2.
Рисунок 1. Обобщенная схема шифрования
Из шифруемой последовательности байт выбирается очередной 8-байтовый блок T, который преобразуется с помощью матрицы начальной перестановки IP (таблица 1) следующим образом: бит 58 блока T становится битом 1, бит 50 - битом 2 и т.д., что даст в результате: T(0) = IP(T).
Полученная последовательность битов T(0) разделяется на две последовательности по 32 бита каждая: L(0) - левые или старшие биты, R(0) - правые или младшие биты.
Рисунок 2. Структура алгоритма шифрования DES
Таблица 1. Матрица начальной перестановки IP
Затем выполняется шифрование, состоящее из 16 итераций. Результат i-й итерации описывается следующими формулами:
Функция f называется функцией шифрования. Ее аргументы - это 32-битовая последовательность R(i-1), полученная на (i-1)-ой итерации, и 48-битовый ключ K(i), который является результатом преобразования 64-битового ключа K.
На 16-й итерации получают последовательности R(16) и L(16) (без перестановки), которые конкатенируют в 64-битовую последовательность R(16)L(16). Затем позиции битов этой последовательности переставляют в соответствии с матрицей (Таблица 2).
Таблица 2. Матрица конечной перестановки
Матрицы IP-1 и IP соотносятся следующим образом: значение 1-го элемента матрицы равно 40, а значение 40-го элемента матрицы IP равно 1, значение 2-го элемента матрицы равно 8, а значение 8-го элемента матрицы IP равно 2 и т.д.
Аргументами функции f являются 32-битовый вектор и 48-битовый ключ , который является результатом преобразования 56-битового исходного ключа шифра K.
Для вычисления функции f последовательно используются функция расширения E, сложение по модулю 2 с ключом , преобразование S, состоящее из 8 преобразований S-блоков , перестановка P.
Функция E расширяет 32-битовый вектор до 48-битового вектора E путём дублирования некоторых битов из . Порядок битов вектора указан в таблице 3.
Полученный после перестановки блок складывается по модулю 2 с ключами и затем представляется в виде восьми последовательных блоков.
Таблица 3. Функция расширения E
Каждый блок является 6-битовым блоком. Далее каждый из блоков трансформируется в 4-битовый блок с помощью соответствующего узла замены Sj (таблица 3).
Таблица 4. Узлы замены
Если на вход Sj поступает блок , то двухбитовое число указывает номер строки матрицы, а четырёхбитовое число - номер столбца в таблице узлов замен. В результате применения узла замены Sj к блоку получается число (от 0 до 15), которое преобразуется в .
Полученные восемь элементов tj вновь объединяются в 32-битовый блок H'. В H' выполняется перестановка битов P (таблица 5).
Таблица 5. Перестановка Р
Результат последней операции и является выходным значением функции шифрования .
Ключевые элементы вырабатываются из ключа с использованием сдвигов и битовых выборок-перестановок. Таким образом, ключевые элементы состоят исключительно из битов исходного ключа, «перетасованных» в различном порядке. Схема выработки ключевых элементов показана на рисунке 3.
Рисунок 3. Схема выработки ключевых элементов
Изначально ключ состоит из 56 бит. Но для контроля целостности ключа при передачи, используют контроль четности. Для этого 56 битный ключ разбивают на блоки по 7 бит и к каждому блоку дописывают восьмой бит, являющийся битом четности. Таким образом получается ключ из 64 бит.
Выработка ключевых элементов из ключа K начинается со входной выборки-перестановки битов PC1 (таблица 6), которая отбирает 56 из 64 битов ключа и располагает их в другом порядке.
Таблица 6. Перестановка PC1
Результат выборки-перестановки K* разделяется на две 28-битовые части: старшую С1 и младшую D1. В зависимости от номера итерации обе части циклически сдвигаются на 1 или 2 бита влево согласно таблице 7.
Таблица 7. Циклический сдвиг
Из полученных блоков с помощью выходной битовой выборки-перестановки PC2 (таблица 8) отбираются первые 48 битов, которые и формируют очередной ключевой элемент.
Таблица 8. Перестановка PC2
Процедуры шифрования и дешифрования полностью идентичны, за исключением порядка использования ключевых элементов ki. При дешифровании данных все действия выполняются в обратном порядке. В 16 циклах дешифрования, в отличие от шифрования c помощью прямого преобразования сетью Фейстеля, здесь используется обратное преобразование сетью Фейстеля.
Схема дешифрования указана на рисунке 4.
Рисунок 4. Схема дешифрования алгоритма DES
2.2 Пример шифрования и расшифрования
Исходный текст: Pinaev
Ключ: Pavelll
Исходный блок бит... Блок № 0:
00001010 10010110 01110110 10000110 10100110 01101110 00000000 00000000
Перевернутые биты в блоке...:
01010000 01101001 01101110 01100001 01100101 01110110 00000000 00000000
Ключ из 56 бит:
0101000__0011000__0101110__1100110__0101011__0110001__1011000__1101100__
Ключ из 64 бита, после добавления бит четности:
01010000 00110000 01011100 11001100 01010110 01100011 10110001 11011000
**********************ШИФРОВАНИЕ**********************
Исходное сообщение:
01010000 01101001 01101110 01100001 01100101 01110110 00000000 00000000
Начальная перестановка IP:
00111111 00100001 00110100 00011010 00000000 00111110 00000110 00100100
HPart:
00111111 00100001 00110100 00011010
LPart:
00000000 00111110 00000110 00100100
Ключ 64 бита. С битами четности:
01010000 00110000 01011100 11001100 01010110 01100011 10110001 11011000
ключ (56). Перестановка РС1:
11001000 10111101 01100010 11010011 00000001 11001000 11000111
ключ (28C (Left)):
1100 1000 1011 1101 0110 0010 1101
ключ (28D (Right)):
0011 0000 0001 1100 1000 1100 0111
Итерация №1
Ключ из 56 бит после циклического сдвига, итерация 1:
1001000101111010110001011011 0110000000111001000110001110
Ключ из 48 бит. Перестановка РС2:
01111001 10010011 01001010 10100111 00011110 01000000
LPart, Началась функция модификации f:
00000000 00111110 00000110 00100100
Перевели 32 в 48. результат функции расширения Е:
00000000 00000001 11111100 00000000 11000001 00001000
Xor. побитово суммируем по модулю 2:
01111001 10010010 10110110 10100111 11011111 01001000
Преобразовали 48 в 32. С помощью узлов замены:
01110110 00111110 00011000 00110110
Перестановка бит в конце функции. Перестановка P:
01110110 01000010 10010110 01110110
HPart после модификации. HPart XOR f(LPart,Key):
01001001 01100011 10100010 01101100
После обмена HPart:
00000000 00111110 00000110 00100100
После обмена LPart:
01001001 01100011 10100010 01101100
…
Итерация №16
Ключ из 56 бит после циклического сдвига, итерация 16:
1100100010111101011000101101 0011000000011100100011000111
Ключ из 48 бит. Перестановка РС2:
10101101 00001110 10100011 10100101 01000101 00011001
LPart, Началась функция модификации f:
11100110 11110001 10001000 11001010
Перевели 32 в 48. результат функции расширения Е:
01110000 11010111 10100011 11000101 00010110 01010101
Xor. побитово суммируем по модулю 2:
11011101 11011001 00000000 01100000 01010011 01001100
Преобразовали 48 в 32. С помощью узлов замены:
11101011 01000111 11010100 00011011
Перестановка бит в конце функции. Перестановка P:
11101011 11001111 11011010 00001000
HPart после модификации. HPart XOR f(LPart,Key):
01101001 11000010 01110111 11011110
Результат шифрования блока. Конечная перестановка IP-1:
01100100 10010111 10000101 01001011 00100101 11100100 11110111 10111011
Результат блока бит до перевертывания(исправление недочета BitArray)... Блок № 0:
01100100 10010111 10000101 01001011 00100101 11100100 11110111 10111011
Результат блока бит после перевертывания...:
00100110 11101001 10100001 11010010 10100100 00100111 11101111 11011101
Исходное зашифрованное сообщение: d--…K%дч»
Ключ: Pavelll
Исходный блок бит... Блок № 0:
00100110 11101001 10100001 11010010 10100100 00100111 11101111 11011101
Перевернутые биты в блоке...:
01100100 10010111 10000101 01001011 00100101 11100100 11110111 10111011
Ключ из 56 бит:
0101000__0011000__0101110__1100110__0101011__0110001__1011000__1101100__
Ключ из 64 бита, после добавления бит четности:
01010000 00110000 01011100 11001100 01010110 01100011 10110001 11011000
**********************ДеШИФРОВАНИЕ**********************
Начальная перестановка IP:
01101001 11000010 01110111 11011110 11100110 11110001 10001000 11001010
HPart:
01101001 11000010 01110111 11011110
LPart:
11100110 11110001 10001000 11001010
Ключ 64 бита. С битами четности:
01010000 00110000 01011100 11001100 01010110 01100011 10110001 11011000
ключ (56). Перестановка РС1:
11001000 10111101 01100010 11010011 00000001 11001000 11000111
ключ (28C (Left)):
1100 1000 1011 1101 0110 0010 1101
ключ (28D (Right)):
0011 0000 0001 1100 1000 1100 0111
Итерация №1
Ключ из 56 бит после циклического сдвига, итерация 16:
1100100010111101011000101101 0011000000011100100011000111
Ключ из 48 бит. Перестановка РС2:
10101101 00001110 10100011 10100101 01000101 00011001
LPart, Началась функция модификации f:
11100110 11110001 10001000 11001010
Перевели 32 в 48. результат функции расширения Е:
01110000 11010111 10100011 11000101 00010110 01010101
Xor. побитово суммируем по модулю 2:
11011101 11011001 00000000 01100000 01010011 01001100
Преобразовали 48 в 32. С помощью узлов замены:
11101011 01000111 11010100 00011011
Перестановка бит в конце функции. Перестановка P:
11101011 11001111 11011010 00001000
HPart после модификации. HPart XOR f(LPart,Key):
10000010 00001101 10101101 11010110
После обмена HPart:
11100110 11110001 10001000 11001010
После обмена LPart:
10000010 00001101 10101101 11010110
…
Итерация №16
Ключ из 56 бит после циклического сдвига, итерация 1:
1001000101111010110001011011 0110000000111001000110001110
Ключ из 48 бит. Перестановка РС2:
01111001 10010011 01001010 10100111 00011110 01000000
LPart, Началась функция модификации f:
00000000 00111110 00000110 00100100
Перевели 32 в 48. результат функции расширения Е:
00000000 00000001 11111100 00000000 11000001 00001000
Xor. побитово суммируем по модулю 2:
01111001 10010010 10110110 10100111 11011111 01001000
Преобразовали 48 в 32. С помощью узлов замены:
01110110 00111110 00011000 00110110
Перестановка бит в конце функции. Перестановка P:
01110110 01000010 10010110 01110110
HPart после модификации. HPart XOR f(LPart,Key):
00111111 00100001 00110100 00011010
Результат дешифрования блока. Конечная перестановка IP-1:
01010000 01101001 01101110 01100001 01100101 01110110 00000000 00000000
Результат блока бит до перевертывания(исправление недочета BitArray)... Блок № 0:
01010000 01101001 01101110 01100001 01100101 01110110 00000000 00000000
Результат блока бит после перевертывания...:
00001010 10010110 01110110 10000110 10100110 01101110 00000000 00000000
После дешифрования получили сообщение: Pinaev
3. Режим DES-CBC
3.1 Общая схема шифрования
В этом режиме исходный набор байт M также, как и в режиме ECB, разбивается на 64-битовые блоки: M = M(1)M(2)...M(n). Первый блок M(1) складывается по модулю 2 с 64-битовым начальным вектором IV, который меняется ежедневно и держится в секрете. Полученная сумма затем шифруется с использованием ключа DES, известного и отправителю, и получателю информации. Полученный 64-битовый блок шифртекста C(1) складывается по модулю 2 со вторым блоком исходного текста, результат шифруется и получается второй 64-битовый блок шифртекста C(2) и т.д. Процедура повторяется до тех пор, пока не будут обработаны все блоки исходного текста (рисунок 5).
Рисунок 5. Общая схема шифрования и дешифрования
Плюс данного режима состоит в том, что он не позволяет накапливаться ошибкам при передаче. Блок M(i) является функцией только C(i-1) и C(i). Поэтому ошибка при передаче приведет к потере только двух блоков исходного текста.
3.2 Пример шифрования и расшифрования
Исходный текст: Pinaev
Ключ: Pavelll
Начальный вектор: 11111111
сходный блок бит... Блок № 0:
00001010 10010110 01110110 10000110 10100110 01101110 00000000 00000000
Перевернутые биты в блоке...:
01010000 01101001 01101110 01100001 01100101 01110110 00000000 00000000
Ключ из 56 бит:
0101000__0011000__0101110__1100110__0101011__0110001__1011000__1101100__
Ключ из 64 бита, после добавления бит четности:
01010000 00110000 01011100 11001100 01010110 01100011 10110001 11011000
**********************ШИФРОВАНИЕ**********************
Исходное сообщение:
01010000 01101001 01101110 01100001 01100101 01110110 00000000 00000000
Начальный вектор:
00110001 00110001 00110001 00110001 00110001 00110001 00110001 00110001
Исходное сообщение XOR начальный вектор:
01100001 01011000 01011111 01010000 01010100 01000111 00110001 00110001
Начальная перестановка IP:
00111111 11011110 00110100 11100101 00000000 11000001 00000110 00100100
HPart:
00111111 11011110 00110100 11100101
LPart:
00000000 11000001 00000110 00100100
Ключ 64 бита. С битами четности:
01010000 00110000 01011100 11001100 01010110 01100011 10110001 11011000
ключ (56). Перестановка РС1:
11001000 10111101 01100010 11010011 00000001 11001000 11000111
ключ (28C (Left)):
1100 1000 1011 1101 0110 0010 1101
ключ (28D (Right)):
0011 0000 0001 1100 1000 1100 0111
Итерация №1
Ключ из 56 бит после циклического сдвига, итерация 1:
1001000101111010110001011011 0110000000111001000110001110
Ключ из 48 бит. Перестановка РС2:
01111001 10010011 01001010 10100111 00011110 01000000
LPart, Началась функция модификации f:
00000000 11000001 00000110 00100100
Перевели 32 в 48. результат функции расширения Е:
00000000 00010110 00000010 10000000 11000001 00001000
Xor. побитово суммируем по модулю 2:
01111001 10000101 01001000 00100111 11011111 01001000
Преобразовали 48 в 32. С помощью узлов замены:
01111100 01010000 01001000 00110110
Перестановка бит в конце функции. Перестановка P:
00010110 00001111 10000110 00110010
HPart после модификации. HPart XOR f(LPart,Key):
00101001 11010001 10110010 11010111
После обмена HPart:
00000000 11000001 00000110 00100100
После обмена LPart:
00101001 11010001 10110010 11010111
…
Итерация №16
Ключ из 56 бит после циклического сдвига, итерация 16:
1100100010111101011000101101 0011000000011100100011000111
Ключ из 48 бит. Перестановка РС2:
10101101 00001110 10100011 10100101 01000101 00011001
LPart, Началась функция модификации f:
01110011 11000111 10111111 11111000
Перевели 32 в 48. результат функции расширения Е:
00111010 01111110 00001111 11011111 11111111 11110000
Xor. побитово суммируем по модулю 2:
10010111 01110000 10101100 01111010 10111010 11101001
Преобразовали 48 в 32. С помощью узлов замены:
10001100 00000111 10010101 01000100
Перестановка бит в конце функции. Перестановка P:
10100001 11011000 00110000 00111000
HPart после модификации. HPart XOR f(LPart,Key):
11111110 00111111 00111001 11000111
Результат шифрования блока. Конечная перестановка IP-1:
10111101 11111001 01111001 01011110 11011110 11011110 11100011 01101011
Результат блока бит до перевертывания(исправление недочета BitArray)... Блок № 0:
10111101 11111001 01111001 01011110 11011110 11011110 11100011 01101011
Результат блока бит после перевертывания...:
10111101 10011111 10011110 01111010 01111011 01111011 11000111 11010110
Исходное зашифрованное сообщение:
Ключ: Pavelll
Начальный вектор: 11111111
Исходный блок бит... Блок № 0:
10111101 10011111 10011110 01111010 01111011 01111011 11000111 11010110
Перевернутые биты в блоке...:
10111101 11111001 01111001 01011110 11011110 11011110 11100011 01101011
Ключ из 56 бит:
0101000__0011000__0101110__1100110__0101011__0110001__1011000__1101100__
Ключ из 64 бита, после добавления бит четности:
01010000 00110000 01011100 11001100 01010110 01100011 10110001 11011000
**********************ДеШИФРОВАНИЕ**********************
Начальная перестановка IP:
11111110 00111111 00111001 11000111 01110011 11000111 10111111 11111000
HPart:
11111110 00111111 00111001 11000111
LPart:
01110011 11000111 10111111 11111000
Ключ 64 бита. С битами четности:
01010000 00110000 01011100 11001100 01010110 01100011 10110001 11011000
ключ (56). Перестановка РС1:
11001000 10111101 01100010 11010011 00000001 11001000 11000111
ключ (28C (Left)):
1100 1000 1011 1101 0110 0010 1101
ключ (28D (Right)):
0011 0000 0001 1100 1000 1100 0111
Итерация №1
Ключ из 56 бит после циклического сдвига, итерация 16:
1100100010111101011000101101 0011000000011100100011000111
Ключ из 48 бит. Перестановка РС2:
10101101 00001110 10100011 10100101 01000101 00011001
LPart, Началась функция модификации f:
01110011 11000111 10111111 11111000
Перевели 32 в 48. результат функции расширения Е:
00111010 01111110 00001111 11011111 11111111 11110000
Xor. побитово суммируем по модулю 2:
10010111 01110000 10101100 01111010 10111010 11101001
Преобразовали 48 в 32. С помощью узлов замены:
10001100 00000111 10010101 01000100
Перестановка бит в конце функции. Перестановка P:
10100001 11011000 00110000 00111000
HPart после модификации. HPart XOR f(LPart,Key):
01011111 11100111 00001001 11111111
После обмена HPart:
01110011 11000111 10111111 11111000
После обмена LPart:
01011111 11100111 00001001 11111111
…
Итерация №16
Ключ из 56 бит после циклического сдвига, итерация 1:
1001000101111010110001011011 0110000000111001000110001110
Ключ из 48 бит. Перестановка РС2:
01111001 10010011 01001010 10100111 00011110 01000000
LPart, Началась функция модификации f:
00000000 11000001 00000110 00100100
Перевели 32 в 48. результат функции расширения Е:
00000000 00010110 00000010 10000000 11000001 00001000
Xor. побитово суммируем по модулю 2:
01111001 10000101 01001000 00100111 11011111 01001000
Преобразовали 48 в 32. С помощью узлов замены:
01111100 01010000 01001000 00110110
Перестановка бит в конце функции. Перестановка P:
00010110 00001111 10000110 00110010
HPart после модификации. HPart XOR f(LPart,Key):
00111111 11011110 00110100 11100101
Результат дешифрования блока. Конечная перестановка IP-1:
01100001 01011000 01011111 01010000 01010100 01000111 00110001 00110001
Результат дешифрования XOR начальный вектор:
01010000 01101001 01101110 01100001 01100101 01110110 00000000 00000000
Результат блока бит до перевертывания(исправление недочета BitArray)... Блок № 0:
01010000 01101001 01101110 01100001 01100101 01110110 00000000 00000000
Результат блока бит после перевертывания...:
00001010 10010110 01110110 10000110 10100110 01101110 00000000 00000000
После дешифрования получили сообщение: Pinaev
4. Режим тройной DES
Triple DES (3DES) -- симметричный блочный шифр, созданный Уитфилдом Диффи, Мартином Хеллманом и Уолтом Тачманном в 1978 году на основе алгоритма DES, с целью устранения главного недостатка последнего -- малой длины ключа (56 бит), который может быть взломан методом полного перебора ключа. Скорость работы 3DES в 3 раза ниже, чем у DES, но криптостойкость намного выше -- время, требуемое для криптоанализа 3DES, может быть в миллиард раз больше, чем время, нужное для вскрытия DES. 3DES используется чаще, чем DES, который легко ломается при помощи сегодняшних технологий (в 1998 году организация Electronic Frontier Foundation, используя специальный компьютер DES Cracker, вскрыла DES за 3 дня). 3DES является простым способом устранения недостатков DES. Алгоритм 3DES построен на основе DES, поэтому для его реализации возможно использовать программы, созданные для DES.
3DES с различными ключами имеет длину ключа равную 168 бит, но из-за атак «встреча посередине» эффективная криптостойкость составляет только 112 бит. В варианте DES-EDE, в котором k1=k3, эффективный ключ имеет длину 80 бит.
Для успешной атаки на 3DES потребуется около бит известного открытого текста, шагов, циклов DES-шифрования и бит памяти.
4.1 Общие схемы шифрования
Схема алгоритма (рисунок 6) 3DES имеет такой вид:
где -- ключи для каждого DES-шага, M -- входные данные, которые нужно шифровать. Это вариант известен как в ЕЕЕ, так как три DES операции являются шифрованием.
Рисунок 6. Схема алгоритма 3DES
Существует 3 типа алгоритма 3DES:
· DES-EEE3: Шифруется три раза с тремя разными ключами (операции шифрование-шифрование-шифрование).
· DES-EDE3: 3DES операции шифровка-расшифровка-шифровка с тремя разными ключами.
· DES-EEE2 и DES-EDE2: Как и предыдущие, за исключением того, что на первом и третьем шаге используется одинаковый ключ.
Самый популярная разновидность 3DES -- это DES-EDE3, для него алгоритм выглядит так:
Шифровка:
Расшифровка:
4.2. Пример шифрования и дешифрования методом Triple DES EDE3
Исходный текст: Pinaev
Ключ: 1234567
Второй ключ: 2345678
Третий ключ: 3456789
Исходный блок бит... Блок № 0:
00001010 10010110 01110110 10000110 10100110 01101110 00000000 00000000
Перевернутые биты в блоке...:
01010000 01101001 01101110 01100001 01100101 01110110 00000000 00000000
Ключ из 56 бит:
0011000__1001100__1000110__0110011__0100001__1010100__1101100__0110111__
Ключ из 64 бита, после добавления бит четности:
00110000 10011001 10001101 01100110 01000010 10101001 11011000 01101111
**********************ШИФРОВАНИЕ**********************
Исходное сообщение:
01010000 01101001 01101110 01100001 01100101 01110110 00000000 00000000
Результат шифрования блока. Конечная перестановка IP-1:
00010011 10010001 11010011 11111011 10011110 00011011 11011101 00011111
Дешифрование со вторым ключом: 2345678
Ключ 64 бита. С битами четности:
00110011 00011000 11001100 10000111 01010011 10110001 11011101 01110001
ключ (56). Перестановка РС1:
01101100 11010100 10100001 11110001 10010100 11000100 01100011
**********************ДеШИФРОВАНИЕ**********************
Начальная перестановка IP:
10011011 10111001 10100000 01001100 00001111 01001000 11001011 00011011
Результат дешифрования блока. Конечная перестановка IP-1:
10010010 11011011 00000001 11011110 00110011 10101011 00011000 11001001
Шифрование третьим ключом: 3456789
Ключ 64 бита. С битами четности:
00110011 10011010 00001100 10100110 01100011 10111000 11100001 01110010
ключ (56). Перестановка РС1:
01101010 11010000 11111001 10101001 10110000 11000010 01100011 011011
**********************ШИФРОВАНИЕ**********************
Исходное сообщение:
10010010 11011011 00000001 11011110 00110011 10101011 00011000 11001001
Начальная перестановка IP:
10001010 01011011 00001000 10110110 10101011 00110000 11101010 00111011
Результат шифрования блока. Конечная перестановка IP-1:
11001111 11110100 11011000 00001101 01100110 00101111 00110111 01100101
Зашифрованное сообщение: ПфШf/7e
Исходное зашифрованное сообщение: ПфШf/7e
Ключ: 1234567
Второй ключ: 2345678
Третий ключ: 3456789
Исходный блок бит... Блок № 0:
11110011 00101111 00011011 10110000 01100110 11110100 11101100 10100110
Перевернутые биты в блоке...:
11001111 11110100 11011000 00001101 01100110 00101111 00110111 01100101
Ключ из 56 бит:
0011001__1001101__0000110__1010011__0110001__1011100__1110000__0111001__
Ключ из 64 бита, после добавления бит четности:
00110011 10011010 00001100 10100110 01100011 10111000 11100001 01110010
**********************ДеШИФРОВАНИЕ**********************
Начальная перестановка IP:
10010111 01000110 11111011 11101001 00000111 11110010 00101101 01110001
Результат дешифрования блока. Конечная перестановка IP-1:
10010010 11011011 00000001 11011110 00110011 10101011 00011000 11001001
Шифрование вторым ключом: 2345678
Ключ 64 бита. С битами четности:
00110011 00011000 11001100 10000111 01010011 10110001 11011101 01110001
ключ (56). Перестановка РС1:
01101100 11010100 10100001 11110001 10010100 11000100 01100011
**********************ШИФРОВАНИЕ**********************
Исходное сообщение:
10010010 11011011 00000001 11011110 00110011 10101011 00011000 11001001
Результат шифрования блока. Конечная перестановка IP-1:
00010011 10010001 11010011 11111011 10011110 00011011 11011101 00011111
Дешифрование третьим ключом: 3456789
Ключ 64 бита. С битами четности:
00110000 10011001 10001101 01100110 01000010 10101001 11011000 01101111
ключ (56). Перестановка РС1:
01100110 11011000 10101001 01001001 10001000 11001110 01100011
**********************ДеШИФРОВАНИЕ**********************
Начальная перестановка IP:
01001100 11111111 11010000 11101111 01011110 00001000 11111000 10111101
Результат дешифрования блока. Конечная перестановка IP-1:
01010000 01101001 01101110 01100001 01100101 01110110 00000000 00000000
После дешифрования получили сообщение: Pinaev
5. Руководство пользователя программы
5.1 Общие сведения
Разработчик - Пинаев Павел Сергеевич, студент группы 23К.
Дата создания - июнь 2013 года.
Язык разработки - С#.
Компоненты пакета - файл: DES.exe.
5.2 Назначение программы
Программа предназначена для шифрования и дешифрования текстовых сообщений с использованием алгоритма шифрования DES. Возможно шифрование шестью разновидностями алгоритма DES: DES ECB, DES CBC, Triple DES EEE3, Triple DES EEE2, Triple DES EDE3, Triple DES EDE2.
5.3 Используемые технические средства
Операционная система - Windows XP, Vista, 7, 8
Свободное место на жестком диске - не менее 50 Кб
Объем оперативной памяти - 128 Мб и более
Процессор Intel Core i3 и выше
Видеокарта 512 Мб
5.4 Входные и выходные данные
Входными данными программы являются шифруемое и дешифруемое сообщение, которые задаются пользователем при работе с программой.
Выходные данные - зашифрованное и расшифрованное текстовое сообщение.
5.5 Ввод в действие программного средства
Данный программный продукт не требует установки на ПК. Для запуска программы необходимо два раза щелкнуть левой кнопкой мыши по исполняемому файлу DES.exe.
После запуска программы откроется окно программы (рисунок 7).
Рисунок 7. Главное окно программы
5.5.1 Интерфейс
На главном окне расположено чекбоксы для выбора типа шифрования, а также текстовые поля ввода исходного сообщения, ключей, начального вектора. В соответсвующих полях можно увидеть результаты (де)шифрования, которые будут получены если будут нажаты соответсвующие кнопки. Присутствует окно отображения процесса (де)шифрования.
5.5.2 Использование программного средства
Программа реализует следующие функции:
· Шифрование и дешифрование текста методом DES ECB (рисунок 8);
· Шифрование и дешифрование текста методом DES CBC (рисунок 9);
· Шифрование и дешифрование текста методом Triple DES EEE3 (рисунок 10);
· Шифрование и дешифрование текста методом Triple DES EDE3 (рисунок 11);
· Шифрование и дешифрование текста методом Triple DES EEE2 (рисунок 12);
· Шифрование и дешифрование текста методом Triple DES EDE2 (рисунок 13);
Рисунок 8. Шифрование и дешифрование текста методом DES ECB
Рисунок 9. Шифрование и дешифрование текста методом DES CBC
Рисунок 10. Шифрование и дешифрование текста методом Triple DES EEE3
Рисунок 11. Шифрование и дешифрование текста методом Triple DES EDE3
Рисунок 12. Шифрование и дешифрование текста методом Triple DES EEE2
Рисунок 13. Шифрование и дешифрование текста методом Triple DES EDE2
криптографический программный шифрование текст
6. Код программы
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DES
{
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
public string bufff;
public string bufff1;
public string IshSoobshen;
public byte[] T;
public bool Shifr;
public BitArray btIsh = new BitArray(64);
public BitArray[] btTransp;
public BitArray bt1;
public BitArray bt2;
public BitArray btKluch1;
public BitArray btKluch2;
public BitArray[] KLUCHI;
public BitArray[] KLUCHIPREDVORITELNII;
public BitArray kluchC0;
public BitArray kluchD0;
public BitArray kluchC1;
public BitArray kluchD1;
public BitArray[] L0;
public BitArray[] H0;
public BitArray[] L1;
public BitArray[] H1;
public BitArray[] LPart;
public BitArray[] HPart;
public BitArray[] HHH;
public BitArray[] b2b3b4b5;
public BitArray[] b1b6;
public BitArray[] TTT;
public BitArray HShtrih;
public BitArray Funk;
public BitArray[] ItogPredv;
public BitArray[] Itog;
public BitArray[] CBCItog;
public int[] NStr;
public int[] NStolb;
public int[,] UzelZam;
public int buf;
public int buf2;
public BitArray buf3;
public bool steck;
public bool kluch;
public bool vector;
public BitArray Vekt;
public bool EEE2;
public bool EEE3;
public bool EDE2;
public bool EDE3;
public int[] IP = {58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
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};
public int[] IP1 = {40,8,48,16,56,24,64,32,
39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,
37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,
35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58,26,
33,1,41,9,49,17,57,25};
public int[] E = {32,1,2,3,4,5,
4,5,6,7,8,9,
8,9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1};
public int[] P = {16,7,20,21,29,12,28,17,
1,15,23,26,5,18,31,10,
2,8,24,14,32,27,3,9,
19,13,30,6,22,11,4,25};
public int[] S10 = { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 };
public int[] S11 = { 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 };
public int[] S12 = { 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 };
public int[] S13 = { 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 };
public int[] S20 = { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 };
public int[] S21 = { 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 };
public int[] S22 = { 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 };
public int[] S23 = { 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 };
public int[] S30 = { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 };
public int[] S31 = { 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 };
public int[] S32 = { 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 };
public int[] S33 = { 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 };
public int[] S40 = { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 };
public int[] S41 = { 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 };
public int[] S42 = { 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 };
public int[] S43 = { 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 };
public int[] S50 = { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 };
public int[] S51 = { 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 };
public int[] S52 = { 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 };
public int[] S53 = { 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 };
public int[] S60 = { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 };
public int[] S61 = { 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 };
public int[] S62 = { 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 };
public int[] S63 = { 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 };
public int[] S70 = { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 };
public int[] S71 = { 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 };
public int[] S72 = { 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 };
public int[] S73 = { 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 };
public int[] S80 = { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 };
public int[] S81 = { 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 };
public int[] S82 = { 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 };
public int[] S83 = { 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 };
public int[] PC1 = { 57,49,41,33,25,17,9,
1,58,50,42,34,26,18,
10,2,59,51,43,35,27,
19,11,3,60,52,44,36,
63,55,47,39,31,23,15,
7,62,54,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4};
public int[] PC2 = { 14,17,11,24,1,5,
3,28,15,6,21,10,
23,19,12,4,26,8,
16,7,27,20,13,2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32};
public int[] SDVIGG = { 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
//вектор в биты
public void VectorToByte()
{
buf = 0;
vector = false;
if (IshSoobshen.Length == 8)
{
//переводим в байты
vector = true;
byte[] T = Encoding.Default.GetBytes(IshSoobshen);
//в биты
Vekt = new BitArray(T);
////переворачиваем
for (int g = 0; g < Vekt.Length / 8; g++)
{
buf = 0;
for (int i = 0; i < 4; i++)
{
steck = Vekt[i + (g * 8)];
Vekt[i + (g * 8)] = Vekt[i + (g * 8) + 7 - buf];
Vekt[i + (g * 8) + 7 - buf] = steck;
buf += 2;
}
}
}
else
{
MessageBox.Show("Неправильный вектор");
kluch = false;
}
}
//ключ в биты
public void KeyToByte()
{
buf = 0;
kluch = false;
if (IshSoobshen.Length == 7)
{
//переводим в байты
kluch = true;
byte[] T = Encoding.Default.GetBytes(IshSoobshen);
//в биты
btKluch1 = new BitArray(T);
////переворачиваем
for (int g = 0; g < btKluch1.Length / 8; g++)
{
buf = 0;
for (int i = 0; i < 4; i++)
{
steck = btKluch1[i + (g * 8)];
btKluch1[i + (g * 8)] = btKluch1[i + (g * 8) + 7 - buf];
btKluch1[i + (g * 8) + 7 - buf] = steck;
buf += 2;
}
}
}
else
{
MessageBox.Show("Неправильный ключ");
kluch = false;
}
}
//сообщение в биты
public void MessToByte()
{
buf = 0;
//переводим в байты
byte[] T = Encoding.Default.GetBytes(IshSoobshen);
//в биты
bt2 = new BitArray(T);
if (bt2.Length % 64!= 0)
{//проверяем кратность 64 бит
bt1 = new BitArray(bt2.Length + (64 - bt2.Length % 64));
for (int y = 0; y < bt2.Length; y++)
{
bt1[y] = bt2[y];
}
}
else
{
bt1 = new BitArray(bt2.Length);
for (int y = 0; y < bt2.Length; y++)
{
bt1[y] = bt2[y];
}
}
//меняем местами биты в блоках
for (int g = 0; g < bt1.Length / 8; g++)
{
buf = 0;
for (int i = 0; i < 4; i++)
{
steck = bt1[i + (g * 8)];
bt1[i + (g * 8)] = bt1[i + (g * 8) + 7 - buf];
bt1[i + (g * 8) + 7 - buf] = steck;
buf += 2;
}
}
}
//делим сообщение на блоки по 8 бит
public void CutForBlock()
{
//кол-во блоков
buf = bt1.Length / 64;
//делим на перестановленные блоки
btTransp = new BitArray[buf];
for (int i = 0; i < buf; i++)
{
btTransp[i] = new BitArray(64);
}
buf2 = 0;
for (int g = 0; g < buf; g++)
{
for (int h = g * 64; h < (g + 1) * 64; h++)
{
if (g == 0)
{
btTransp[buf2][h] = bt1[IP[h] - 1];
}
else
{
btTransp[buf2][h - g * 64] = bt1[IP[h - g * 64] - 1 + g * 64];
}
}
buf2++;
}
}
//дополняем ключ битом четности
public void KeyTo64()
{
// бит четности
buf = 0;
buf2 = 0;
buf3 = new BitArray(8);
for (int y = 0; y < 8; y++)
{
for (int u = 0; u < 7; u++)
{
if (btKluch1[y * 7 + u] == true)
{
buf++;
}
}
if ((buf % 2 == 0) || (buf == 0))
{
buf3[buf2] = false;
}
else { buf3[buf2] = true; }
buf = 0;
buf2++;
}
//заносим бит четности в ключ
buf = 0;
buf2 = 0;
btKluch2 = new BitArray(64);
for (int k = 0; k < 64; k++)
{
if ((k == 7) || (k == 15) || (k == 23) || (k == 31) || (k == 39) || (k == 47) || (k == 55) || (k == 63))
{
btKluch2[k] = buf3[buf2];
buf2++;
}
else
{
btKluch2[k] = btKluch1[buf];
buf++;
}
}
}
//разбиваем сообщение на 2 части
public void OneToTwo()
{
H0 = new BitArray[17];
L0 = new BitArray[17];
H1 = new BitArray[17];
L1 = new BitArray[17];
HHH = new BitArray[8];
TTT = new BitArray[8];
b1b6 = new BitArray[8];
Itog = new BitArray[btTransp.Length];
ItogPredv = new BitArray[btTransp.Length];
b2b3b4b5 = new BitArray[8];
NStolb = new int[8];
NStr = new int[8];
UzelZam = new int[16, 8];
HShtrih = new BitArray(32);
Funk = new BitArray(32);
for (int gh = 0; gh < btTransp.Length; gh++)
{
Itog[gh] = new BitArray(64);
ItogPredv[gh] = new BitArray(64);
}
for (int qwe = 0; qwe < 8; qwe++)
{
TTT[qwe] = new BitArray(4);
HHH[qwe] = new BitArray(6);
b1b6[qwe] = new BitArray(2);
b2b3b4b5[qwe] = new BitArray(4);
}
HPart = new BitArray[btTransp.Length];
LPart = new BitArray[btTransp.Length];
for (int i = 0; i < 17; i++)
{
H0[i] = new BitArray(32);
L0[i] = new BitArray(32);
H1[i] = new BitArray(48);
L1[i] = new BitArray(48);
}
for (int e = 0; e < btTransp.Length; e++)
{
HPart[e] = new BitArray(32);
LPart[e] = new BitArray(32);
}
for (int s = 0; s < btTransp.Length; s++)
{
for (int d = 0; d < 32; d++)
{
HPart[s][d] = btTransp[s][d];
LPart[s][d] = btTransp[s][d + 32];
}
}
}
//все методы print выводят шаги на экран
public void Print1()
{
buf = 0;
bufff = "";
for (int k = 0; k < bt1.Length / 64; k++)
{
listBox1.Items.Add((k + 1) + "й изначальный блок бит:");
for (int y = 0; y < 64; y++)
{
if ((y == 7) || (y == 15) || (y == 23) || (y == 31) || (y == 39) || (y == 47) || (y == 55) || (y == 63))
{
bufff += (bt1[64 * k + y] ? 1: 0).ToString();
bufff += " ";
}
else
{
bufff += (bt1[64 * k + y] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
}
}
public void Print2()
{
bufff = "";
for (int k = 0; k < btTransp.Length; k++)
{
listBox1.Items.Add((k + 1) + "й переставленный блок бит:");
for (int y = 0; y < 64; y++)
{
if ((y == 7) || (y == 15) || (y == 23) || (y == 31) || (y == 39) || (y == 47) || (y == 55) || (y == 63))
{
bufff += (btTransp[k][y] ? 1: 0).ToString();
bufff += " ";
}
else
{
bufff += (btTransp[k][y] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
}
}
public void Print3()
{
bufff = "";
buf = 0;
listBox1.Items.Add("Ключ из 56 бит:");
for (int y = 0; y < 64; y++)
{
if ((y == 7) || (y == 15) || (y == 23) || (y == 31) || (y == 39) || (y == 47) || (y == 55) || (y == 63))
{
bufff += "* ";
buf++;
}
else
{
bufff += (btKluch1[y - buf] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
}
public void Print4()
{
bufff = "";
listBox1.Items.Add("Ключ из 64 бит:");
for (int y = 0; y < 64; y++)
{
if ((y == 7) || (y == 15) || (y == 23) || (y == 31) || (y == 39) || (y == 47) || (y == 55) || (y == 63))
{
bufff += (btKluch2[y] ? 1: 0).ToString();
bufff += " ";
}
else
{
bufff += (btKluch2[y] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
}
//метод ECB
public void ECB()
{
//переводим ключ в биты
IshSoobshen = textBox4.Text;
KeyToByte();
if (Shifr == true)
{
IshSoobshen = textBox2.Text;
}
else
{
IshSoobshen = textBox3.Text;
}
if ((IshSoobshen!= "")&&(kluch==true))
{
//переводим сообщение в биты
MessToByte();
buf = bt1.Length / 64;
//выводим на экран
listBox1.Items.Add("---------------------------ПОДГОТОВКА---------------------------");
listBox1.Items.Add("Сообщение состоит из х" + buf + " 64 битных блоков");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
}
else
{
if (kluch == true)
{
MessageBox.Show("Исходное сообщение отсутствует!");
}
}
}
//алгоритм DES-CBC
public void CBC()
{
//переводим ключ в биты
IshSoobshen = textBox4.Text;
KeyToByte();
//переводим вектор в биты
IshSoobshen = textBox6.Text;
VectorToByte();
if (Shifr == true)
{
IshSoobshen = textBox2.Text;
}
else
{
IshSoobshen = textBox3.Text;
}
if ((IshSoobshen!= "") && (kluch == true)&&(vector==true))
{
//переводим сообщение в биты
MessToByte();
buf = bt1.Length / 64;
//выводим на экран
listBox1.Items.Add("---------------------------ПОДГОТОВКА---------------------------");
listBox1.Items.Add("Сообщение состоит из х" + buf + " 64 битных блоков");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//XOR с вектором
if (Shifr == true)
{
btTransp[0].Xor(Vekt);
}
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
}
else
{
if ((kluch == true)&&(vector==true))
{
MessageBox.Show("Исходное сообщение отсутствует!");
}
}
}
//EEE
public void EEE()
{
if (((EEE3==true)&&(textBox4.Text.Length == 7) && (textBox7.Text.Length == 7) && (textBox8.Text.Length == 7))||((EEE2==true)&&(textBox4.Text.Length == 7) && (textBox7.Text.Length == 7)))
{
if (Shifr == true)
{
//переводим ключ в биты
IshSoobshen = textBox4.Text;
KeyToByte();
IshSoobshen = textBox2.Text;
if ((IshSoobshen!= "") && (kluch == true))
{
//переводим сообщение в биты
MessToByte();
buf = bt1.Length / 64;
//выводим на экран
listBox1.Items.Add("---------------------------ПОДГОТОВКА---------------------------");
listBox1.Items.Add("Сообщение состоит из х" + buf + " 64 битных блоков");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
IshSoobshen = textBox7.Text;
KeyToByte();
IshSoobshen = textBox3.Text;
textBox3.Clear();
//переводим сообщение в биты
MessToByte();
//выводим на экран
listBox1.Items.Add(" ");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
if (EEE3 == true)
{
IshSoobshen = textBox8.Text;
}
if (EEE2 == true)
{
IshSoobshen = textBox4.Text;
}
KeyToByte();
IshSoobshen = textBox3.Text;
textBox3.Clear();
//переводим сообщение в биты
MessToByte();
//выводим на экран
listBox1.Items.Add(" ");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
}
else
{
if (kluch == true)
{
MessageBox.Show("Исходное сообщение отсутствует!");
}
}
}
else
{
//переводим ключ в биты
if (EEE3 == true)
{
IshSoobshen = textBox8.Text;
}
if (EEE2 == true)
{
IshSoobshen = textBox4.Text;
}
KeyToByte();
IshSoobshen = textBox3.Text;
if ((IshSoobshen!= "") && (kluch == true))
{
//переводим сообщение в биты
MessToByte();
buf = bt1.Length / 64;
//выводим на экран
listBox1.Items.Add("---------------------------ПОДГОТОВКА---------------------------");
listBox1.Items.Add("Сообщение состоит из х" + buf + " 64 битных блоков");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
IshSoobshen = textBox7.Text;
KeyToByte();
IshSoobshen = textBox5.Text;
textBox5.Clear();
//переводим сообщение в биты
MessToByte();
//выводим на экран
listBox1.Items.Add(" ");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
IshSoobshen = textBox4.Text;
KeyToByte();
IshSoobshen = textBox5.Text;
textBox5.Clear();
//переводим сообщение в биты
MessToByte();
//выводим на экран
listBox1.Items.Add(" ");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
}
else
{
if (kluch == true)
{
MessageBox.Show("Исходное сообщение отсутствует!");
}
}
}
}
else
{
MessageBox.Show("Проверьте ключи. Один из них не подходит.");
}
}
//EDE
public void EDE()
{
if (((EDE3 == true) && (textBox4.Text.Length == 7) && (textBox7.Text.Length == 7) && (textBox8.Text.Length == 7)) || ((EDE2 == true) && (textBox4.Text.Length == 7) && (textBox7.Text.Length == 7)))
{
if (Shifr == true)
{
//переводим ключ в биты
IshSoobshen = textBox4.Text;
KeyToByte();
IshSoobshen = textBox2.Text;
if ((IshSoobshen!= "") && (kluch == true))
{
//переводим сообщение в биты
MessToByte();
buf = bt1.Length / 64;
//выводим на экран
listBox1.Items.Add("---------------------------ПОДГОТОВКА---------------------------");
listBox1.Items.Add("Сообщение состоит из х" + buf + " 64 битных блоков");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
Shifr = false;
IshSoobshen = textBox7.Text;
KeyToByte();
IshSoobshen = textBox3.Text;
textBox3.Clear();
//переводим сообщение в биты
MessToByte();
//выводим на экран
listBox1.Items.Add(" ");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
Shifr = true;
if (EDE3 == true)
{
IshSoobshen = textBox8.Text;
}
if (EDE2 == true)
{
IshSoobshen = textBox4.Text;
}
KeyToByte();
IshSoobshen = textBox5.Text;
textBox5.Clear();
//переводим сообщение в биты
MessToByte();
//выводим на экран
listBox1.Items.Add(" ");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
}
else
{
if (kluch == true)
{
MessageBox.Show("Исходное сообщение отсутствует!");
}
}
}
else
{
//переводим ключ в биты
if (EDE3 == true)
{
IshSoobshen = textBox8.Text;
}
if (EDE2 == true)
{
IshSoobshen = textBox4.Text;
}
KeyToByte();
IshSoobshen = textBox3.Text;
bufff1 = textBox3.Text;
if ((IshSoobshen!= "") && (kluch == true))
{
//переводим сообщение в биты
MessToByte();
buf = bt1.Length / 64;
//выводим на экран
listBox1.Items.Add("---------------------------ПОДГОТОВКА---------------------------");
listBox1.Items.Add("Сообщение состоит из х" + buf + " 64 битных блоков");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
Shifr = true;
IshSoobshen = textBox7.Text;
KeyToByte();
IshSoobshen = textBox5.Text;
textBox5.Clear();
textBox3.Clear();
//переводим сообщение в биты
MessToByte();
//выводим на экран
listBox1.Items.Add(" ");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
Shifr = false;
IshSoobshen = textBox4.Text;
KeyToByte();
IshSoobshen = textBox3.Text;
textBox3.Clear();
textBox3.Text = bufff1;
//переводим сообщение в биты
MessToByte();
//выводим на экран
listBox1.Items.Add(" ");
Print1();
//делим на блоки
CutForBlock();
//выводим на экран
Print2();
////вывод на экран ключ
Print3();
//дополняем ключ до 64 бит
KeyTo64();
//выводим ключ 64 бит на экран
Print4();
//метод для ключевых элементов
KEYS();
//разбиваем сообщение на половинки
OneToTwo();
//функция шифрования
FUNKCIY();
}
else
{
if (kluch == true)
{
MessageBox.Show("Исходное сообщение отсутствует!");
}
}
}
}
else
{
MessageBox.Show("Проверьте ключи. Один из них не подходит.");
}
}
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
textBox3.Clear();
textBox5.Clear();
Shifr = true;
kluch = false;
vector = false;
EEE3 = false;
EEE2 = false;
EDE3 = false;
EDE2 = false;
if (radioButton1.Checked == true)
{
ECB();
}
if (radioButton2.Checked == true)
{
CBC();
}
if (radioButton3.Checked == true)
{
EEE3 = true;
EEE();
}
if (radioButton4.Checked == true)
{
EDE3 = true;
EDE();
}
if (radioButton5.Checked == true)
{
EEE2 = true;
Подобные документы
Стандарт шифрования Advanced Encryption Standard как официальный стандарт правительства США для симметричного шифрования. Таблицы подстановки для S-Box и InvS-Box. Преобразование MixColumns, SubWord, RotWord. Процедура расширения ключа 128, 192, 256 бит.
презентация [2,2 M], добавлен 12.12.2013Разработка криптографического алгоритма программы ручного шифра по таблице Виженера. Разработка программы, выполняющей шифрование и расшифрование. Особенности использования в качестве ключа самого открытого текста. Алгоритмы решения "обратных" задач.
курсовая работа [45,0 K], добавлен 13.11.2009Разработка приложения для шифрования данных с помощью алгоритма DES5: процесс шифрования, расшифрования, получение ключей. Спецификация программы, процедуры и функции; описание интерфейса пользователя. Реализация задачи в среде программирования DELPHI.
курсовая работа [812,6 K], добавлен 27.03.2012История появления и развития шифрования текста. Проблема шифрования и дешифрования текстовых сообщений в современности. Создание программы для зашифровки и расшифровки вводимого текста пятью методами: Атбаш, Цезаря, Полибия, Гронсфельда и Винжера.
курсовая работа [923,6 K], добавлен 26.12.2011Схема работы и требования к программам шифрования и дешифрования. Алгоритмы и тексты программы шифрования и программы дешифрования, выполненные на языке программирования C/C++. Содержание файла с исходным текстом, с шифротекстом, с дешифрованным текстом.
курсовая работа [24,7 K], добавлен 20.10.2014Симметричные и асиметричные методы шифрования. Шифрование с помощью датчика псевдослучайных чисел. Алгоритм шифрования DES. Российский стандарт цифровой подписи. Описание шифрования исходного сообщения асимметричным методом с открытым ключом RSA.
курсовая работа [101,1 K], добавлен 09.03.2009Исследование симметричных алгоритмов блочного шифрования. Минусы и плюсы алгоритма IDEA. Разработка программы аутентификации пользователя и сообщений на основе алгоритма IDEA. Выбор языка программирования. Тестирование и реализация программного средства.
курсовая работа [314,2 K], добавлен 27.01.2015Понятие информационной безопасности. История развития криптографии. Функции информационных моделей. Переменные, используемые при разработке прикладной программы для шифрования и дешифрования сообщений с помощью шифра Цезаря. Блок-схема общего алгоритма.
курсовая работа [975,5 K], добавлен 11.06.2014Исследование системы распределения ключей на основе линейных преобразований. Описание компонентов сети конфиденциальной связи. Характеристика отечественного алгоритма шифрования данных. Обзор результатов расчетов криптостойкости алгоритма шифрования.
контрольная работа [56,5 K], добавлен 26.09.2012Основные методы криптографической защиты информации. Система шифрования Цезаря числовым ключом. Алгоритмы двойных перестановок и магические квадраты. Схема шифрования Эль Гамаля. Метод одиночной перестановки по ключу. Криптосистема шифрования данных RSA.
лабораторная работа [24,3 K], добавлен 20.02.2014