You are on page 1of 18

2.

Generarea numerelor prime pe k biti


#include "utile.h"
int testeaza(long p)
{
int a[26] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
for(int i = 0; i<25; i++)
{
if(p == a[i])
{ cout << p << "este un numar prim, dar mic";
return 2;
}
if(p%a[i] == 0)
return 0;
}
return 1;
}
int test_Miller_Rabin(long n,long nr_incercari)
{
if(n==2)
return 1;
if(n%2==0)
return 0;
for(;nr_incercari>0;nr_incercari--)
{ long s=0,t=n-1,b= rand();
b=2+b%(n-2);
while(t%2==0)
{ s++;
t/=2;
}
t=a_la_b_mod_c(b,t,n);//in t pastram acum puterile b^t,b^(2t),...
if(t!=1)
{ while((t!=n-1)&&(--s>0))
{ //testam pentru nr de forma b^((2^r)*t) cu r din multimea {1,2,...,s-1}
t=(t*t)%n;
if(t==1)
return 0;
}
if(t!=n-1)
return 0;
}
}
return 1;
}
void testeaza2(long p, int r)
{
//testam daca p se divide cu numerele prime mici din vectorul a
while(testeaza(p) == 0)
p = p+2;
if(testeaza(p) != 2)
{
if(test_Miller_Rabin(p, r))
cout << p << " a trecut toate testele" ;
else
{
p = p+2;

}
}

testeaza2(p, r);

int main()
{
int k;
long p = 1;
cout << "Dati numarul de biti k ";
cin >> k;
int r;
cout << "Dati numarul de repetari, r, ce vor fi efectuate daca va fi necesar testul M-R ";
cin >> r;
int *v = new int[k];
srand(time(NULL));
//generez numarul impar p de k biti
for(int i = 0; i<k; i++)
v[i] = rand()%2;
v[k-1] = 1;
long d = 2;
for(int i = 1; i<k; i++)
{
p = p+d*v[i];
d = d*2;
}
//testez daca p este prim
testeaza2(p, r);
return 0;
}

3.a. Criptare afina pe blocuri de un caracter. Am folosit analiza frecventelor.


D1GG(A1oh'8gJ(-;o;hb (N'on';(A'( ;hn;(M1G(8GQG(H1H(Gh0'Nh;(8;(N';on;(N;G(GbH'd(g;(8Q;abhn;
(0'no;M;(;g;8;(8G(8;(G'G'(A' ';(vb AGGJ(?h8;d(gbN(;b(A1ohGH(M1GGd(vb A';(;
(8G(Ghg'AbH(gb(AGgG1;o' '(;(GNAGhn'(A'8H' '(0Gh(g;o(a18J(H;o;hb (N;h;d(g;ob
(8g;oH;G;d(8G(A'8H' '(0Gh(g;o(g;0';J(rbA;(g'(71;H;(0'(vb A'(;(;obhg;H(1(Nb
HGN'(0'(A'8H'(A'(0obNd(MGhGJJJ81ox(8;o'(8G(';(0Gh(g;o(8Gd(gb(N;o'(no;M;d(Ghg'A'(;
(8Ho;hn'(A'8H' '(0'(A'(0obNJ(rbA;(g'( Q;(8Ho;h8(no;N;0;d(G (G;d(G (0bg'( ;(vG2bGh;(8;(8G(Ghg'A'(;
(N;hg;d(g;(H;JJJo'QG(N;G('o;(T1;N'x(-1gN;G(g;h0(Ghg'Ab8'(;(N;hg;d(G;g;(vGh'( ;(0;h8;(bo8b
J(Q(Dbh;(N;8;d(gbN;Ho;x(-Gxxx(0;k(g'(N;G(0'(A'8H'(;Gx(r;QNG(8G(NG'd(g;
(H;JJJo'x(NGQG(A1TH;x(Q(?;(N;G(Abh'QHG(A1TH;Qh(gbGbd(gbN;Ho'd(g;(01;o(hb(A'hHob(nb8Hb (;
HbG;(NQ;N(NbhgGH('bJ(r;g;(HGQG(;8;(0'(A1TH;d(0bQH'(8GQHG(N1;G'(g1;0;Qh(M; H;d(g;
(NGh'd(8GQG(;v';(A'8H'(8;(N;h;hgGJ(Q(?hv;H;QN;d(H'(o1nd(gbN;Ho;d(g;
('b(hb(8HGb(gbN(8'(AoGh0'(A'8H' 'J(4HbhgG(vb A';(o;haG(0GhHGG(8G(2G8'W(Q(4
'Gd(gbN;Ho'x(0;k(hb(8HGG(g;(h'v1G;(H'(0bg'(A'(bh0'(hbQHG('(v1G;(8G(H'Qhv;H;
(g'(hGgG(n;h0'8HG!(48gb H;d(gbN;Ho'W(vo'G(8;(N;h;hgG(A'8H'!(rbQH'(0'8;o;( ;(M; H1;n;(g';
(0Gh(N;onGh';(A;0bo'Gd(v;o;QHG(g1;0;Qh(;A;(8G(8H;G(A'( 1gd(T;o;(8;(H'(NG8HGd(A;h;
(0'8Ao'(2Gb;q(;HbhgG(8Nbhg'8H'(v;oH18(8Ao'(N; (8G(;G(8;(8g1HG(1(Nb
HGN'(0'(A'8H'd(A1;H'(Gh01GH(8GQhHo'GH(0'(g;H(;N(8g18('bJ

Boii pornesc. Taranul mergea pe langa boi si-i tot indemna sa mearga mai iute, ca s-ajunga
degraba acasa si sa ieie pelea vulpii. Insa, cum au pornit boii, vulpea a si inceput cu picioarele a
impinge pestele din car jos. taranul mana, carul scartaia, si pestele din car cadea. Dupa ce hoata
de vulpe a aruncat o multime de peste pe drum, bini...sor! sare si ea din car si, cu mare graba,
incepe a strange pestele de pe drum. Dupa ce l-a strans gramada, il ia, il duce la vizuina sa si
incepe a manca, ca ta...re-i mai era foame! Tocmai cand incepuse a manca, iaca vine la dansa
ursul. - Buna masa, cumatra! Ti!!! da' ce mai de peste ai! Da-mi si mie, ca ta...re! mi-i pofta! - Ia
mai pune-ti pofta-n cuiu, cumatre, ca doar nu pentru gustul altuia m-am muncit eu. Daca ti-i asa
de pofta, du-te si-ti moaie coada-n balta, ca mine, si-i avea peste sa mananci. - Invata-ma, te rog,
cumatra, ca eu nu stiu cum se prinde pestele. Atunci vulpea ranji dintii si zise: - Alei, cumatre! da'
nu stii ca nevoia te duce pe unde nu-ti e voia si te-nvata ce nici gandesti? Asculta, cumatre: vrei
sa mananci peste? Du-te desara la baltoaga cea din marginea padurei, vara-ti coada-n apa si stai
pe loc, fara sa te misti, pana despre ziua; atunci smunceste vartos spre mal si ai sa scoti o
multime de peste, poate indoit si-ntreit de cat am scos eu.

3.b. Criptare afina pe blocuri de lungime 2. Si aici am folosit analiza frecventelor.


1TU'u3GwwVSPOyXASPOyY?
TMZNG;Gju(GJaFGB;UX)UJXAxSbHXRGBJlu3OdOuGwKnteY8zvOyVGX,uBGaumGBT8z0u!
Gwagu)ULuEItY?wVItujGwKBG;uQOyGraWuoRSIoX,uSGBTHuSItR!Gku.SzX,a
GSvpuzGwu.TjMhT)agu(KOshYcORumz(SmTCSKX)ZdUbuVOdK(ItuGaaYUGMG;G5uSOLu3K(TvGwu!
KpOyJlMeG,GjuSOySPOyHmTHz(XXLaxjvpuSOLuSIUXfuSOyIUVDOdfxZNX5uSGwaWu(G1GBSPZqY;
OLuta:T)aaSFu:OCGBHXTMwVItu0TjHwObZRJlujX,G,Gju.K1u3OdumG;GBIUumNUVdItu(GBJRI,RSuSI
tR!GJwVSPuSaba9K1I,VBu0T)K(VZZRY8wVItT)umUyU
u(GBZ:KaK1I,OdumOYK1aguQKYKdOyY8u.TuKCuEumGwG,G1OyRSumOYK1K(OduSG1wVIqaqKXum
UJVlKXumaxuSK(MhY;GavYY8umaxu'XASmOdMeOiO6uSOySPuSO,KnSmY?
uQGMumKBU'uQGMK(SPOyJlMeG,Gju.GMGBSPZqY?
u6GwOuGwGjumzIuLUGJgK(Odu(G1GjutGBZqR2OdGBIjX,YtR
O.un4vXXHmTHwVMGObbHRNwVGpIjujO(OyYfGTJqZqRku:OpK(KnwVIUuXISORuyUyHwZ5utGBSFT
HteI:H.GwGNZ(uLUXwVZ.R:GwagKXumGBZ(zIOyOdb9Z.u'a;uzGwumaxuSGBZ(umUaUGOLumGMO
yPrYUKkGBVDGOGdKpOWxS4vItu!KRK(KnuSOyb4JlumGBT8u(GBJqawu:b9X?xSJlu!
XTu3U5GNZ:KduXX)umaOHXRvGwOyOdu(OdKXu3GwuGaOSPumNUZ(YcKGuAVZOyOdIoVBuEuSK(
G,a9ItuoK(IjX,YUOduSaFwVfnItT)shhGpwVSPOyVZXiG1KXumGBZ(umGOZqY;YcK(KnwV;UX)UJXAwVGMaFxS1Oa
Iju'aOSPu3Gau.aWK(VBzIumX,G1MhwVSPOyYhX,uoUJRNwVY8uXJqZ.uQGMu:abxSOduGOpZ(umG1
KCGjumGwK(Y;u.TrOdJlGBJlutGBIjX,YUOdGpTrK(Y8u'XAumXwJquSOyVGTMutGBHtGau3K(TMRxGSu
SOyTHHXTMu3K(SPZqY?
u6GwOuGwGju3abGBSFTHwVY8u'aOLLMhu.KCa9K1Z(uoX)TjItTHVGwVY8u'GBVBu0X6GBSKGjuoG1
GBRSuhGwJRRpJgTjLLT)aguhXAJgTCOLuoK(ItX,uGKnb9T)u!X,SKuSGNRpY?
X5uXumUoO4KnSmOdGOU'wVObXXVDOdumG1KCGjuQaUOdJ;ZNZROWV2X,YcKXuSOyKnu3abGBS
FTHuoG1GNTjJnKCZqRpUrUyaga2uoK(a JlzvOyKkGBObXXMeKOu3K(Y?
X)ZAuoK(JlutGJa9OyObXXMhXzwVY8uyGwY8Z.u3K(SPZqY?
uGaOSPuSRSHrGBJgTjLLMhuGO9OyOduBabZqRpItV2R Oc

Apoi dar, mai ramai sanatoasa, matusa Marioara! vorba de dinioarea; si-mi pare rau ca nu-i varul
Ion acasa, ca tare-as fi avut placere sa ne scaldam impreuna... Dar in gandul meu: stii c-am
nimerit-o? bine ca nu-s acasa; si, de n-ar veni degraba, si mai bine-ar fi!... si, scurt si cuprinzator,
sarut mana matusei, luandu-mi ziua buna, ca un baiat de treaba, ies din casa cu chip ca ma duc
la scaldat, ma supuresc pe unde pot si, cand colo, ma trezesc in ciresul femeii si incep a carabani
la cirese in san, crude, coapte, cum se gaseau. si cum eram ingrijit si ma sileam sa fac ce-oi face
mai degraba, iaca matusa Marioara, c-o jordie in mana, la tulpina ciresului. -Dar bine, ghiavole,
aici ti-i scaldatul? zise ea, cu ochii holbati la mine; coboara-te jos, talharule, ca te-oi invata eu!
Dar cum sa te cobori, caci jos era prapadenie! Daca vede ea si vede ca nu ma dau, zvarr! de vro
doua-trei ori cu bulgari in mine, dar nu ma chiteste. Apoi incepe a se aburca pe cires in sus,
zicand: Stai, mai porcane, ca te captuseste ea, Marioara, acus! Atunci eu ma dau iute pe-o
creanga, mai spre poale, si odata fac zup! in niste canepa, care se intindea de la cires inainte si
era cruda si pana la brau de nalta. si nebuna de matusa Marioara, dupa mine, si eu fuga
iepureste prin canepa, si ea pe urma mea, pana la gardul din fundul gradinii, pe care neavand
vreme sa-l sar, o cotigeam inapoi, iar prin canepa, fugind tot iepureste, si ea dupa mine pana-n
dreptul ocolului pe unde-mi era iar greu de sarit; pe de laturi iar gard, si harsita de matusa nu ma
slabea din fuga nici in ruptul capului!

//cu acest program analizez frecventele dintr-un text dat


#include "Header.h"
int main()
{
ifstream in("sursa.txt");
ofstream out("destinatie.txt");
citeste_alfabet();
char c[5000];
int nr = 0;
struct bloc
{
char c1, c2;
int f;
};

while(in >> noskipws >> c[nr])


{
nr++;
in >> noskipws >> c[nr];
nr++;
}
cout << nr << endl;
bloc *v;
v = new bloc[nr/2];
v[0].c1 = c[0];
v[0].c2 = c[1];
v[0].f = 1;
int k = 0;

for (int i = 2; i < nr; i=i+2)


{
int test = 0;
for (int j = 0; j <= k; j=j+1)
{
if(v[j].c1 == c[i] && v[j].c2 == c[i+1])
{
v[j].f = v[j].f+1;
test = 1;
}
}
if(test == 0)
{
k++;
v[k].c1 = c[i];
v[k].c2 = c[i+1];
v[k].f = 1;
}
}
for (int i=0; i<=k; i++)
{

for (int j=i+1; j<=k; j++)

if (v[i].f > v[j].f)


{ bloc temp;
temp = v[i];
v [i] = v[j];
v [j] = temp;
}
}
for (int j = 0; j <= k; j=j+1)
{
out << v[j].c1 << v[j].c2 << " --> " << v[j].f << "\n";
}

in.close();
out.close();
return 0;

//cu acest program gasesc cheia de decriptare si decriptez textul.


#include "utile.h"
int main()
{
ifstream in("sursa.txt");
ofstream out("destinatie.txt");
citeste_alfabet();
char c[2000];
int nr = 0;
struct bloc
{
char c1, c2;
int f;
};

while(in >> noskipws >> c[nr])


{
nr++;
in >> noskipws >> c[nr];
nr++;
}
//acum cautam cheia
//c1c2, c3c4, c5c6 sunt blocurile de caractere care sunt criptate in d1d2, d3d4, d5d6
int c1, c2, c3, c4, c5, c6, d1, d2, d3, d4, d5, d6;
int a1, a2, a3, a4, b1, b2; //necunoscutele. Ele dau matricile de criptare
//am pus in h[i] cele mai frecvente blocuri de doua caractere din limba romana, iar in g[i] cele
mai frecvente caractere din textile criptat
bloc h[5];
h[0].c1 = 'a'; h[0].c2 = ' ';
h[1].c1 = ' '; h[1].c2 = 's';
h[2].c1 = 'e'; h[2].c2 = ' ';
h[3].c1 = ' '; h[3].c2 = 'c';
h[4].c1 = 'i'; h[4].c2 = ' ';
bloc g[5];
g[0].c1 = 'G'; g[0].c2 = 'B';
g[1].c1 = 'u'; g[1].c2 = 'm';
g[2].c1 = 'O'; g[2].c2 = 'y';
g[3].c1 = 'u'; g[3].c2 = 'S';
//acum, testez toate combinatiile posibile. In fisierul destinatie vor fi o sumedenie de texte,
printre care si cel initial
for (int m = 0; m < 3; m++)
{
for (int n = 0; n < 3; n++)
{
for (int l = 0; l < 3; l++)
{
if(m!=n &&n!=l && m!=l)
{
d1 = da_cod(g[m].c1); d2 = da_cod(g[m].c2);
d3 = da_cod(g[n].c1); d4 = da_cod(g[n].c2);
d5 = da_cod(g[l].c1); d6 = da_cod(g[l].c2);

textul

for (int i = 0; i < 5; i++)


{
for (int j = 0; j <5; j++)
{
for (int k = 0; k < 5; k++)
{
if(i!=j && i !=k && k!=j)
{ c1 = da_cod(h[i].c1); c2 = da_cod(h[i].c2);
c3 = da_cod(h[j].c1); c4 = da_cod(h[j].c2);
c5 = da_cod(h[k].c1); c6 = da_cod(h[k].c2);
//odata ce am fixat c1-c6 si d1-d6 caut formula prin care a fost criptat

int test = 0;
for ( a1 = 0; a1 < N && test == 0; a1++)
{
for ( a2 = 0; a2 < N && test == 0; a2++)
{
for ( b1 = 0; b1 < N && test == 0; b1++)
{
if((c1*a1+c2*a2+b1)%N == d1 &&
(c3*a1+c4*a2+b1)%N == d3 && (c5*a1+c6*a2+b1)%N == d5)
test = 1;
}
}
}
a1--, a2--, b1--;
test = 0;
for ( a3 = 0; a3 < N && test == 0; a3++)
{
for ( a4 = 0; a4 < N && test == 0; a4++)
{
for ( b2 = 0; b2 < N && test == 0; b2++)
{
if((c1*a3+c2*a4+b2)%N == d2 &&
(c3*a3+c4*a4+b2)%N == d4 && (c5*a3+c6*a4+b2)%N == d6)
test = 1;
}
}
}
a3--, a4--, b2--;
//am gasit formula de criptare. urmeaza sa gasesc formula de
decriptare.
int det, det_1;
det = (a1*a4-a2*a3)%N;
while(det<0)
det = det+N;
for (int i = 0; i < N; i++)
{
if(i*det%N == 1)
det_1 = i;
}
test = a1;
a1 = a4*det_1%N;
a4 = test*det_1%N;

a2 = (-1)*det_1*a2%N;
a3 = (-1)*det_1*a3%N;

//am pus cheia de decriptare in a1, a2, a3, a4, b1, b2


//acum avem cele necesare pt decriptare
for (int i = 0; i < nr; i = i+2)

out << da_caracter(a1*(da_cod(c[i])-b1)+a2*(da_cod(c[i+1])b2)) << da_caracter(a3*(da_cod(c[i])-b1)+a4*(da_cod(c[i+1])-b2));


}
out << endl << endl;

}
}

}
}
}

}
}
in.close();
out.close();
return 0;

}3.c.Criptare folosind criptosistemul Vigenere


j2Llr?3SszGjzNti6y(N4izeKw:B6sr;wBte8x:zvpvN(qGhvN4GnvKz0Bv3x85q6?uyLtn?
tu(iGgrN7mGy4N(14ez7NB6s(N5GnwKz0B4e3u(BnwrNvmGy323q6?z7LnnxrNwqI?
tuLi6y4w0Bpe4xLuLeK5:i6?t
Ljvrz:6z7pNNkqGwrN52Gg8yvm6mKwsB0yK60GnqK;0v7xKw:3nr( 3BqiK36qGtr7sBzezNvmLe680D
Gtv7)z7?tuLi5eKu4Bss9;Lm7'K)sjqe(89B5mK:)i6s870kGprN;w4frN0vGjv5:tGqv
MB5mK7:BpeK6sBye)xNBpet2LtnyuuQqGjr;s'Gt825B5s37Lv7?ty9mnqKxwunrtu9mI?
uuuiGqrN(k7pr6NB0yK6sqGe9;wx6e3N(iLqzNvmn?r5)qv!K:0Bpe4xLm4eKxwBset )
Bpi:uL14irvsDGsKwsuGvr)wiz?uyLxrCrws0n-KmQi2szN4iv?r.wiz?92LiyxvNt20y82JBpe4xLun?2
sBpm4y;iGg)N9i7pMN726m4uL14irvsBsetysBpyK60vr!Kwsvq?
3uLt7eKw:Bom42(w4y2PLvvgzNs1nxrMLqnvKwsvq?3uLtnwrNvq0?tu72y?3y:DGjrwwiz?
tu)mLsKx9ity(uLlr?()wj7w5u9iGgrNskrirPLlr?42uqGwwu51n?
eu(1nwzuNBv3su;q6sr)wiGhvN614e:uNB0yKy9iGm4N(1nvvNsB1?
uy(nngvNu2Gx5;Lurw(y(2ty2NwqH?g8;m5xvuLkrirLLc0?4yt20?r):vpC5N7qnx8uLq0?
su31n'K:0B:ityLk7qz7)qGrP8Lx1xK:uwnxvOLQ0?9zsz5m(PLkr?3u0Bnxr;sB8s8vsB2i4;92Grz60kn?
(8s1nBKcsDGe3Nxw5xK:0BryMN0vGp)6wiGe9;sDGy4Ntw6?t LwplzPLwGf)ws1n?
uyLp7qrN0v5yw5w1vxrNvq0?Y 42yi9;0DGgr)wB0mt2Ln4y38(B2e4uLtn?u8:i:it2Llr?
r70DGrzw0BpyK60v6iK9svn?2uL14iz-wkv?92LvvgzNtwte(N7i0eK5sB2e():7rgzN52GqPu4Bset )
CGHr)L0v?9u9ip?r:sBpeK25Bnr)5Lipi9;sDGgrN0vGe4
3B6vvw:1GwzNuiGhvNui0hK::v6'K70kvsuu)iGrPu4Bss9;OB

Si de m-ar fi batut mama cu toate gardurile si de m-ar fi izgonit de la casa ca pe un strain, tot nas fi ramas asa de umilit in fata ei, ca atunci cand m-a luat cu binisorul! Si sa nu credeti ca nu miam tinut cuvantul de joi pana mai de-apoi, pentru ca asa am fost eu, rabdator si statornic la
vorba in felul meu. si nu ca ma laud, caci lauda-i fata: prin somn nu ceream demancare, daca ma
sculam, nu mai asteptam sa-mi dea altii; si cand era de facut ceva treaba, o cam raream de peacasa. S-apoi mai aveam si alte bunuri: cand ma lua cineva cu raul, putina treaba facea cu mine;
cand ma lua cu binisorul, nici atata; iar cand ma lasa din capul meu, faceam cate-o draguta de
trebusoara ca aceea, de nici sfanta Nastasia, izbavitoarea de otrava, nu era in stare a o desface
cu tot mestesugul ei. Povestea ceea: Un nebun arunc-o piatra in balta, si zece cuminti n-o pot
scoate. In sfarsit, ce mai atata vorba pentru nimica toata? Ia, am fost si eu, in lumea asta, un bot
cu ochi, o bucata de huma insufletita din Humulesti, care nici frumos pana la douazeci de ani, nici
cu minte pana la treizeci si nici bogat pana la patruzeci nu m-am facut. Dar si sarac asa ca in anul
acesta, ca in anul trecut si ca de cand sunt, niciodata n-am fost!

Metoda de decriptare: Am facut o analiza a frecventelor blocurilor de 2 caractere in textul criptat.


Dupa aceea am analizat intervalele la care apar acele blocuri. Am presupus ca 6 este lungimea
cheii de decriptare. Am impartit textul in 6 siruri, am cautat cel mai repetat caracter, dupa care lam decriptat in .

10

//programul cu care am analizat frecventa blocurilor de 2 caractere


#include "utile.h"
int main()
{
ifstream in("sursa.txt");
ofstream out("destinatie.txt");
citeste_alfabet();
char c[5000];
int nr = 0;
struct bloc
{
char c1, c2;
int f;
};

while(in >> noskipws >> c[nr])


{
nr++;
in >> noskipws >> c[nr];
nr++;
}

bloc *v;
v = new bloc[nr/2];
v[0].c1 = c[0];
v[0].c2 = c[1];
v[0].f = 1;
int k = 0;

for (int i = 1; i < nr; i=i+1)


{
int test = 0;
for (int j = 0; j <= k; j=j+1)
{
if(v[j].c1 == c[i] && v[j].c2 == c[i+1])
{
v[j].f = v[j].f+1;
test = 1;
}
}
if(test == 0)
{
k++;
v[k].c1 = c[i];
v[k].c2 = c[i+1];
v[k].f = 1;
}
}
for (int i=0; i<=k; i++)
{

for (int j=i+1; j<=k; j++)


if (v[i].f > v[j].f)

11

bloc temp;
temp = v[i];
v [i] = v[j];
v [j] = temp;

}
for (int j = 0; j <= k; j=j+1)
{
out << v[j].c1 << v[j].c2 << " --> " << v[j].f << "\n";
}
//am cautat cele mai frecvente grupari de 2 caractere
bloc a, b;
a = v[k];
int p = 0;
for (int i = 1; i < nr; i=i+1)
if(c[i-1] == a.c1 && c[i] == a.c2)
{
out << i-1 << " " << i-1-p << endl;
p = i-1;
}
a = v[k-1];
p = 0;
for (int i = 1; i < nr; i=i+1)
if(c[i-1] == a.c1 && c[i] == a.c2)
{
out << i-1 << " " << i-1-p << endl;
p = i-1;
}
a = v[k-2];
p = 0;
for (int i = 1; i < nr; i=i+1)
if(c[i-1] == a.c1 && c[i] == a.c2)
{
out << i-1 << " " << i-1-p << endl;
p = i-1;
}
in.close();
out.close();
return 0;

12

//programul cu care am cautat cheia si am decriptat


#include"Header.h"
int main()
{
ifstream in("sursa.txt");
ofstream out("destinatie.txt");
citeste_alfabet();
char c[5000], cheie[6];
int nr = 0;

int a[100];
for (int i = 0; i < 100; i++)
{
a[i] = 0;
}
while(in >> noskipws >> c[nr])
nr++;
for (int k = 0; k < 6; k++)
{
//analizez frecventele de pe fiecare "coloana"
for (int i = k; i < nr ; i = i+6)
{
int test = 0;
for (int j = 0; j < N && test == 0; j++)
{
if (c[i] == caracter[j])
{
a[j]++;
test = 1;
}
}
}
int max = 0;
for (int i=0; i<N; i++)
{
if(a[i] > a[max])
max = i;
}
cheie[k] = da_caracter(da_cod(caracter[max])-66);
for (int i = 0; i < N; i++)
{
a[i] = 0;
}

}
for (int i = 0; i < nr; i++)
{
out << da_caracter(da_cod(c[i])-da_cod(cheie[i%6]));
}
in.close();
out.close();
return 0;
}

13

3.d. RSA
Bh4BXCA9VA2qAT(B5IB2IB.;C2UBv'CitDY0AAtC2UB5IAa2Ah.AjpAqPC;EA2qBjgBgPDy4AMpDLr
BlQDv0AAcClrAMJAr0CYKAn3B5IBHrC!UChLDbwAMpA8XDEpCT-D1nAa2Ah.B6?
Bm'DPdA8XDEpA8XBjgC;EA2qBjgAT(B5IBv'B7NAWfBm'Bv'CitDY0AAtBt4C2UDPnAWfCjhAr?
AqPDcADq,AWfC2UC2UAr0CYKBv'B7NAWfBm'AU-C;EB6?Bm'DbwDPdAjpAqPAU-BtuC;EAtIB?
7CneD1nCEVChtCZEBHdB7NAWfBm'DO:B51Bv'B7NAWfBm'AU-CEVChtCZEB?7BXCCTD1nDv0AAcClrAMJC;EA9VB?7CneAqPDv0Ah;D(mAfnAU-CQPBgPDIPDPnBjgBrGB5ICr!
AMpBdeD2gChvDcADPdA2qBKfBgPAS-ChIDEpB6?Bm'DEpCj)Ar?
AqPBgPB6,B5ICV3AMJAr,Ae.AMpAtIBv'CitBt4DIPBgPA8XBKfA,rAr0A:lB5IDEiChtC,kC;EB'IBL5AM
pB!MA9VBkgC,kAn3B5IBHrDukDEpB51Dv0Ah;DbwDPdAKzD:TB5IAoYDukDf;B?
7BXCAtIDEiBIKCBDPdDIPA9VAzTBm'AMpCZEAn3DW,C;2ChtCxuAT(CxEBf3DEpCdcAMpDy4DIPBv'B7NBjgD4dB
5IBjgAMpCZEB?7BL5DEpAKzD:TB5IAoYC!
UBV1BHmDPdCj)An3AfPCgIAOrAMpAsJC,2CQPDEpBpcDf;B?7BL5DEpAjpAqPAU-B?
7Dq,CAAAOrAr,ArWBt4D8'CV3Cv0DLrBXCA2qDPnAWfAMpBjKAn3AWfDPdAKzD:TB5IAOrAMpB
6?Bm'DbwDPdAS-C!UA8XDEpA8XBjgAT(B5IDPnChvA8XDEpBflB2IAr?
AWfBBLAsJBgPCV3Dz7DW,AoYDukDf;ArWDEpAjpAqPAMpDQHAoYDRvBt4C:)BflB2IBgPDCRAM
pA8XDYZBjKD(mBf3DEpBfVA,rC;EBOJDEiBjgBdeAr,BgPAS-Ar,CjhAr?
AqPDPnCAAAOrDPnAWfDRvDPdChtCxuBIkDW,AoYAO'DPdCZEAoMBIKBRlAqPDPdAP3B.bCTCwDDcACy?CbNAMJAr,CV3DPdBfVDPdB51CV3DPdCBA2qC:)ChtCxuCV3CsfBjKAn3AfPCgIBrGAOrArWDEpDM6AWfAOrBv'DkZClsA2qAOrArWDEpCZ
EBgPAS-D1nB?
7BXCAtICV3CsfD1nAn3Bt4Bm'BkgDEpCdcAMpCZEAa2AXMAtzB51Dv0AWfAMpCVqAKzB8gAa?
DEpA2qBv'Ah.B5 B-XDcADPdCdcC2UB5
Ar0CYKAn3BjKDPdBfVDs5AMpAMpAtIDcADs5DPdBOJBgPAoYDkZDEpBjKDLrDr1CV3AWfAOrBg
PCr!CneC,kBgPCZEAtIBkgDEpB0jATvB5IA8XAsJAMpD:TAoWCr!AMpC(lAWfAOrBpj

Amu cica era odata intr-o tara un crai, care avea trei feciori. Si craiul acela mai avea un frate mai
mare, care era imparat intr-o alta tara, mai departata. Si imparatul, fratele craiului, se numea
Verde-imparat; si imparatul Verde nu avea feciori, ci numai fete. Multi ani trecura la mijloc de
cand acesti frati nu mai avura prilej a se intalni amandoi. Iara verii, adica feciorii craiului si fetele
imparatului, nu se vazuse niciodata de cand erau ei. Si asa veni imprejurarea de nici imparatul
Verde nu cunostea nepotii sai, nici craiul nepoatele sale: pentru ca tara in care imparatea fratele
cel mai mare era tocmai la o margine a pamantului, si craia istuilalt la o alta margine. Si apoi, pe
vremile acelea, mai toate tarile erau bantuite de razboaie grozave, drumurile pe ape si pe uscat
erau putin cunoscute si foarte incurcate si de aceea nu se putea calatori asa de usor si fara
primejdii ca in ziua de astazi. Si cine apuca a se duce pe atunci intr-o parte a lumii adeseori dus
ramanea pana la moarte.

14

#include "Header.h"
long l_a_la_b_mod_c(long a, long b, long c1)
{
long p = 1;
a %= c1;
while (b>0)
{
if (b % 2)
p = (p*a) % c1;
a = (a*a) % c1;
b /= 2;
}
return p;
}
long l_modulo(long k, long n){//extindem operatorul modulo (%) si pentru numere negative
if (k<0)k = n - (-k) % n;
if (k >= n) return k%n;
return k;
}
long l_invers(long a, long n){
long q, r, x0 = 1, x1 = 0, copy_n = n;
a = l_modulo(a, n);
while (n != 0)
{
r = n;
q = a / n;
n = a%n;
a = r;
r = x1;
x1 = x0 - q*x1;
x0 = r;
}
if (a == 1)//daca numarul este inversabil
return l_modulo(x0, copy_n);
return -1;//daca numarul nu este inversabil, vom intoarce -1, pentru a putea afisa mesajul
corespunzator
}
int main()
{
citeste_alfabet();
char c[2000], v[2000];
int nr = 0;
ifstream in("sursa.txt");
ofstream out("destinatie.txt");
//a contine primele 5000 de numere prime
int a[1335]={2, 3, 5, 7, 11, 13, 17, 19, 23,
79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131,
181, 191, 193, 197, 199, 211, 223, 227, 229, 233,
283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
409, 419, 421, 431, 433, 439, 443, 449, 457, 461,
523, 541, 547, 557, 563, 569, 571, 577, 587, 593,

15

29, 31, 37, 41,


137, 139, 149,
239, 241, 251,
353, 359, 367,
463, 467, 479,
599, 601, 607,

43, 47, 53, 59,


151, 157, 163,
257, 263, 269,
373, 379, 383,
487, 491, 499,
613, 617, 619,

61, 67, 71, 73,


167, 173, 179,
271, 277, 281,
389, 397, 401,
503, 509, 521,
631, 641, 643,

647, 653, 659, 661, 673,


773, 787, 797, 809, 811,
911, 919, 929, 937, 941,
1033, 1039, 1049, 1051,
1129, 1151, 1153, 1163,
1249, 1259, 1277, 1279,
1367, 1373, 1381, 1399,
1481, 1483, 1487, 1489,
1579, 1583, 1597, 1601,
1693, 1697, 1699, 1709,
1801, 1811, 1823, 1831,
1931, 1933, 1949, 1951,
2039, 2053, 2063, 2069,
2143, 2153, 2161, 2179,
2281, 2287, 2293, 2297,
2383, 2389, 2393, 2399,
2521, 2531, 2539, 2543,
2657, 2659, 2663, 2671,
2731, 2741, 2749, 2753,
2851, 2857, 2861, 2879,
2971, 2999, 3001, 3011,
3119, 3121, 3137, 3163,
3253, 3257, 3259, 3271,
3361, 3371, 3373, 3389,
3499, 3511, 3517, 3527,
3607, 3613, 3617, 3623,
3719, 3727, 3733, 3739,
3851, 3853, 3863, 3877,
3967, 3989, 4001, 4003,
4093, 4099, 4111, 4127,
4229, 4231, 4241, 4243,
4349, 4357, 4363, 4373,
4483, 4493, 4507, 4513,
4621, 4637, 4639, 4643,
4733, 4751, 4759, 4783,
4889, 4903, 4909, 4919,
4999, 5003, 5009, 5011,
5113, 5119, 5147, 5153,
5273, 5279, 5281, 5297,
5413, 5417, 5419, 5431,
5519, 5521, 5527, 5531,
5653, 5657, 5659, 5669,
5783, 5791, 5801, 5807,
5879, 5881, 5897, 5903,
6047, 6053, 6067, 6073,
6173, 6197, 6199, 6203,
6299, 6301, 6311, 6317,
6397, 6421, 6427, 6449,
6569, 6571, 6577, 6581,
6701, 6703, 6709, 6719,
6829, 6833, 6841, 6857,
6961, 6967, 6971, 6977,
7079, 7103, 7109, 7121,
7229, 7237, 7243, 7247,
7393, 7411, 7417, 7433,
7529, 7537, 7541, 7547,
7639, 7643, 7649, 7669,
7757, 7759, 7789, 7793,

677, 683, 691, 701, 709,


821, 823, 827, 829, 839,
947, 953, 967, 971, 977,
1061, 1063, 1069, 1087,
1171, 1181, 1187, 1193,
1283, 1289, 1291, 1297,
1409, 1423, 1427, 1429,
1493, 1499, 1511, 1523,
1607, 1609, 1613, 1619,
1721, 1723, 1733, 1741,
1847, 1861, 1867, 1871,
1973, 1979, 1987, 1993,
2081, 2083, 2087, 2089,
2203, 2207, 2213, 2221,
2309, 2311, 2333, 2339,
2411, 2417, 2423, 2437,
2549, 2551, 2557, 2579,
2677, 2683, 2687, 2689,
2767, 2777, 2789, 2791,
2887, 2897, 2903, 2909,
3019, 3023, 3037, 3041,
3167, 3169, 3181, 3187,
3299, 3301, 3307, 3313,
3391, 3407, 3413, 3433,
3529, 3533, 3539, 3541,
3631, 3637, 3643, 3659,
3761, 3767, 3769, 3779,
3881, 3889, 3907, 3911,
4007, 4013, 4019, 4021,
4129, 4133, 4139, 4153,
4253, 4259, 4261, 4271,
4391, 4397, 4409, 4421,
4517, 4519, 4523, 4547,
4649, 4651, 4657, 4663,
4787, 4789, 4793, 4799,
4931, 4933, 4937, 4943,
5021, 5023, 5039, 5051,
5167, 5171, 5179, 5189,
5303, 5309, 5323, 5333,
5437, 5441, 5443, 5449,
5557, 5563, 5569, 5573,
5683, 5689, 5693, 5701,
5813, 5821, 5827, 5839,
5923, 5927, 5939, 5953,
6079, 6089, 6091, 6101,
6211, 6217, 6221, 6229,
6323, 6329, 6337, 6343,
6451, 6469, 6473, 6481,
6599, 6607, 6619, 6637,
6733, 6737, 6761, 6763,
6863, 6869, 6871, 6883,
6983, 6991, 6997, 7001,
7127, 7129, 7151, 7159,
7253, 7283, 7297, 7307,
7451, 7457, 7459, 7477,
7549, 7559, 7561, 7573,
7673, 7681, 7687, 7691,
7817, 7823, 7829, 7841,

16

719, 727, 733, 739, 743, 751, 757, 761, 769,


853, 857, 859, 863, 877, 881, 883, 887, 907,
983, 991, 997, 1009, 1013, 1019, 1021, 1031,
1091, 1093, 1097, 1103, 1109, 1117, 1123,
1201, 1213, 1217, 1223, 1229, 1231, 1237,
1301, 1303, 1307, 1319, 1321, 1327, 1361,
1433, 1439, 1447, 1451, 1453, 1459, 1471,
1531, 1543, 1549, 1553, 1559, 1567, 1571,
1621, 1627, 1637, 1657, 1663, 1667, 1669,
1747, 1753, 1759, 1777, 1783, 1787, 1789,
1873, 1877, 1879, 1889, 1901, 1907, 1913,
1997, 1999, 2003, 2011, 2017, 2027, 2029,
2099, 2111, 2113, 2129, 2131, 2137, 2141,
2237, 2239, 2243, 2251, 2267, 2269, 2273,
2341, 2347, 2351, 2357, 2371, 2377, 2381,
2441, 2447, 2459, 2467, 2473, 2477, 2503,
2591, 2593, 2609, 2617, 2621, 2633, 2647,
2693, 2699, 2707, 2711, 2713, 2719, 2729,
2797, 2801, 2803, 2819, 2833, 2837, 2843,
2917, 2927, 2939, 2953, 2957, 2963, 2969,
3049, 3061, 3067, 3079, 3083, 3089, 3109,
3191, 3203, 3209, 3217, 3221, 3229, 3251,
3319, 3323, 3329, 3331, 3343, 3347, 3359,
3449, 3457, 3461, 3463, 3467, 3469, 3491,
3547, 3557, 3559, 3571, 3581, 3583, 3593,
3671, 3673, 3677, 3691, 3697, 3701, 3709,
3793, 3797, 3803, 3821, 3823, 3833, 3847,
3917, 3919, 3923, 3929, 3931, 3943, 3947,
4027, 4049, 4051, 4057, 4073, 4079, 4091,
4157, 4159, 4177, 4201, 4211, 4217, 4219,
4273, 4283, 4289, 4297, 4327, 4337, 4339,
4423, 4441, 4447, 4451, 4457, 4463, 4481,
4549, 4561, 4567, 4583, 4591, 4597, 4603,
4673, 4679, 4691, 4703, 4721, 4723, 4729,
4801, 4813, 4817, 4831, 4861, 4871, 4877,
4951, 4957, 4967, 4969, 4973, 4987, 4993,
5059, 5077, 5081, 5087, 5099, 5101, 5107,
5197, 5209, 5227, 5231, 5233, 5237, 5261,
5347, 5351, 5381, 5387, 5393, 5399, 5407,
5471, 5477, 5479, 5483, 5501, 5503, 5507,
5581, 5591, 5623, 5639, 5641, 5647, 5651,
5711, 5717, 5737, 5741, 5743, 5749, 5779,
5843, 5849, 5851, 5857, 5861, 5867, 5869,
5981, 5987, 6007, 6011, 6029, 6037, 6043,
6113, 6121, 6131, 6133, 6143, 6151, 6163,
6247, 6257, 6263, 6269, 6271, 6277, 6287,
6353, 6359, 6361, 6367, 6373, 6379, 6389,
6491, 6521, 6529, 6547, 6551, 6553, 6563,
6653, 6659, 6661, 6673, 6679, 6689, 6691,
6779, 6781, 6791, 6793, 6803, 6823, 6827,
6899, 6907, 6911, 6917, 6947, 6949, 6959,
7013, 7019, 7027, 7039, 7043, 7057, 7069,
7177, 7187, 7193, 7207, 7211, 7213, 7219,
7309, 7321, 7331, 7333, 7349, 7351, 7369,
7481, 7487, 7489, 7499, 7507, 7517, 7523,
7577, 7583, 7589, 7591, 7603, 7607, 7621,
7699, 7703, 7717, 7723, 7727, 7741, 7753,
7853, 7867, 7873, 7877, 7879, 7883, 7901,

7907, 7919, 7927, 7933, 7937, 7949,


8069, 8081, 8087, 8089, 8093, 8101,
8209, 8219, 8221, 8231, 8233, 8237,
8317, 8329, 8353, 8363, 8369, 8377,
8467, 8501, 8513, 8521, 8527, 8537,
8627, 8629, 8641, 8647, 8663, 8669,
8737, 8741, 8747, 8753, 8761, 8779,
8861, 8863, 8867, 8887, 8893, 8923,
9007, 9011, 9013, 9029, 9041, 9043,
9151, 9157, 9161, 9173, 9181, 9187,
9281, 9283, 9293, 9311, 9319, 9323,
9413, 9419, 9421, 9431, 9433, 9437,
9521, 9533, 9539, 9547, 9551, 9587,
9677, 9679, 9689, 9697, 9719, 9721,
9803, 9811, 9817, 9829, 9833, 9839,
9929, 9931, 9941, 9949, 9967, 9973,
10079, 10091, 10093, 10099, 10103,
10169, 10177, 10181, 10193, 10211,
10273, 10289, 10301, 10303, 10313,
10391, 10399, 10427, 10429, 10433,
10501, 10513, 10529, 10531, 10559,
10631, 10639, 10651, 10657, 10663,
10733, 10739, 10753, 10771, 10781,
10861, 10867, 10883, 10889, 10891,
10979, 10987, 10993};

7951, 7963, 7993, 8009, 8011, 8017,


8111, 8117, 8123, 8147, 8161, 8167,
8243, 8263, 8269, 8273, 8287, 8291,
8387, 8389, 8419, 8423, 8429, 8431,
8539, 8543, 8563, 8573, 8581, 8597,
8677, 8681, 8689, 8693, 8699, 8707,
8783, 8803, 8807, 8819, 8821, 8831,
8929, 8933, 8941, 8951, 8963, 8969,
9049, 9059, 9067, 9091, 9103, 9109,
9199, 9203, 9209, 9221, 9227, 9239,
9337, 9341, 9343, 9349, 9371, 9377,
9439, 9461, 9463, 9467, 9473, 9479,
9601, 9613, 9619, 9623, 9629, 9631,
9733, 9739, 9743, 9749, 9767, 9769,
9851, 9857, 9859, 9871, 9883, 9887,
10007, 10009, 10037, 10039, 10061,
10111, 10133, 10139, 10141, 10151,
10223, 10243, 10247, 10253, 10259,
10321, 10331, 10333, 10337, 10343,
10453, 10457, 10459, 10463, 10477,
10567, 10589, 10597, 10601, 10607,
10667, 10687, 10691, 10709, 10711,
10789, 10799, 10831, 10837, 10847,
10903, 10909, 10937, 10939, 10949,

8039, 8053, 8059,


8171, 8179, 8191,
8293, 8297, 8311,
8443, 8447, 8461,
8599, 8609, 8623,
8713, 8719, 8731,
8837, 8839, 8849,
8971, 8999, 9001,
9127, 9133, 9137,
9241, 9257, 9277,
9391, 9397, 9403,
9491, 9497, 9511,
9643, 9649, 9661,
9781, 9787, 9791,
9901, 9907, 9923,
10067, 10069,
10159, 10163,
10267, 10271,
10357, 10369,
10487, 10499,
10613, 10627,
10723, 10729,
10853, 10859,
10957, 10973,

struct pereche{
long n;
long fi;
};
while(in >> noskipws >> c[nr])
{
nr++;
}
//in b am pus toate numerele convenabile pentru n
pereche b[88];
int p = 0;
for (int i = 0; i < 1335; i++)
{
for (int j = 0; j < 1335; j++)
{
if(a[i]*a[j] > 20000 && a[i]*a[j] < 21000 && a[i]*a[j]%10 == 1)
{
b[p].n = a[i]*a[j];
b[p].fi = (a[i]-1)*(a[j]-1);
p++;
}
}
}

long cheie;
for (int i = 0; i < 88; i++)
{
for (int e = 9000; e < 10000 ; e++)
{

17

if(b[i].fi%e != 0)
{
cheie = l_invers(e, b[i].fi);
if(cheie != -1)
{
long t, s;
long c1, c2;
c1 = N*N;
c2 = N;
int n = 0;
for (int m = 0; m < nr; m= m+3)
{
t=
da_cod(c[m])*c1+da_cod(c[m+1])*c2+da_cod(c[m+2]);
//out << t << endl;
s = l_a_la_b_mod_c(t, cheie, b[i].n);
//out << s << "--->"<< s/N << endl;
v[n+1] = da_caracter(s%N);
s=s/N;
v[n] = da_caracter(s);
n = n+2;
}
n = n-1;
int test =1;
for (int m = 0; m < n && test == 1; m++)
{
if('9' == v[m] || v[m] == ')')
test = 0;
}
if(test == 1)
{
for (int h = 0; h < n; h++)
out << v[h];
out << endl;
}
}
}

in.close();
out.close();
return 0;
}

18

You might also like