Автор работы: Пользователь скрыл имя, 28 Января 2013 в 17:58, реферат
Афінні шифри вищих порядків.
Подумаємо, як можна розширити монограмні шифри попереднього пункту так, щоб вони оперували з k-грамами для довільного k > 1. Спочатку введемо операцію додавання в Znk. Сумою векторів X = (x1,. . .,хk) і s = (s1,… ,sk) з Znk є вектор X + S = ((x1 + s1) mod n,…, (хk + sk) mod n). Zkn з операцією додавання є групою. Вектор -S = (n — s1,…, n — sk) є оберненим до вектора
S = (s1,…,sk).
Теоретична частина
Опис використаних систем шифрування
Подумаємо, як можна розширити монограмні шифри попереднього пункту так, щоб вони оперували з k-грамами для довільного k > 1. Спочатку введемо операцію додавання в Znk. Сумою векторів X = (x1,. . .,хk) і s = (s1,… ,sk) з Znk є вектор X + S = ((x1 + s1) mod n,…, (хk + sk) mod n). Zkn з операцією додавання є групою. Вектор -S = (n — s1,…, n — sk) є оберненим до вектора
S = (s1,…,sk).
Шифр зсуву k-го порядку.
Ключ: S є Zkn.
Шифрування. Повідомлення розбивається на k-грами. Кожна k-грама X заміщується k-грамою Е(Х) = X + S.
Дешифрування. Кожна k-грама X' криптотексту заміщується k-грамою D(X') = X' + 5’, де
S' = -S є дешифруючим ключем.
Лінійний шифр k-го порядку.
Ключ: А Є GLk(Zn).
Шифрування. Повідомлення розбивається на k-грами. Кожна k-грама X заміщується k-грамою Е(Х)= АХ.
Дешифрування. Кожна k-грама Х’ криптотексту заміщується k-грама D(X') = A'X', де
А’ = А-1 — дешифруючий ключ.
Афінний шифр k-го порядку.
Ключ: А Є GLk{Zn} і S Є Znk.
Шифрування. Повідомлення розбивається на k-грами. Кожна k-грама X заміщується k-грамою Е(Х) = АХ + S.
Дешифрування. Кожна k-грама X' криптотексту заміщується k-грамою D{X’} = А’X’ + S’, де А’ = А-1 і S’ = -A’S — дешифруючий ключ.
Безпека алгоритму RSA побудована на принципі складності факторизації. Алгоритм використовує два ключі — відкритий (public) і секретний (private), разом відкритий і відповідний йому секретний ключі утворюють пари ключів (keypair). Відкритий ключ не потрібно зберігати в таємниці, він використовується для шифрування даних. Якщо повідомлення було зашифровано відкритим ключем, то розшифрувати його можна тільки відповідним секретним ключем.
Генерація ключів
Для того, щоб згенерувати пари ключів виконуються такі дії:
Число називається модулем, а числа і — відкритою й секретною експонентами, відповідно. Пари чисел є відкритою частиною ключа, а — секретною. Числа і після генерації пари ключів можуть бути знищені, але в жодному разі не повинні бути розкриті.
Шифрування й розшифрування
Для того, щоб зашифрувати повідомлення обчислюється
.
Число і використовується в якості шифртексту. Для розшифрування потрібно обчислити
.
Неважко переконатися, що при розшифруванні ми відновимо вихідне повідомлення:
З умови
виходить, що
для деякого цілого , отже
Згідно з теоремою Ейлера:
,
тому
Практична частина
Завдання №1
Згідно варіанту нам потрібно зашифрувати слово «Хід» Лінійним афінним шифром 1 порядку.
Порядкові номери букв, які потрібно зашифрувати:
Х |
І |
Д |
25 |
11 |
5 |
Для зашифрування використаємо наступні ключі:
S = 5
Формула за шифрування:
Y1=25+5=30mod33=30 ь
Y2=11+5=16mod33=16 м
Y3=5+5=10mod33=10 и
Шифртекст після виконання шифрування: ьми
Завдання №2
Згідно варіанту потрібно зашифрувати слово «ТРИ» шифром RSA. При шифруванні потрібно використати наступні ключі: p=3, q=11.
Проведено попереднє зашифрування алгоритмом RSA, та знаходження змінної d для закритого ключа, що використовується в розшифруванні криптотексту.
е = 11;
d = e –1 mod phi(n);
d = 11 –1 mod 20;
Цілочисельно ділимо phi(n) = 20 на e –1 = 11:
40 = 1 * 11 + 9;
11 = 1 * 9 +2;
9 = 4 * 2 + 1;
2 = 9 * 1 + 0.
Ui+1 = Ui-1 - qi * Ui
Vi+1 = Vi-1 - qi * Vi
U0 = V1 = 1
V0 = U1 = 0
i =1 U2 = U0 – q1 * U1 = 1 – 1 * 0 = 1
V2 = V0 – q1 * V1 = 0 – 1 * 1 = - 1
i =2 U3 = U1 – q2 * U2 = 0 – 1 * 1 = - 1
V3 = V1 – q2 * V2 = 1 – 1 * (-1) = 2
i =3 U4 = U2 – q3 * U3 = 1 – 4 * (-1) = 5
V4 = V2 – q3 * V3 = 1 – 4 * 2 = - 7
Отже, наше d буде дорівнювати останній елемент V4 mod 40, тобто -7 mod 20 = 13.
Порядкові номери букв, які потрібно зашифрувати:
Т |
Р |
И |
22 |
20 |
10 |
C1 = 2211 mod 33 = 22
11 → 1011
l= 3
i = 1,4 z0 = 1
i = 1 z1 = z1* z1 * X mod 33 = 1* 1 * 22 mod 33 =22
i = 2 z2 = z1* z1 mod 33 = 22 * 22 mod 33 = 22
i = 3 z3 = z1* z1 * X mod 33 = 22* 22 * 22 mod 33 = 22
i = 4 z4 = z1* z1 * X mod 33 = 22* 22 * 22 mod 33 = 22
C1 = 2011 mod 33 = 20
11 → 1011
l= 3
i = 1,4 z0 = 1
i = 1 z1 = z1* z1 * X mod 33 = 1* 1 * 20 mod 33 = 20
i = 2 z2 = z1* z1 mod 33 = 20 * 20 mod 33 = 4
i = 3 z3 = z1* z1 * X mod 33 = 4* 4 * 20 mod 33 = 23
i = 4 z4 = z1* z1 * X mod 33 = 23* 23 * 20 mod 33 = 20
C1 = 1011 mod 33 = 10
11 → 1011
l= 3
i = 1,4 z0 = 1
i = 1 z1 = z1* z1 * X mod 33 = 1* 1 * 10 mod 33 = 10
i = 2 z2 = z1* z1 mod 33 = 10 * 10 mod 33 = 1
i = 3 z3 = z1* z1 * X mod 33 = 1* 1 * 10 mod 33 = 10
i = 4 z4 = z1* z1 * X mod 33 = 10* 10 * 10 mod 33 = 10
Програмна реалізація алгоритмів шифрування
Афінний шифр 1 порядку.
Слово, яке потрібно зашифрувати – «Хід»
Ключі, використані в програмі:
Ключ А(матриця) – 25
Ключ S - 30
Програма шифрує 2 методами:
Код програми
// LiniynuyWufr.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include <conio.h>
#include <cmath>
#include <windows.h>
static int wufrnum[3]; //масив для числових значень шифртексту
static int wordnum[3]; //масив для числових значень відкритого тексту
static int kluchA=25; //масив ключа
static int kluchS=30;
static char ASCII[3];
char* alfavit="
char* slovo="хiд"; //слово яке потрібно зашифрувати
void Ocufrovka() //функція для оцифровування слова
{
for(int j=0;j<3;j++)
{
for(int i=0;i<33;i++)
{
if(alfavit[i]==slovo[j])
{
wordnum[j]+=i;
}
}
}
}
void Encryption() //функція для шифрування
{
for(int i=0; i<3; i++)
{
wufrnum[i]=(wordnum[i]*kluchA)
ASCII[i]+=wufrnum[i]%256;
wufrnum[i]=wufrnum[i]%33;
}
}
void Vuvedennja() //функція для виводу на екран
{
std::cout<<"Слово, яке потрiбно зашифрувати - "<<slovo<<std::endl;
std::cout<<"Ключ шифрування A - "<<kluchA<<std::endl;
std::cout<<"Ключ шифрування S - "<<kluchS<<std::endl;
std::cout<<"Порядковий номер
букв, якi потрiбно зашифрувати:"<<std::endl<<std:
for(int i=0; i<3; i++) //Алгоритм виведення на екран порядкового номеру букв
{
std::cout<<slovo[i]<<" - "<<wordnum[i]<<std::endl;
}
std::cout<<"\nШифртекст - ";
for(int i=0;i<3;i++) //Алгоритм виведення на екран шифртексту
{
std::cout<<alfavit[wufrnum[i]]
}
std::cout<<std::endl<<"
for(int i=0;i<3;i++) //Алгоритм виведення на екран шифртексту (ASCII)
{
std::cout<<ASCII[i];
}
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Ukrainian");
Ocufrovka();
Encryption();
Vuvedennja();
std::cin.get();
return 0;
}
Результат виконання програми зашифрування Афінним лінійним шифром 1 порядку
Шифр RSA.
Слово, яке потрібно зашифрувати – «Код»
Ключі, використані в програмі: p-9; q-15
// rsaSINGLE.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"//стандартна бібліотека вводу виводу
#include <conio.h>
#include "cmath"//С++ математична бібліотека
char* word="код";//Слово, яке потрібно зашифрувати
char* alfavitt="
long q,p,n,phi;//зміні по формулі
long e;
//============================
long tempArr[4];//
long temp[3];//масив результатів
double rozmirByte[2];//масив кількості байт слова
//===========================
long Pow(long num,long n)//перегруження функції піднесення в степінь типом long
{
long res = num;
for (long i = 1; i < n; i++)
{
res *= num;
}
return res;
}
int Pow(int num,int n)//перегруження функції піднесення в степінь типом int
{
int res = num;
for (int i = 1; i < n; i++)
{
res *= num;
}
return res;
}
int Zedn(int a,int b)//функція конюкції(зливання) двох змінних типу int
{
int result=0;
int count=0;
while (a>10)
{
a%=10;
count++;
}
result=a*(Pow(10, count+1)) + b;
return result;
}
void FindE()//функція для знаходження найбільшого спільного дільника та числа Е
{
p=9;
q=15;
n=p*q;
phi=n-p-q+1;
int count=2;//мінімально може бути два числа бо ділиться на 1 і само себе
for (int i = 2; i<phi; i++)
{
int temp = 0;
for (int j = 1; j <= i; j++)
{
// Кількість дільників
if (i/j*j==i)
}
// Число просте і n на нього не ділиться
if ((temp < 3) && (phi/i*i < phi))
{
count ++;
e=i;//найменше взаємно просте число
break;
}
}
}
void SearchWord()//функція перетворення символів в числовий тип
{
for(int i=0;i<33;i++)
for(int j=0;j<3;j++)
{
if(alfavitt[i]==word[j])
tempArr[j]=i;
}
}
void Rezalt()//поблокове шифрування
{
double c;
double nlog=std::log(n+0.0)/
//std::cout<<nlog<<std::endl;
for (int i = 0; i < 3; i++)
{
c=0;
c=std::log(tempArr[i]+0.0)/
rozmirByte[i]=c;
}
int b;
for (int i = 0; i < 3; i++)//поблокове шифрування
{
b =0;
if(rozmirByte[i]&&rozmirByte[
{
b=Zedn(tempArr[i],tempArr[i+1]
}
else
{
b=tempArr[i];
}
temp[i]=Pow((long)b,(long)e)%
}
}
void Vuvid()//виведення на екран
{
setlocale(LC_ALL, "Ukrainian");
std::cout<<"Слово яке потрiбно зашифрувати - "<<word<<std::endl;
std::cout<<"Ключ р = "<<p<<std::endl;
std::cout<<"Ключ q = "<<q<<std::endl;
std::cout<<"n = "<<n<<std::endl;