Криптография данных
Заказать уникальную дипломную работу- 37 37 страниц
- 8 + 8 источников
- Добавлена 26.06.2017
- Содержание
- Часть работы
- Список литературы
- Вопросы/Ответы
ВВЕДЕНИЕ 8
ГЛАВА 1 10
1.1. ОПРЕДЕЛЕНИЕ И НАЗНАЧЕНИЕ КРИПТОСИСТЕМ 10
1.2. Криптографическая стойкость 12
ГЛАВА 2. Теоретические и практические основы построения криптосистемы RSA 17
2.1. Криптосистема RSA 17
2.2. Цифровая подпись RSA 19
2.3. Пример работы алгоритма шифрования 20
2.4. Криптосистема Эль-Гамаля 22
2.5. Криптографическая система Рабина……………………………………...27
2.6. Ранцевая криптосистема Меркла-Хеллмана………………...……………28
2.7. Разработка программы для RSA-шифрования……………………...…….29
ЗАКЛЮЧЕНИЕ 34
СПИСОК ЛИТЕРАТУРЫ 35
ПРИЛОЖЕНИЕ 36
Приложение 1. Программа факторизации методом Ферма 36
Приложение 2. Демонстрация работы с алгоритмом RSA 37
Рисунок 2.7.1 Главное окно программы
Рисунок 2.7.2 Форма открытия файла
Рисунок 2.7.3 Диалоговое окно об окончании шифрования
Рисунок 2.7.4 Форма сохранения файла
ЗАКЛЮЧЕНИЕ
В настоящей работе представлены некоторые понятие криптография и теоретические вопросы построение криптостойких шифров, рассмотрен ряд алгоритмов для факторизация целых чисел , алгоритм шифрования RSA и ряд других алгоритмов и реализации электронно-цифровой подписи.
Основные результаты работы заключаются в следующем:
Приведена классификация проблем на трудности решения, которых основанный ряд криптографических алгоритмов.
Проведён анализ криптосистемы RSA и других криптосистем
Разработано программное обеспечение для шифрования методом RSA.
Перспективным направлением дальнейших исследований является применение эллиптических кривых для шифрования и дешифрования данных
СПИСОК ЛИТЕРАТУРЫ
Введение в криптографию. Под общей редакцией В. В. Ященко. Издание 4-е, дополненное. МЦНМО, М., 2012.
О. А. Логачёв, А. А. Сальников, С. В. Смышляев, В. В. Ященко. Булевы функции в теории кодирования и криптологии. Издание второе, дополненное. МЦНМО, М., 2012.
Б. Шнайер. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си. Издательство ТРИУМФ, М., 2002.
Х. К. А. ван Тилборг. Основы криптологии. Профессиональное руководство и интерактивный учебник. Мир, М., 2006.
Н. П. Варновский. Математическая криптография. Несколько этюдов. Московский университет и развитие криптографии в России. Материалы конференции в МГУ 17–18 октября 2002 г., МЦНМО, М., 2003, с. 98–121.
O. Goldreich. Foundations of cryptography. Volume 1 (Basic tools). Volume 2 (Basic applications). Cambridge University Press, Cambridge, United Kingdom, 2001 (v. 1), 2004 (v. 2).
Pseudorandomness and cryptographic applications. Princeton University Press, Princeton, New Jersey, 1996.
С.М. Авдошин, А.А. Набебин. Дискретная математика. Модулярная алгебра, криптография, кодирование. – М.: ДМК Пресс, 2017. -352 с.
ПРИЛОЖЕНИЕ
Приложение 1. Программа факторизации методом Ферма
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ferma_cons
{
class Program
{
static void Main(string[] args)
{
int n = 19691; // число которое надо разложить.
int q = 0;
int x = 1;
int m = Convert.ToInt32(Math.Truncate(Math.Sqrt(n)));
int t = 0;
do
{
q = (m+x)*(m+x) - n;
t = Convert.ToInt32(Math.Truncate(Math.Sqrt(q)));
++x;
}
while ( t*t!=q);
--x;
Console.WriteLine("A = " + (m + x+t).ToString());
Console.WriteLine("B = " + (m + x-t).ToString());
Console.ReadLine();
}
}
}
Приложение №2. Демонстрация работы с алгоритмом RSA
unit mod_high;
interface
uses
mp_types,
mp_base,
mp_numth,
mp_supp,
mp_real,
SysUtils;
Const n_module = 20; { number of modules }
n_f=5;
k_f=10;
Type FareaBinary = record
Nom:mp_int;
por:longint; // 10^por
end;
Type ModType = record
arr_module:array [0..n_module] of longint;
numFloat:mp_float; // budem poka tak delat
end;
type
NePozicionnay_Systema_Schislenia=object
public
Modules:array [0..n_module] of longint;
P_long:mp_int;
P_float:mp_float;
Bazis: array [0..n_module] of mp_int;
Bazis_float:array [0..n_module] of mp_float;
Bazis_P_float:array [0..n_module] of mp_float;
procedure Init;
procedure Add(A:ModType;B:ModType;var C:ModType);
procedure Sub(A:ModType;B:ModType;var C:ModType);
procedure Mul(A:ModType;B:ModType;var C:ModType);
function IsRound(A:ModType):boolean; {if true then we need round, false not}
procedure ConvertPSStoMSS(A:FareaBinary; var C:ModType);
procedure ConvertMSStoPSS(C:ModType; var A:FareaBinary);
private
// real 2.9e-39..1.7e38 11 разрядное число в десятичной системе счисления
Function Obratnoe(A:LongInt;Module1:LongInt):LongInt;
end;
implementation
procedure NePozicionnay_Systema_Schislenia.AddModFloat(MA:ModFloat;MB:ModFloat; var MC:ModFloat);
var B:double;
i:word;
begin
if (Ma.por = MB.por)
then
begin
Mc.por:=Ma.por;
MC.mant:=MA.mant+MB.mant;
end;
if (Ma.por > MB.por)
then
begin
Mc.por:=Ma.por;
{ 10^(Ma.por-MB.por)}
{delim mantissu na eto chislo}
if (Ma.por-MB.por)>324
then
begin
MC.mant:=MA.mant;
exit;
end
else
begin
MC.mant:=(MB.mant/exp((Ma.por-MB.por)*ln(10)))+MA.mant;
end;
end;
if (Ma.por < MB.por)
then
begin
Mc.por:=MB.por;
{ 10^(Ma.por-MB.por)}
{delim mantissu na eto chislo}
if (MB.por-MA.por)>324
then
begin
MC.mant:=MB.mant;
exit;
end
else
begin
MC.mant:=(MA.mant/exp((MB.por-MA.por)*ln(10)))+MB.mant;
end;
end;
if Abs(MC.mant)>1 then
{delim na 10}
begin
B:=MC.mant;
i:=0;
while (abs(B)>=1)
do
begin
B:=B*0.1;
inc(i);
end;{end of while}
MC.por:=Mc.por+i;
MC.mant:=B;
exit;
end; {end of if}
if Abs(MC.mant)<0.1 then
{umnohaem na 10}
begin
B:=MC.mant;
i:=0;
while (abs(B)<0.1)
do
begin
B:=B*10;
inc(i);
end;{end of while}
MC.por:=MC.por-i;
MC.mant:=B;
exit;
end; {end of if}
end; {end of procedure}
procedure NePozicionnay_Systema_Schislenia.ConvertPSStoMSS(A:FareaBinary; var C:ModType);
var i:word;
j:longint;
bufLong,Pi_long:mp_int;
str_temp:string;
nu,nu2,nu3:longint;
z64:Int64;
begin
mp_init2(bufLong,bufLong2);
mp_set_int(bufLong2,Modules[1]); // Set a to a longint
mp_mod(A.Nom,bufLong2,bufLong); // Calculate c = a mod b, 0 <= c < b
// вычисляем базисы
// Bi = (P/Pi)*mi
// mi = ((P/Pi) mod Pi)^-1
mp_init3(mi_long,nu_long,Pi_long);
for i:=1 to n_module do begin
mp_set_int(Pi_long,Modules[i]);
mp_mod(A.Nom,Pi_long,bufLong); // bufLong = A.Nom mod Modules[i]
str_temp:=mp_decimal(bufLong);
//writeln(str_temp);
nu:=StrToInt(str_temp); // nu =A.Nom mod Modules[i]
nu2:=1;
for j:=1 to por do
nu2:= (nu2*10) mod Modules[i]; // nu2 = (10^por) mod Modules[i];
nu3:=Obratnoe(nu2,Modules[i]); // nu3 = (10^por)^-1 mod Modules[i];
z64:=Int64(nu3)*Int64(nu);
C.arr_module[i]:=((z64 mod Modules[i])+Modules[i]) mod Modules[i];
end;
// preobrazuem v mp_float
mpf_set_default_prec(120); // k primeru
{for i:=1 to n_module do
C[i]:=A mod modules[i];}
end;
procedure NePozicionnay_Systema_Schislenia.ConvertMSStoPSS(C:ModType; var A:FareaBinary );
var i:word;
Ci_long,z_long,z2_long,Sum_long,nu_long:mp_int;
str_temp:string;
nu:Longint;
begin
{mp_init3(Sum_long,Ci_long,z_long);
mp_init2(z2_long,nu_long);
mp_set_int(Sum_long,0);
for i:=1 to n_module do
begin
mp_set_int(Ci_long,C[i]);
mp_mul(Ci_long,Bazis[i],z_long); // c[i]*B[i]
mp_add(z_long,Sum_long,z2_long);
mp_copy(z2_long,Sum_long); // sum = sum + c[i]*B[i]
end;
//C[i]:=A mod modules[i];
mp_mod(Sum_long,P_long,nu_long);
str_temp:=mp_decimal(nu_long);
nu:=StrToInt(str_temp);
A:=nu;}
end;
Function NePozicionnay_Systema_Schislenia.Obratnoe(A:LongInt;Module1:LongInt):LongInt;
var x,y,q:array[1..3] of LongInt; { Locals array for the sheet }
i,it:word; { it-number of iterations }
begin
if A=1 then begin Result:=1;Obratnoe:=Trunc(Result); exit; end;
{ | p 0 | | x1 y1 | Input data
{ | A 1 | | x2 y2 | }
x[1]:=Module1;
y[1]:=0;
x[2]:=A;
y[2]:=1;
q[3]:=x[1] div x[2];
{ Local iterations:
|x1 y1|
[1,-q3]*|x2 y2| = [x3,y3]= [1*x1-q3*x2,1*y1-q3*y2] }
x[3]:=(1*x[3-2]-q[3]*x[3-1]);
y[3]:=(1*y[3-2]-q[3]*y[3-1]);
it:=1; { Num of iter.=1 }
repeat
{ (x1,y1)=(x2,y2), (x2,y2)=(x3,y3) }
for i:=2 to 3 do begin x[i-1]:=x[i];y[i-1]:=y[i]; end;
it:=it+1; { Inc num of iter. }
q[3]:=x[1] div x[2]; { New value of q=x1\x2 }
x[3]:=(1*x[3-2]-q[3]*x[3-1]);
y[3]:=(1*y[3-2]-q[3]*y[3-1]);
until x[3]=0; { the final conditions of iterations }
if (y[2]<0) then Result:=Module1+y[2]
else Result:=y[2];
Obratnoe:=Result;
end;
Procedure NePozicionnay_Systema_Schislenia.Init;
var s,t,z:mp_float;
i:word;
Pi_long,z_long,mi_long,nu_long:mp_int;
nu:longint;
byte_number:word;
str_temp:string;
Pi_float,z_float:mp_float;
begin
Modules[10]:=1000000-17;
Modules[9]:=1000000-21;
Modules[8]:=1000000-39;
Modules[7]:=1000000-41;
Modules[6]:=1000000-47;
Modules[5]:=1000000-69;
Modules[4]:=1000000-83;
Modules[3]:=1000000-93;
Modules[2]:=1000000-117;
Modules[1]:=1000000-137;
Modules[20]:=9999991;
Modules[19]:=9999973;
Modules[18]:=9999971;
Modules[17]:=9999943;
Modules[16]:=9999937;
Modules[15]:=9999931;
Modules[14]:=9999929;
Modules[13]:=9999907;
Modules[12]:=9999901;
Modules[11]:=9999889;
{uses high precision computation to compute P}
// P_long - произведение модулей
mp_init3(P_long,Pi_long,z_long);
mp_set_int(P_long,1);
for i:=1 to n_module do
begin
mp_set_int(Pi_long,Modules[i]);
mp_mul(P_long,Pi_long,z_long);
mp_copy(z_long,P_long);
end;
writeln( mp_decimal(P_long));
writeln( mp_radix_size(P_long,10));
// 2^ x = 10^mp_radix_size(P_long,10)
// x = mp_radix_size(P_long,10) * ln(10)/ln(2);
//writeln(mpf_todouble(P_float));
//mp_todouble
// вычисляем базисы
// Bi = (P/Pi)*mi
// mi = ((P/Pi) mod Pi)^-1
mp_init2(mi_long,nu_long);
for i:=1 to n_module do begin
mp_set_int(Pi_long,Modules[i]);
mp_div(P_long,Pi_long,z_long); // z_long = P/Pi
mp_mod(z_long,Pi_long,nu_long); // nu_long = P/Pi mod Modules[i]
str_temp:=mp_decimal(nu_long);
//writeln(str_temp);
nu:=StrToInt(str_temp); // nu
nu:=Obratnoe(nu,Modules[i]); // nu = nu^-1;
mp_set_int(nu_long,nu);
mp_mul(nu_long,z_long,Bazis[i]);
end;
// Копируем int в float
// ну это чтобы вместить весь Р
mpf_set_default_prec(trunc(mp_radix_size(P_long,10) * ln(10)/ln(2))+1);
// а мне надо только n_f+k_f+1 но только для конечного результата;
//mpf_set_default_prec(trunc((n_f+k_f+1) * ln(10)/ln(2))+1);
mpf_initp3(P_float,Pi_float,z_float,mpf_get_default_prec);
mpf_set_ext(P_float,0);
mpf_add_mpi(P_float,P_long,z_float);
mpf_copy(z_float,P_float); // P_float - произведение модулей
for i:=1 to n_module do
mpf_initp(Bazis_float[i],mpf_get_default_prec);
// вычисляем Bazis_P_float с точностью n_f+k_f+1
// Bazis_P_float = Bazis_float / P_float
mpf_set_default_prec(trunc((n_f+k_f+1) * ln(10)/ln(2))+1);
//mpf_set_default_prec(trunc((2) * ln(10)/ln(2))+1);
for i:=1 to n_module do
begin
mpf_initp(Bazis_P_float[i],mpf_get_default_prec);
mpf_set_ext(z_float,0);
mpf_add_mpi(z_float,Bazis[i],Bazis_float[i]);
mpf_div(Bazis_float[i],p_float,Bazis_P_float[i]);
// for checking
//mpf_div(Bazis_float[i],p_float,z_float);
//writeln(mpf_todouble(Bazis_P_float[i]),' ',mpf_todouble(z_float) );
end;
//readln;
NSS.ConvertPSStoMSS(A:FareaBinary; var C:ModType);
end;
procedure NePozicionnay_Systema_Schislenia.Add(A:ModType;B:ModType;var C:ModType);
var i:word;
begin
{ for i:=1 to n_module do C[i]:=(A[i]+B[i]) mod Modules[i];}
end;
procedure NePozicionnay_Systema_Schislenia.Sub(A:ModType;B:ModType;var C:ModType);
var i:word;
begin
{ for i:=1 to n_module do C[i]:=(A[i]-B[i]+Modules[i]) mod Modules[i];}
end;
procedure NePozicionnay_Systema_Schislenia.Mul(A:ModType;B:ModType;var C:ModType);
var i:word;
z:Int64;
begin
{ for i:=1 to n_module do
begin
z:=Int64(A[i])*Int64(B[i]);
C[i]:=z mod Modules[i];
end;}
end;
function NePozicionnay_Systema_Schislenia.IsRound(A:ModType):boolean; {if true then we need round, false not}
var i:word;
begin
end;
end.
__________________________
Научный руководитель
____________(Фамилия И.О.)
Научный консультант (при необходимости)
____________(Фамилия, И.О.)
Руководитель программы
____________(Фамилия, И.О.)
Нормоконтроль пройден:
2. О. А. Логачёв, А. А. Сальников, С. В. Смышляев, В. В. Ященко. Булевы функции в теории кодирования и криптологии. Издание второе, дополненное. МЦНМО, М., 2012.
3. Б. Шнайер. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си. Издательство ТРИУМФ, М., 2002.
4. Х. К. А. ван Тилборг. Основы криптологии. Профессиональное руководство и интерактивный учебник. Мир, М., 2006.
5. Н. П. Варновский. Математическая криптография. Несколько этюдов. Московский университет и развитие криптографии в России. Материалы конференции в МГУ 17–18 октября 2002 г., МЦНМО, М., 2003, с. 98–121.
6. O. Goldreich. Foundations of cryptography. Volume 1 (Basic tools). Volume 2 (Basic applications). Cambridge University Press, Cambridge, United Kingdom, 2001 (v. 1), 2004 (v. 2).
7. Pseudorandomness and cryptographic applications. Princeton University Press, Princeton, New Jersey, 1996.
8. С.М. Авдошин, А.А. Набебин. Дискретная математика. Модулярная алгебра, криптография, кодирование. – М.: ДМК Пресс, 2017. -352 с.
Вопрос-ответ:
Зачем нужна криптография данных?
Криптография данных используется для защиты информации от несанкционированного доступа и использования. Она обеспечивает конфиденциальность, целостность и аутентичность данных.
Какая криптосистема считается самой стойкой?
Не существует абсолютно стойкой криптосистемы, однако одной из наиболее стойких считается криптосистема RSA, которая использует сложные математические алгоритмы для шифрования и расшифрования данных.
Как работает алгоритм шифрования RSA?
Алгоритм шифрования RSA работает на основе факторизации больших простых чисел. Он генерирует публичный и приватный ключи, которые используются для шифрования и расшифрования данных. Публичный ключ можно размещать в открытом доступе, а приватный ключ должен быть защищен от посторонних.
В чем отличие цифровой подписи RSA от обычной подписи?
Цифровая подпись RSA используется для подтверждения подлинности и неподменности данных. Она генерируется с использованием приватного ключа, а проверяется с помощью публичного ключа. Обычная подпись, например, ручная, требует физического присутствия подписывающего.
Как разработать программу для RSA шифрования?
Для разработки программы для RSA шифрования необходимо выбрать язык программирования, который поддерживает операции с большими числами. Затем нужно реализовать алгоритм генерации ключей, алгоритм шифрования и алгоритм расшифрования с использованием математических операций, таких как возведение в степень по модулю и нахождение обратного элемента.
Какие возможности предоставляет криптография данных?
Криптография данных предоставляет возможность защитить информацию от несанкционированного доступа, обеспечить ее конфиденциальность, целостность и аутентичность.
Что такое криптосистема RSA?
Криптосистема RSA - это асимметричный алгоритм шифрования, который использует пару ключей: открытый и закрытый. Открытый ключ используется для шифрования данных, а закрытый ключ - для расшифровки.
Как работает алгоритм шифрования RSA?
Алгоритм шифрования RSA работает следующим образом: отправитель использует открытый ключ получателя для шифрования сообщения, после чего получатель использует свой закрытый ключ для расшифровки сообщения и получения исходного текста.