Hej alle sammen (Bertel Brander)
jeg har ved hjælp af informationer herfra siden, fået sammensat et ganske simpelt lille program. Mit problem er at jeg ikke helt forstår hvad de enkelte dele gør..
En uddybende beskrivelse af den ville være MEGET behjælpelig
#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
using namespace std;
char ae=-111, oe=-101, aa=134;
string Crypt(const string& aIn)
{
static const char Arr1[] = "klmnopqrstuvwxyzabcdefghij";
static const char Arr2[] = "KLMNOPQRSTUVWXYZABCDEFGHIJ";
int idx;
string Out;
for(idx = 0; idx < aIn.size(); idx++)
{
int ii = aIn[idx] - 'a';
int jj = aIn[idx] - 'A';
if(aIn[idx] >= 'a' && aIn[idx] <= 'z')
Out += Arr1[ii];
else if(aIn[idx] >= 'A' && aIn[idx] <= 'Z')
Out += Arr2[jj];
else
Out += aIn[idx];
}
return Out;
}
string Decrypt(const string& aIn)
{
static const char Arr1[] = "qrstuvwxyzabcdefghijklmnop ";
static const char Arr2[] = "QRSTUVWXYZABCDEFGHIJKLMNOP ";
int idx;
string Out;
for(idx = 0; idx < aIn.size(); idx++)
{
int ii = aIn[idx] - 'a';
int jj = aIn[idx] - 'A';
if(aIn[idx] >= 'a' && aIn[idx] <= 'z')
Out += Arr1[ii];
else if(aIn[idx] >= 'A' && aIn[idx] <= 'Z')
Out += Arr2[jj];
else
Out += aIn[idx];
}
return Out;
}
int main()
{
string Line, dummy, Crypted, Decrypted;
int x;
cout << "hvad "<<oe<<"nsker du at g"<<oe<<"re:" << endl;
cout << "1: Kryptere" << endl;
cout << "2: Dekryptere" << endl;
cout << "Valg: ";
cin >> x;
cout << "Skriv noget: ";
cout.flush();
getline (cin, dummy);
getline(cin, Line);
switch (x) {
case 1:
Crypted = Crypt(Line);
cout << "Krypteret: " << Crypted << endl;
break;
case 2:
Decrypted = Decrypt(Line);
cout << "Dekrypteret: " << Decrypted << endl;
break;
default:
cout << "du skal v"<<ae<<"lge 1 eller 2." << endl;
main();
}
system("pause");
}
På fohånd mange tak for hjælpen
Mvh
Søren V. Jensen
Det din programsnippet laver er *ikke* kryptering, men det man i daglig tale benævner med det engelske ord encraption.
Din krypteringsmetode benytter sig af en "hemmelig" algoritme. Dette er forkert og alt andet end sikkert! Dine const arrays vil være synlige i din kompilerede fil og kan trækkes ud og vil derfor ikke være hemmelige. Jeg ville ændre metodesignaturen, så den måde tager din cipher- / klartekst og din nøgle.
string Crypt(const string& aIn, const string& aKey);
string Decrypt(const string& aIn, const string& aKey);
Som hovedregel, når man laver kryptering så skal man overholde Kerckhoffs princip, dvs.:
1) algoritme skal være offentlig
2) nøglen skal være hemmelig
Den mest simple metode, som illustrere dette princip. Det er cæsar's krypteringsalgoritme, men som dog stadig *ikke* er sikker på grund af den er så simpel og har en utrolig lille nøgle - men den illusrerer dog Kerckhoffs princip meget godt.
Algoritme:
c[i] = t[i + k % N]
c er cipher teksten
t er klar teksten
k er den hemmelige nøgle
Her er nøglen k, som er *hemmelig*, og den er et tal mellem 1 og antallet af bogstaver i alfabetet, og N er netop det antal bogstaver, som er i alfabetet. Algoritmen som er *offentlig* er ganske simpelt at man udskifter hvert bogstav i alfabetet med det bogstav der står på positionen k længere henne. Med en nøgle k = 3 vil "ABC" blive til "DEF". Dekrypteringen fungerer så blot modsat.
Du kan også se en af mine artikler på codeproject.com som behandler dette summarisk.
http://www.codeproject.com/cpp/EncryptionCryptoAPI.aspEn anden artikel hvor jeg har lavet en lille komponent, der benytter sig af krypteringsalgoritmen RC4 og er væsentlig mere sikker kan også findes på codeproject.com. RC4 benytter sig af streamcipher og er derfor også rimelig hurtig, men stadig ikke en af de sikreste.
http://www.codeproject.com/cpp/RC4CPP_DK.aspHth
Jess
Indlæg senest redigeret d. 01.06.2007 09:48 af Bruger #10448