Som besökare på Hamsterpaj samtycker du till användandet av s.k. cookies för att förbättra din upplevelse hos oss. Jag förstår, ta bort denna ruta!
Annons

XOR-kryptering C++

Skapad av kalle-k, 2008-09-02 23:23 i Webbutveckling & Programmering

2 309
8 inlägg
3 poäng
kalle-k
Visningsbild
P 35 Linköping Hjälte 1 213 inlägg
3
Okej. Programmet ska kunna läsa in en sträng från en .txt fil för att sedan kryptera detta och spara till en encrypt.enc och sedan läsa in denna och dekryptera igen. Jag använder mig av XOR-kryptering i C++ och kör Microsoft Visual C++ 2008

Fungerande saker:
Det går att läsa från en .txt fil.
Det går att kryptera strängen.
Det går att dekryptera strängen.
Det går att spara krypterad sträng till fil.
Det går att läsa krypterad sträng från fil.

Icke fungerande saker:
Det går INTE att dekryptera krypterad sträng som är inläst från fil.


Jag förstår mig inte på detta då allt funkar utom kombinationen av läsa in från fil OCH dekryptera.

Ett stycke c#-kod:

#include <iostream>
#include <stdlib.h>
#include <string>
#include <fstream>
using namespace std;

void encrypt(string filename){
string line;
ifstream input(filename.c_str());
if (input.is_open())
{
while(!input.eof())
{
getline (input,line);
cout <<line<<endl;
}
for( int i=0 ; i<line.length() ; i++ )
line[i] = line[i]^129;
input.close();
}


else if(!input)
{
cerr<<"Could not open file";
exit(1);
}
ofstream output;
output.open("encryption.enc");
output << line << endl;
output << flush;
output.close();

for( int i=0 ; i<line.length() ; i++ )
line[i] = line[i]^129;
cout<<"Decrypted Crap Here:"<<line<<endl;

string line;
ifstream input("encryption.enc");
if (input.is_open())
{
while(!input.eof())
{
getline (input,line);
cout <<endl<<line<<endl;
}
for( int i=0 ; i<line.length() ; i++ )
line[i] = line[i]^129;
input.close();
}


else if(!input)
{
cerr<<"Could not open file";
exit(1);
}
cout << "Your decrypted text is :"<<line<<endl;
ifstream input("encryption.enc");
if (input.is_open())
{
while(!input.eof())
{
getline (input,line);
cout <<endl<<line<<endl;
}
for( int i=0 ; i<line.length() ; i++ )
line[i] = line[i]^129;
input.close();
}


else if(!input)
{
cerr<<"Could not open file";
exit(1);
}
cout << "Your decrypted text is :"<<line<<endl;

return;
}

int main(int argc, char *argv[])
{
string filename;
cout<<"Please enter the filename for encryption"<<endl;
getline(cin,filename);

if (!cin) return 0;
encrypt(filename);

system("PAUSE");
return (EXIT_SUCCESS);

}

Ingen status

Är reklamen ivägen? Logga in eller registrera dig så försvinner den!

Martin
Visningsbild
P 38 Göteborg Hjälte 156 inlägg
0
Har du tittat på exakt vad du får för indata när du läser den krypterade filen? Kan det ha smugit sig in någon radbrytning, tabb eller något liknande?

Vad får du för output när du kör programmet? Segfaultar den eller får du bara fel output vid dekrypteringen?

Moodh åt upp min hatt!

kalle-k
Visningsbild
P 35 Linköping Hjälte 1 213 inlägg
Trådskapare
0
Svar till tritone [Gå till post]:
Vid dekrypteringen som inte fungerar så får jag blank output.
Strängen verkar alltså vara tom.

Jag har kontrollerad så att det är samma sträng både före filen skrivits och efter att den lästs in. Den skriver helt enkelt inte ut något alls. Inget mellanrum ens.

Och ja det är bara fel output så att säga. Programmet fungerar i övrigt.


Ingen status

Martin
Visningsbild
P 38 Göteborg Hjälte 156 inlägg
0
Svar till kalle-k [Gå till post]:

Det är samma sträng "på riktigt" (string1 == string2) alltså, inte bara som det ser ut när man tittar på det?

Du deklarerar variabeln line två gånger i encrypt(), gör det någon skillnad om du fixar till det?

Jag är ingen expert på just C++, men när jag tittar på koden så ser det ut som att du bearbetar hela line-variabeln flera gånger om i dina for-loopar (line = line^129). Borde inte det vara något i stil med [code]line[i] = line[i]^129[/code] (eller hur man nu skriver det i C++)?



Tillägg av tritone 2008-09-03 00:03

Okej, formateringen blir trasig i forumet. Du kanske gjorde rätt från början, dvs. fick med hakparenteser och en referens till din counter i koden...

Moodh åt upp min hatt!

kalle-k
Visningsbild
P 35 Linköping Hjälte 1 213 inlägg
Trådskapare
0
Svar till tritone [Gå till post]:
line i encrypt() är ju en sträng medans line i decrypt() är en annan.

Jag läser ju sedan in line från filen. Och det fungerar. Däremot då jag kör decryptkoden på line efter att ha läst från filen så blir det fel.

Det verkar som att något blev fel då jag klistrade in koden.

mja alltså.

for( int i=0 ; i<line.length() ; i++ )
line(i] = line(i]^129;


innebär ju att den börjar på line[0] alltså plats 0 i strängen. Och fortsätter uppåt tills strängen tar slut.

Skriver in koden igen pga att det inte riktigt ser rätt ut. Har dock lagt till lite felsökningsgrejer nu.
Ett stycke C#-kod:

#include <iostream>
#include <stdlib.h>
#include <string>
#include <fstream>
using namespace std;

void encrypt(string filename){



string line;
ifstream input(filename.c_str());
if (input.is_open())
{
while(!input.eof())
{
getline (input,line);
cout <<line<<endl;
}
for( int i=0 ; i<line.length() ; i++ )
line(i] = line(i]^129;
input.close();
}


else if(!input)
{
cerr<<"Could not open file";
exit(1);
}
cout<<"test: "<<line;
ofstream output;
output.open("encryption.enc");
output << line << endl;
output << flush;
output.close();

for( int i=0 ; i<line.length() ; i++ )
line(i] = line(i]^129;
cout<<"decrypted: "<<line;

return;
}

void decrypt(){
string line;
ifstream input("encryption.enc");
if (input.is_open())
{
while(!input.eof())
{
getline (input,line);
cout <<endl<<line<<endl;
}
for( int i=0 ; i<line.length() ; i++ )
line(i] = line(i]^129;
input.close();
}


else if(!input)
{
cerr<<"Could not open file";
exit(1);
}
cout <<endl<< "Your decrypted text is :"<<line<<"katt";

return;
}

int main(int argc, char *argv[])
{
string filename;
cout<<"Please enter the filename for encryption"<<endl;
getline(cin,filename);

if (!cin) return 0;
encrypt(filename);
decrypt();

system("PAUSE");
return (EXIT_SUCCESS);

}










Tillägg av kalle-k 2008-09-03 00:15

Aa precis. fixade det med vanliga '(' nu.

Ingen status

kalle-k
Visningsbild
P 35 Linköping Hjälte 1 213 inlägg
Trådskapare
0
Bah lyckades lista ut det efter lite sömn. Jag noterade att filen som sparas har en extra blankrad men jag kollade aldrig varför. Nu har jag kommit fram till att line.length() returnerade 0 pga denna blankraden.

Min polare kom på det rättare sagt. Han var en av 3 som klarade uppgiften i sin klass på typ 30 pers :)

Ingen status

Martin
Visningsbild
P 38 Göteborg Hjälte 156 inlägg
0

Svar till kalle-k [Gå till post]:

Ah, se där ja. decrypt() fanns inte med i första posten, antar att forumet åt upp det. Ett hett tips är att slänga upp kodsnuttar på pastebin eller gist eller något, så de inte blir uppfuckade i forumet.

Nåja, bra att det löste sig till slut.

Moodh åt upp min hatt!

kalle-k
Visningsbild
P 35 Linköping Hjälte 1 213 inlägg
Trådskapare
0

Svar till tritone [Gå till post]:
Tack för hjälpen :)

Ingen status


Forum » Datorer & IT » Webbutveckling & Programmering » XOR-kryptering C++

Ansvariga ordningsvakter:

Användare som läser i den här tråden just nu

1 utloggad

Skriv ett nytt inlägg

Hej! Innan du skriver om ett potentiellt problem så vill vi påminna dig om att du faktiskt inte är ensam. Du är inte onormal och världen kommer inte att gå under, vi lovar! Så slappna av och gilla livet i några minuter - känns det fortfarande hemskt? Skriv gärna ner dina tankar och frågor, vi älskar att hjälpa just dig!

Den här tråden är äldre än Rojks drömtjej!

Det senaste inlägget i den här tråden skrevs för över tre månader sedan. Är du säker på att du vill återuppliva diskussionen? Har du något vettigt att tillföra eller passar din fråga i en ny tråd? Onödiga återupplivningar kommer att låsas så tänk efter en extra gång!

Hjälp

Det här är en hjälpruta

Här får du korta tips och förklaringar om forumet. Välj kapitel i rullningslisten här ovanför.

Rutan uppdateras automagiskt

När du använder funktioner i forumet så visas bra tips här.


Annons
Annons
Annons
Annons