Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Dev C++ szyfrowanie/odszyfrowanie


Rekomendowane odpowiedzi

Opublikowano

Witam ostatnio napisałem program do szyfrowania, który przyda się do szyfrowania haseł oraz program do ich odszyfrowania.

Wszystko fajnie, lecz napotkałem się z problemem, którego nie potrafię rozpoznać a mianowicie , po za szyfrowaniu słowa "pogoda" 

litera "p" szyfruje jako spacje(dobrze), a odszyfrowanie "p" powinno przebiegać poprawnie jak z pozostałymi literami lecz tak nie jest

i odszyfrowuje mi na jakąś strzałkę z tablicy ASCII lub inne znaki losowe...  8S

 

Proszę was o zidentyfikowanie błędu/wskazanie go/poprawę kodu źródłowego.

szyfrowanie_odszyfrowanie.rar

Opublikowano

podaj kod na forum (daj w znaczniki

 tu kod [ / code])

napisz bardziej jakiej metody używasz do szyfrowania

Opublikowano

­

 

podaj kod na forum (daj w znaczniki

 tu kod [ / code])
napisz bardziej jakiej metody używasz do szyfrowania
[/quote]
[code=auto:0]#include <iostream>
#include <conio.h>
#include <fstream>
 using namespace std;
 
 int main()
 {
 	string napis;
 	string napis1;
	 fstream plik;
	 plik.open("D:\\cwiczenie1.txt",  ios::out|ios::app);
	 char znak;
	 char x;
	 cout<<"Wpisz tekst: \n";
	 
	do{
		znak=getch();
		cout<<znak;
		x=znak;
		napis1+=znak;
		znak=32+(znak+15-32)%95;
		if(x>=32&&x<=126)
		napis+=znak;

	}while(x>=32&&x<=126);
	
	//zapis
	plik.write( & napis[ 0], napis.length()-1 );
	
	plik.close();
	
	
	cout<<"Tekst po zakodowaniu to: ";
	cout<<napis<<endl;
	cout<<"Wpisany tekst to: "<<napis1<<endl;
		
		
		
	getch();
	return 0;
 }


[/code]
[code=auto:0]#include <iostream>
#include <conio.h>
#include <fstream>
 using namespace std;
 
 int main()
 {
 	string napis;
 	string napis1;
 	string zpliku;
	 fstream plik;
	 plik.open("D:\\cwiczenie1.txt",  ios::in);
	 char znak;
	 char x;

		getline(plik,zpliku);
		cout<<"Tekst z pliku: "<<zpliku<<endl;
		for(int i=0; i<zpliku.length()-1; i++)
		{
		znak=zpliku[i];
		x=znak;
		znak=32+(znak-15-32)%95;
		if(x>=32&&x<=126)
		napis+=znak;
		}

	
	plik.close();
	
	
	cout<<"Tekst po odkodowaniu to: ";
	cout<<napis<<endl;
getch();
return 0;
	
}


;C

 

o8HfXuR.png

CAPSLOCK TEAM - LEPIEJ WIDOCZNI WIDOCZNIE LEPSI

Cała prawda o LittleBlack

Opublikowano

Dziękuje Polish Civil.

NopeDotAvi2 to nie jest dwukrotnie skopiowane, jeden plik odpowiada za kodowania do pliku tekstowego,

drugi plik za odszyfrowanie tekstu z pliku tekstowego zakodowanego już łańcucha znaków.

 

'Metodę' jaką użyłem to: spojrzałem na tablicę ASCII i do każdy pojedynczy znaku jaki pobrałem z klawiatury zamieniłem go o 15 więcej od jego samego.

W rozkodowaniu działania przeciwne do kodowania. Problem w tym, że niektórych zakodowanych znaków nie chce odkodować, a niektóre wręcz przeciwnie 

i robi to z czystą rozkoszą. 

Opublikowano

Program działa "poprawnie" na znakach o kodzie ASCII mniejszym niż 112 (litera p). Przyczyną tych anomalii jest niepoprawne użycie operacji modulo.

 

 

Spójrz na kod szyfrowania znaku:

znak = 32 + (znak + 15 - 32) % 95;

Kompilator interpretuje go w następujący sposób:

znak = 32 + ((znak - 17) % 95);

Teraz wyraźniej widać, że jeśli wartość wyrażenia znak - 17 jest mniejsza od 95, w operacji modulo zwracana jest jego wartość. Problem pojawia się, gdy wyrażenie ma wartość większą lub równą 95 - wtedy wartość całego wyrażenia zawartego w nawiasach będzie mniejsza ( >= 0), co wpłynie na późniejszy proces odszyfrowywania znaku.

 

Można go przedstawić w ten sposób:

znak = 32 + ((znak - 47) % 95);

Przykładowo zaszyfrowana litera o będzie miała kod ASCII równy 126. Po odszyfrowaniu nadal będzie to litera o. Ale już kod ASCII litery p po zaszyfrowaniu będzie równy 32, a po odszyfrowaniu - 17.

 

 

W skrócie: wymyśl inny algorytm lub popraw istniejący (wyrzuć z niego modulo).

Opublikowano

Aranthor  , dziękuję za treściwą odpowiedź.  :)

Mam zamiar poprawić kod, użyje do tego instrukcji warunkowej if(else).

 

Dziękuję i pozdrawiam.

 

~~~~Edytowane:

 

Po dłuższej analizie kodu, wystarczyło zamiast:

znak = 32 + (znak - 15 - 32) % 95;

dać:

znak = 32 + (znak + 80 - 32) % 95;

aby uniknąć liczb ujemnych.  :)  :)  :)

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...