GRY-Online.pl --> Archiwum Forum

C++ potrzebna pomoc.

18.12.2006
17:32
smile
[1]

asion [ Chorąży ]

C++ potrzebna pomoc.

Moje zadanie polega na napisaniu programu ktory zakodowuje i odkodowuje podany tekst wedlug tej teorii:

Szyfry oparte na mnożeniach (przerzedzone) - polegają na przesunięciu liter alfabetu w prawo o k pozycji, modulo wielkość alfabetu. W przeciwieństwie do szyfrów opartych na alfabetach przesuniętych gdzie podstawą było dodawanie znaku według klucza, tutaj mnoży się każdy znak przez klucz k, zgodnie ze wzorem:
f (x) = a k mod n
przy czym k oraz n są względnie pierwszymi, tak że litery alfabetu tworzą skończony zbiór reszt.
Jeśli za k przyjmiemy 7, to zaszyfrowany alfabet angielski, składający się z 26 znaków numerowanych od 0 do 25, będzie miał postać:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 7 14 21 2 9 16 23 4 11 18 25 6 13 20 1 8 15 22 3 10 17 24 5 12 19
A H O V C J Q X E L S Z G N U B I P W D K R Y F M T

stąd szyfrując słowo : SZYFROWANIE
otrzymujemy: WTMJPUYANEC
Jeśli k i n nie są liczbami względnie pierwszymi, to wielu literom tekstu jawnego będzie odpowiadać ta sama litera tekstu zaszyfrowanego i nie wszystkie litery będą występować w alfabecie szyfru. W powyższym przykładzie, gdzie k = 7, kryptoanalityk może znaleźć pewne ułatwienie wynikające z faktu, iż a = A oraz n = N.


A to moj programik:
#include <cstdlib>
#include <iostream>
#include <iostream.h>
#include <fstream.h>

int przesuniecie;
char tekst[100];
char tekst2[100];
char tekst3[100];
int tekst_r;

void podaj_tekst()

int x,i;
cout<<"Podaj tekst\n";
cin>>tekst;
for (i=100; i>-1; i--)

if (tekst==0)
tekst_r=i;


void zakoduj()

int cyfra,i,cyfra2;
for (i=0; i<tekst_r; i++)

if(tekst=='a')
cyfra=0;
if(tekst=='b')
cyfra=1;
if(tekst=='c')
cyfra=2;
if(tekst=='d')
cyfra=3;
if(tekst=='e')
cyfra=4;
if(tekst=='f')
cyfra=5;
if(tekst=='g')
cyfra=6;
if(tekst=='h')
cyfra=7;
if(tekst=='i')
cyfra=8;
if(tekst=='j')
cyfra=9;
if(tekst=='k')
cyfra=10;
if(tekst=='l')
cyfra=11;
if(tekst=='m')
cyfra=12;
if(tekst=='n')
cyfra=13;
if(tekst=='o')
cyfra=14;
if(tekst=='p')
cyfra=15;
if(tekst=='q')
cyfra=16;
if(tekst=='r')
cyfra=17;
if(tekst=='s')
cyfra=18;
if(tekst=='t')
cyfra=19;
if(tekst=='u')
cyfra=20;
if(tekst=='v')
cyfra=21;
if(tekst=='w')
cyfra=22;
if(tekst=='x')
cyfra=23;
if(tekst=='y')
cyfra=24;
if(tekst=='z')
cyfra=25;
cyfra2=(cyfra*przesuniecie)%26;
if(cyfra2==0)
tekst2='a';
if(cyfra2==1)
tekst2='b';
if(cyfra2==2)
tekst2='c';
if(cyfra2==3)
tekst2='d';
if(cyfra2==4)
tekst2='e';
if(cyfra2==5)
tekst2='f';
if(cyfra2==6)
tekst2='g';
if(cyfra2==7)
tekst2='h';
if(cyfra2==8)
tekst2='i';
if(cyfra2==9)
tekst2='j';
if(cyfra2==10)
tekst2='k';
if(cyfra2==11)
tekst2='l';
if(cyfra2==12)
tekst2='m';
if(cyfra2==13)
tekst2='n';
if(cyfra2==14)
tekst2='o';
if(cyfra2==15)
tekst2='p';
if(cyfra2==16)
tekst2='q';
if(cyfra2==17)
tekst2='r';
if(cyfra2==18)
tekst2='s';
if(cyfra2==19)
tekst2='t';
if(cyfra2==20)
tekst2='u';
if(cyfra2==21)
tekst2='v';
if(cyfra2==22)
tekst2='w';
if(cyfra2==23)
tekst2='x';
if(cyfra2==24)
tekst2='y';
if(cyfra2==25)
tekst2='z';


cout<<"zakodowany tekst: "<<tekst2<<"\n";

void odkoduj()

int cyfra,i,cyfra2;
for (i=0; i<tekst_r; i++)

if(tekst2=='a')
cyfra=0;
if(tekst2=='b')
cyfra=1;
if(tekst2=='c')
cyfra=2;
if(tekst2=='d')
cyfra=3;
if(tekst2=='e')
cyfra=4;
if(tekst2=='f')
cyfra=5;
if(tekst2=='g')
cyfra=6;
if(tekst2=='h')
cyfra=7;
if(tekst2=='i')
cyfra=8;
if(tekst2=='j')
cyfra=9;
if(tekst2=='k')
cyfra=10;
if(tekst2=='l')
cyfra=11;
if(tekst2=='m')
cyfra=12;
if(tekst2=='n')
cyfra=13;
if(tekst2=='o')
cyfra=14;
if(tekst2=='p')
cyfra=15;
if(tekst2=='q')
cyfra=16;
if(tekst2=='r')
cyfra=17;
if(tekst2=='s')
cyfra=18;
if(tekst2=='t')
cyfra=19;
if(tekst2=='u')
cyfra=20;
if(tekst2=='v')
cyfra=21;
if(tekst2=='w')
cyfra=22;
if(tekst2=='x')
cyfra=23;
if(tekst2=='y')
cyfra=24;
if(tekst2=='z')
cyfra=25;
cyfra2=0; //???????????
cout<<cyfra2<<"\n";




int main()

srand (time(NULL));
przesuniecie=rand()%7+2;
int opcja;
do

cout<<"1: Podaj tekst\n2: Zakoduj\n3: Odkoduj\n0: Zakoncz";
cin>>opcja;
if(opcja==1)
podaj_tekst();
if(opcja==2)
zakoduj();
if(opcja==3)
odkoduj();

while (opcja!=0);


Problem jest w odkodowaniu ktore nie jest skonczone. Wydaje mi sie ze jest to kwestia poprawnego ulozenia wzoru tam gdzie sa znaki zapytania. Niestety wymyslic tego wzoru nie potrafie. Pomocy!

18.12.2006
20:48
[2]

aka [ Chorąży ]

Oto moje rozwiazanie tego zadania.

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main()

const int n = 26;
char znaki[n];
int kody[n];
char dec[n];
int k = 7;
int i;
int z;
for(i = 0; i < 26; ++i) ‹//tworzy potrzebne tablice
znaki[ i ] = 65 + i;
z = (i * k) % n;
kody[ i ] = z;
dec[z] = 65 + i;

string slowo;
cin >> slowo;
string coded;

int t;
int size = (int)slowo.length();
for(i = 0; i < size; ++i) ‹ //pętla kodująca
t = toupper(slowo[ i ]) - 65;
coded += znaki[kody[t]];

cout << slowo << endl;
cout << coded << endl;
string decoded;
for(i = 0; i < size; ++i) ‹ //pętla dekodująca
t = toupper(coded[ i ]) - 65;
decoded += dec[t];

cout << decoded << endl;
cout << '\n';
return 0;

© 2000-2021 GRY-OnLine S.A.