Автор работы: Пользователь скрыл имя, 24 Мая 2010 в 03:27, Не определен
ВВЕДЕНИЕ 3
Глава 1. Система открытого распределения ключей 4
1.1. История создания системы распределения ключей. 4
1.2. Система распределение ключей Диффи-Хеллмана 6
1.3. Описание средств разработки. 7
Глава 2. Программная реализация открытого распространения ключей Диффи-Хеллмана. 9
2.1. Математические основы алгоритмов используемых в работе. 9
2.1.1. Сложение и вычитание 9
2.1.2. Умножение «в столбик». 10
2.1.3. Возведение целого числа в квадрат. 12
2.1.4. Деление. Вычисление остатка. 13
2.1.5. Тест Рабина— Миллера 16
2.1.6. Модульное возведение в степень 18
2.1.7. Генерация простого числа 20
2.1.8. Разложение числа на простые множители. 23
2.1.9. Нахождение первообразного корня. 24
Глава 3. Оценка алгоритма. 27
3.1. Оценка стойкости алгоритма. 27
3.2. Оценка скорости работы алгоритма. 27
ЗАКЛЮЧЕНИЕ 29
Литература. 30
if ( int(pole[r])==0) c[0]=1;
else
for(i=0;i<=
c[i]=
}
for(k=r-1;k>=0;k--){
step2(c,d);
for(t=31;t>=0;t--) c[t]=d[t];
if(int(pole[k])==
mult_mod(c,osn,d);
for(t=31;t>=0;t--) c[t]=d[t];
}
}
}
Существуют
различные алгоритмы генерации
простых чисел. Многие из них вырабатывают
числа, обладающие специальными свойствами.
Рассмотрим способ генерации, использующий
вероятностные алгоритмы
Алгоритм 7 Генерация простого числа, [Молдовян Н.А. и др., 2004].
Вход. Разрядность к искомого числа р ; параметр t ≥ 1
Выход. Число р, простое с вероятностью не менее
1. Сгенерировать случайное k-битное число
2. Положить bk=1 , b0=1
3. Проверить, что р не делится на простые числа 3, 5, 7, ...,251 .
4. Для i = 1,2, ..., t выполнить следующие действия.
4.1. Выбрать случайное число а, 2 < а <р - 2.
4.2. Проверить число р тестом Миллера-Рабина для основания а. Если число р не прошло тест, то p = p+2 и вернуться на шаг 3.
5. Результат: p.
Равенство bk=1 на шаге 2 гарантирует, что длина числа p в точности равна к бит, равенство b0=1 обеспечивает нечетность числа p.
Код
функции random (генерация простого числа):
void random(unsigned char c[33]){
unsigned int prost[54]={2,3,5,7,…, 241,251};
unsigned char copy_mod[33]={0};
int w,x,i,k,t,s,f,g=2,r,z,flag=0;
srand(time(0));
for(i=0;i<=31;i++)
mod[i]=rand(
}//генерация простого числа
mod[0]|=1;
mod[31]|=128; //не четное и 256 бит
st[0]=mod[0]-1;
for(k=1;k<=31;k++)
st[k]=mod[k]
}//st= простое-1
for(w=0;;w++){
for(r=0;r<=31;r++)
copy_mod[r]=
mod2[r]=mod[
}
flag=0;
for(i=0;i<=53;i++){
r=0;
for(k=31;k>=0;k--)
t=mod[k]+(r<
r=t%prost[i]
}//проверка на
делимость на маленькие
if(r==0){//число
flag=1;
break;
}
}
if(flag==0){
x=rabin();//
if(x==1){
for(k=0;k<=
st[0]=
for(f=
}
x=
if(x==
}
if(x!=0){
}
}
for(r=0;r<=
}
s=0;
g=2;
for(k=0;k<=
t=mod[
g=0;
s=t>>
mod[k]
if(s==
}
mod[0]|=1;
mod[31]|=128;
for(k=0;k<=31;k++)
st[0]-=1;
}
}
В ходе реализации понадобилось разложить большое число на простые множители один из которых является большим.
Алгоритм 8 Разложение числа на простые множители, [Молдовян Н.А. и др., 2004].
Вход. Раскладываемое число n.
Выход. Число не раскладывается на простые множители (с большим простым множителем); число раскладывается на q1 , q2 ,…, qk - различных простых делителя.
1. Создание ряда простых чисел p1=2 ,p2= 3,…, p844= 6491;
2. Положить t = 0.
3. Для i = 1,2, ...,844 выполнить следующие действия.
3.1. Если w=n/pi целое, t = t + 1, qt = pi;
3.1. Пока w=n/pi целое, n=n/pi .
4. Проверить число n тестом Миллера-Рабина.
Код
функции разложение razlogenie()
int razlogenie(){
int i,r,k,t,x,w,fl=0,counter=0;;
unsigned char p[33]={0};
int mass[300]={0};
unsigned char c[33]={0};
unsigned
int prost[6900]={2,3,5,7,…,69491,
for(k=0;k<=32;k++) p[k]=mod[k];
p[0]-=1;
for(i=0;i<=6860;i++){
r=0;
for(k=31;k>=0;k--)
t=p[k]+(r<<
c[k]=t/
r=t%prost[i]
}
for(k=0;k<=31;k++) p[k]=c[k];
if(r==0){
for(k=0;k<=
if(fl!=i){
fl=i;
mass[
counte
}
i--;
}
if(r!=0){
for(k=0;k<=
}
}
x=rabin();
if(x==1){
pervoobr(mass);//
}
return x;
}
Утверждение
Пусть q1 , q2 ,…, qk - различные простые делители функции Эйлера от числа п. Для того чтобы число g, взаимно простое с п, было первообразным корнем по модулю п, необходимо и достаточно, чтобы это g не удовлетворяло ни одному из сравнений:
, ,…, .
Алгоритм 9 Нахождение первообразного корня, [Молдовян Н.А. и др., 2004].
Вход. Простое число n, q1 , q2 ,…, qk - различные простые делители функции Эйлера
Выход. Первообразный корень g.
1. Генерация числа 1 < g < n.
2. Для i = 1,2, ...,k выполнить следующие действия.
2.1. Если перейти к шагу 1.
3. Число g первообразный корень по модулю n.
Код
функции pervoobr (нахождение первообразного
корня):
void pervoobr(int mass[300]){
unsigned char g[33]={0};
unsigned char c[33]={0};
unsigned char b[33]={0};
int i,k,t,x,flag;
srand(time(0));
for(i=0;i<=31;i++){
g[i]=mod[i];
mod[i]=mod2[i];
osn[i]=0;
}
for(k=0;k<=1000;k++){
flag=2;
for(i=0;i<=28;i++) osn[i]=rand();
del(mod,g,st);
step(c);
x=rav(c);
if(x!=0){
flag=1;
for(i=0;i<=
c[i]=
for(i=