Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pomocy c++ szyfrowanie
Forum PHP.pl > Inne > Hydepark
alvnia
Witam. Mam do napisania program, ktory szyfruje/deszyfruje tekst za pomoca klucza. Zarowno tekst jak i klucz podaje uzytkownik. Szyfrowanie/deszyfrowanie realizujemy za pomoca tablicy 26x26 znakow:

A B C D E F G H I J K L M N O P R S T U W X Y Z
B C D E F G H I J K L M N O P R S T U W X Y Z A
C D E F G H I J K L M N O P R S T U W X Y Z A B
.
.
.
Y Z A B C D E F G H I J K L M N O P R S T U W X
Z A B C D E F G H I J K L M N O P R S T U W X Y

Przykładowe szyfrowanie tekstu LOREM IPSUM DOLOR SIT AMET kluczem PASSWORD:

1. W przypadku gdy klucz jest krotszy od szyfrowanego tekstu, nalezy go powielic:
LOREM IPSUM DOLOR SIT AMET
PASSW ORDPA SSWOR DPA SSWO

2. Szyfrowanie polega na podstawieniu liter tekstu jawnego przez litery z tablicy wg zasady:

a ) litera tekstu jawnego wyznacza kolumnie tablicy
b ) litera klucza wyznacza wiersz

Litera szyfrogramu lezy na przecieciu, przyklad:
LOREM IPSUM DOLOR SIT AMET
PASSW ORDPA SSWOR DPA SSWO
AOJWI WGVJM VGHCI VXT SEAH

3. Deszyfracja polega na wybraniu kolumny tablicy okreslonej poprzez odpowiednia litere klucza, a nastepnie odszukanie w niej litery szyfrogramu. W ten sposob okreslona litera wiersza jest litera tekstu jawnego:
PASSW ORDPA SSWOR DPA SSWO
AOJWI WGVJM VGHCI VXT SEAH
(np.dla pierwszego znaku : w kolumnie P szukamy A, lezy ona w wierszu L-L jest wiec poszukiwana litera)

dodaje ze jestem poczatkujaca i prosze o wyrozumialosc, a to ile udalo mi sie poskladac:






#include <iostream>
#include <cstdlib>

using namespace std;

void szyfruj(char *tekst,int *klucz)
{
int iPrzes;
for (int i=0; tekst[i] != '\0'; i++)
{
tekst[i] = ( tekst[i] + klucz[iPrzes] );
iPrzes ++;
cout << "wpisz tekst:";
cin>>iPrzes;
if(iPrzes == sizeof(klucz)) iPrzes;
break;
}
}
void deszyfruj(char *tekst,int *klucz)
{
int iPrzes;
for (int i=0; tekst[i] != '0'; i++)
{
tekst[i] = ( tekst[i] - klucz[iPrzes] );
iPrzes ++;
cout << "zaszyfrowany tekst:";
cin>>iPrzes;
if(iPrzes == sizeof(klucz)) iPrzes;
break;
}

}

int main(){

char test[30];
int iKlucz[3] ;
szyfruj(test, iKlucz);
cout << test << "\n" ;
deszyfruj(test, iKlucz);
cout << test << "\n" ;
return 0;
system("pause");
}
r4xz
A z czym dokładnie masz problem?
alvnia
wiem juz ze musze stworzyc tablice dynamiczna dwuwymiarowa. teraz zastanawiam sie gdzie powinnam ja umiescic zeby dobrze dzialala. w tych dwoch petlach ? smile.gif
Wazniak96
To zadanie polega na kombinowaniu, jednak potrzeba już w nim trochę tego myślenia jak program i trochę wiedzy. Nie potrzebne są tu praktycznie tablice, poczytaj lepiej o kodowaniu znaków w ANSII i rzutowaniu litery na ANSII i na odwrót.

Ostatnio robiłem podobny program do szyfrowania kluczem, jednak był on trochę mniej skomplikowany. smile.gif

PS: To forum dotyczy PHP i tematów webowych. Nie będę tutaj już podawać linków ale istnieje także forum dotyczące cpp...
Spawnm
Problem jest natury algorytmicznej, język nie ma znaczenia. Więc jak masz coś ciekawego to śmiało się podziel wink.gif
r4xz
Cytat(Spawnm @ 6.12.2014, 15:01:34 ) *
Problem jest natury algorytmicznej, język nie ma znaczenia. Więc jak masz coś ciekawego to śmiało się podziel wink.gif

Ale przecież algorytm jest znany, kwestia przeklejenia do c++ smile.gif
zegarek84
nie potrzebujesz pomocniczej tablicy, po za tym pominęłaś 2 znaki alfabetu ASCII ;p ...
poniżej masz rozwiązanie pierwszej części zadania bez pobierania tekstu i klucza z konsoli jako sposób rozwiązania, jeśli w tekście są też małe litery to ten drugi alfabet jest w tablicy znaków występuje później... dodatkowo w tym rozwiązaniu zakłada się, iż klucz składa się tylko z dużych liter alfabetu - po prostu masz zalążek działającego poprawnie kodu:
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. char znak_koduj(const char old, const char key){
  5. if(key=='A')
  6. return old;
  7. int przesuniecie(key - 'A');
  8. int char_new(old + przesuniecie);
  9. if(char_new > 'Z')
  10. {
  11. char_new -= 'Z';
  12. char_new += 'A';
  13. --char_new;
  14. }
  15. return char(char_new);
  16. }
  17.  
  18. string tekst_koduj(const string &tekst, const string &klucz){
  19. string zakodowany(tekst);
  20. int klucz_length = klucz.length();
  21. int znak_alfabetu_w_tekscie(0);
  22. int tekst_length = tekst.length();
  23. for(int pos(0); pos<=tekst_length; ++pos){
  24. char &c = zakodowany[pos];
  25. if(c>='A' && c<='Z')
  26. {
  27. c = znak_koduj(c, klucz[znak_alfabetu_w_tekscie%klucz_length]);
  28. ++znak_alfabetu_w_tekscie;
  29. }
  30.  
  31. }
  32.  
  33. return zakodowany;
  34. }
  35.  
  36. int main()
  37. {
  38. string klucz = "PASSWORD";
  39. string tekst = "LOREM IPSUM DOLOR SIT AMET";
  40.  
  41. cout << tekst_koduj(tekst, klucz) << endl;
  42.  
  43. cout << "Wciśnij enter aby opuścić program" << endl;
  44. return 0;
  45. }
alvnia
serdecznie dziękuję, to już bardzo dużo smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.