42
Бағдарлама дешифрування RSА
#include
#include
#includeStepen (int a,int d,int M) //а d (mоd m)
{ int r=1;(int i=0;i
}NOD (int a, int b) / / опція, що най білу-
{ int r;//більший спільний дільник а, b//(алгоритмі Евкліда)
{if(a
{r=a;a=b;b=r;}=a%b;=r;}(r);b;
}main()
{int x,f x,d 1;e,M,flg,d,fi M;=11*23*17; e=29;//шифравання м параметрін
енгізу=10*22*16;<<"2.2.3)
(NOD(e,fi
M)!=1)cout<
parametry...";{=1;(d*e%fi M!= 1 && d
{cout< < endl< " Vvedit shifrtext:"; > > f x; i=0; {
рет кильте >>d 1; / дешифрлеу++;} (d 1!=d && i<3);(e*d 1%fi M!1) / / қате болса,
бас тартады< < < endl< < " Vu ne znaete klucha!";
{x= Stepen (f x, d 1, M); / / әйтпесе-х=[f(х)] d(mмоd)<
Povidomlennya: "<
} / / / қайта іске асыру: f (х)=х е(mоd m) ();<
0(Ni):";>>flg;
}while(flg);
}<
}
Роботтың нәтижесі (параметрлерде)= 4301= 24parametry...vuhody natusnit
Enter...
Роботтың нәтижесі( жарамсыз кілт) = 4301= 29shifrtext: 1505kluch:
4712kluch:1423kluch:2047ne znaete klucha!? Press 1(Tak) 0(Ni):0vuhody natusnit
Enter...
Роботтандырылған бағдарламаның нәтижесі (врни ключ):
= 4301= 29шифртекст: 1505ключ:2549.: 4207: 1505 = 1505? 1 (Tak) 0(Ni): 1083:
3210 = 3210? 1 (тақ) 0 (Ni): 0 кіріспе...
Бұл мысалда жабық кілт бағдарлама кодында бар және экранға шығады, бұл
қауіпсіздік тұрғысынан өте жақсы емес. Сондықтан жабық кілтті файлға жазып,
оны сол жерден оқу керек. Үлкен қарапайым сандарды генерациялау бағдарламасы
(2.2.2-да сипатталған алгоритмді жүзеге асырады). 2.1 кестесін де қолдануға
болады. 2-ден 3011-ге дейінгі қарапайым сандар
# include
# include
# include
43
# include namespace std; Proverka Deleniem(int N)// / Сан қарапайым
екенін анықтайды
{ int d,r;=2; r=1;((r!=0)&&(d
{ r=N%d;
d++;
}(!r) return 0;//n жай болмаса 0 қайтарады;//N, Егер N - жай болса
}Prostoe chislo () / / қарапайым таңдау функциясы
{ int i, n, R, S; / / сандар
{cout< < endl< "Vvedite isxodnoe prostoe:" >S;//S - кейбір қарапайым
}(!Proverka Deleniem (S);=1;N=0; R=(S-3)*2;//бастап R=(S-3)*2(i)
{ R=R+4;=R*S+1;//іздейміз N түріндегі N=R*S+1(Proverka Deleniem(N))
{
cout<
Press
1(YES)
or
0
(NO)";>i;=N;//жалғастыру үшін N бастапқы ретінде аламыз
}i++;(i>N/4)
{cout<>i;
}
}();N;
}main()
2. Осы бұйрықтың орындалуын бақылау Қазақстан Республикасының вице-
министріне жүктелсін.;
}
Роботтың нәтижесі: қарапайым: 11 = 353-қарапайым.Ұзын? 1 (Иә)немесе
0(Жоқ) түймесін басыңыз 0xdm: 31=1861-қарапайым.Ұзын? 1 (Иә) немесе 0
(Жоқ)басыңыз 0чис: p=353 q=1861
Сонда шифрлау бағдарламасы келесі нәтиже береді:
vidkrutuy kluch:= 656933= 997povodomlennya:
povidomlennya: 287868? Press 1(Tak) 0(Ni):0vuhody natusnit Enter...
Бағдарлама m қарапайым көбейткіштерге Ферма таңдау және факторизация
әдісімен орналастырады:
# include
# include
# includeStepen(int a, int d, int M) / / а d (MOD m)
{ int r=1;(int i=0;i
}NOD (int a, int b) / / най табу функциясы-
{ int r; / / үлкен жалпы бөлгіш а және b / / / (Евклид алгоритмі)
{if(a
44
{r=a;a=b;b=r;}=a%b;=r;}(r);b;
}Pidbor (int M)//іздеу функциясы
{cout< < endl< " Pryamui pidbor:";//m переборомі,p,fi M,count; M=1;=2;
count=0; / / іздеуді бастаймыз и=2< " \nm: "
{if (M%i==0)//егер m мақсатты болса, онда
{p=i; M=M / p; / / M ретінде бөлу нәтижесін аламыз
fi M*=(p-1); i=2; / / φ (m) (и-1)< < p<"*";} / / және қайта және++ аралығын
бастаймыз; / / әрекет саны
}<<"\nfi M: "<
}Ferma (int M)//қарапайым іздеуді іске асыратын функция
{// факторизация арқылы көбейткіштерді <
int,fi M,count;sq,y;
{=pow ((double)x, (double)2) - M; cout< < "\nx^2-m= "
<<"\ny= "
олар тең болса
{cout< " \nm:" <
1)*(x+y int-1);/то m=(х-у)*(х+у);}//а φ(m)=(х-у-1)*(х+у-1)++; x++;
}while(x<=M/2);<<"\nfi M: "<
}main()
{int x,f x;e,M,flg,d, fi M;<<<"Vvedit vidkrutuy kluch:"
cin>>M;//ашық кілтті енгіземіз<"e= "; cin>>e; m=Ferma(M);//m m=Pidbor(M)
көбейткіштерін таңдаймыз; (NOD (e,fi M)!=1)cout<
{=1; / / / φ(m) И е, D(d*e%fi M) табамыз!=1 && d
{cout<<>f x;= Stepen(f x,d,M);//есептейміз х=[f(х)]
d(mоd m)<"Povidomlennya: "
endl; ()/тексереміз: f(Х)=Х е(MOD m)<
0(Ni):";>>flg;
}while(flg);
}<
}
Робот бағдарлама жұмысының нәтижесі:
2-м= 13.0767^2-м = 392= 19.799^2-м= 615= 24.7992^2-м= 840= 28.9828^2-м=
1067= 32.665^2-м= 1296= 36: 11929 = 79 * 151 M: 11700 operaciy: 6pidbar:: 11929 =
79 * 151 M: 11700 operaciy: 228= 2753shifrtext: 10001: 5431: 10001 = 10001?
Басыңыз 1 (тақ) 0 (Ni): 1shifrtext: 6597: 3442: 6597 = 6597? 1 (тақ) 0 (Ni): 0 кіріспе...
Достарыңызбен бөлісу: