006
13.07.2003, 08:28 Uhr
Oliver
S2-Pixelgeneral
|
Wenn man sinnvolle deutsche Wörter oder besser Sätze um irgendwelche Zahlen verschiebt und vielleicht sogar noch umdreht, und man weiß nnicht um wie viel die verschoben wurden, dann probiert mal folgende kleine Funktion aus:
C++: |
#include <iostream> #include <cstring> #include <cstdlib> #include <ctime> using namespace std;
#define uint unsigned int #define cuint const unsigned int
char * KnackeCode(const char * ,const char * ,cuint &,const char * ); char*makeklein(const char*str); void MacheCode(char*str); void MakeLeerzeichen(char*str); void kehreum(char * str);
char*strmid(const char*str,const unsigned int &begin,const unsigned int &count) { char*erg; erg=new char[count+1]; for(unsigned int i =0;i<count;i++) erg[ i ] = str[i+begin]; erg[count]=0; return erg; }
unsigned int strfind(const char * hauptstr,const char*teilstr) { unsigned int counter=0; for(unsigned int i=0;i<strlen(hauptstr) -( strlen(teilstr)-1);i++) if(!strcmp(strmid(hauptstr,i,strlen(teilstr)),teilstr)) counter++; return counter; }
inline bool Quote(unsigned short Prozent=50) { unsigned short p; static bool gerandet=0; if(!gerandet) { srand((unsigned)time(NULL)); gerandet = 1; } p = rand() % 100+1; if (p > Prozent) return 0; else return 1; }
inline unsigned long Rnd(unsigned long Obergrenze,unsigned long Untergrenze=0) { static bool gerandet=0; if(!gerandet) { srand((unsigned)time(NULL)); gerandet = 1; } return (rand() %(1+ Obergrenze-Untergrenze)+Untergrenze); }
const char * DEFAULT_WORDS [43] = { "pf","ph","tz","th","er","en","eh","ah","ih","oh","uh","ck","au","ei","äu","gr","dr", "fr","kr","tr","pr","ur","ir","eu","sch","ch","qu","ng","nk","nd","ff","ll","mm","pp", "ss","tt","et","st","kl","gl","fl","bl","br" };
const char DEFAULT_NOTWORDS [30] = { 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,26,27,28,29,-55 };
const char * DEFAULT_HARDWORDS [29] = { "aaa","bbb","ccc","dddd","eee","ffff","gggg","hhhh","iii","jj","kk","llll","mmmm","nnnn","ooo","pppp","qq","rrr", "ssss","tttt","uuu","vv","www","xx","yy","zzz","ää","öö","üü" };
#define IfGross(c) if(c == 'A'||c == 'B'||c == 'C'||c == 'D'||c == 'E'||c == 'F'||c == 'G'||c == 'H'||c == 'I'||c == 'J'||c == 'K'||c == 'L'||c == 'M'||c == 'N'||c == 'O'||c == 'P'||c == 'Q'||c == 'R'||c == 'S'||c == 'T'||c == 'U'||c == 'V'||c == 'W'||c == 'X'||c == 'Y'||c == 'Z') #define IfVokal(c) if(c=='A'||c=='a'||c=='e'||c=='i'||c=='o'||c=='u'||c=='E'||c=='I'||c=='O'||c=='U') #define NotVokal(c) if(c!='A'&&c!='a'&&c!='e'&&c!='i'&&c!='o'&&c!='u'&&c!='E'&&c!='I'&&c!='O'&&c!='U'&&c!=' ') #define IfKonsonant(c) if(c == 'B'||c == 'C'||c == 'D'||c == 'F'||c == 'G'||c == 'H'||c == 'J'||c == 'K'||c == 'L'||c == 'M'||c == 'N'||c == 'P'||c == 'Q'||c == 'R'||c == 'S'||c == 'T'||c == 'V'||c == 'W'||c == 'X'||c == 'Y'||c == 'Z'||c == 'b'||c == 'c'||c == 'd'||c == 'f'||c == 'g'||c == 'h'||c == 'j'||c == 'k'||c == 'l'||c == 'm'||c == 'n'||c == 'p'||c == 'q'||c == 'r'||c == 'd'||c == 't'||c == 'v'||c == 'w'||c == 'x'||c == 'y'||c == 'z')
char*makeklein(const char*str) { char*erg; erg = new char[strlen(str)+1]; strcpy(erg,str); for(unsigned u = 0;u<strlen(str);u++) IfGross(erg[ u ]) erg[ u ]+=32; return erg; }
void MacheCode(char*str) { char versch; char*merke;
merke = new char[strlen(str)+1]; strcpy(merke,str);
while(strlen(str)!=strlen(merke)) versch = Rnd(256); for(unsigned u =0;u<strlen(merke);u++) str[ u ] = merke[ u ]+versch; if(Quote()) kehreum(str); };
void MakeLeerzeichen(char*str) { for(unsigned i = 0;i<strlen(str);i++) if(str[ i ] == '@') str[ i ] = ' '; }
void kehreum(char * str) { char * cpy; cpy = new char[strlen(str)+1]; strcpy(cpy,str); for(unsigned int i =0,z=strlen(str)-1;i<strlen(str);i++,z--) str[ i ] = cpy[z]; delete [] cpy; }
char * KnackeCode(const char * verschlCode,const char * words[]=DEFAULT_WORDS,cuint &anzahlwords=43, const char notwords[] =DEFAULT_NOTWORDS,cuint anzahlnotwords = 30, const char * hardwords[]=0,cuint &anzahlhardwords=0,cuint &wordpoints=2, cuint hardwordpoints = 3) { int punkte[512]; char*datensatz[512]; uint lenge = strlen(verschlCode); uint gross=0; uint zz=0; uint w; int grpunkte=0;
// Erkennen, ob unsinnige Parameter übergeben wurden
if(verschlCode == 0 || strlen(verschlCode)<=0) return 0; // Datensätze initalisieren for(short i1=0; i1<256;i1++){ datensatz[i1] = new char[lenge+1]; datensatz[i1+256] = new char[lenge+1]; for(uint z =0;z<lenge;z++) { datensatz[i1][z] = verschlCode[z] + i1; datensatz[i1+256][z] = verschlCode[z]+i1; } datensatz[i1][lenge] = 0; datensatz[i1+256][lenge]=0; kehreum(datensatz[i1+256]); punkte[i1]=0; punkte[i1+256]=0; }
///////////////////////////////////////// ////////// Punkte geben ////////////////
for(short i = 0;i<512;i++) { goto ueber; lala: continue; ueber: if(strlen(datensatz[i])!=lenge) continue;
// Zeichen gleich? if(anzahlwords) for(w = 0;w<anzahlwords;w++) punkte[i]+=wordpoints*strfind(makeklein(datensatz[i]),words[w]);
if(anzahlhardwords) for(w =0;w<anzahlhardwords;w++) punkte[i]-=hardwordpoints*strfind(makeklein(datensatz[i]),hardwords[w]); if(anzahlnotwords) for(w=0;w<anzahlnotwords;w++) for(unsigned unter = 0;unter < lenge;unter++) if(datensatz[i][unter] == notwords[w]){punkte[i]=0; goto lala;}
// Satzzeichen und Großschreibung zählen und vergleichen for(w=0;w<lenge;w++) IfGross(datensatz[i][w]) gross++; for(w=0;w<lenge;w++) if(datensatz[i][w] == '.'||datensatz[i][w] == '?'||datensatz[i][w] == '!')zz++;
if(gross>=zz) punkte[i]+=3;
// Großschreibung überprüfen
zz=1; if(lenge>1) for(w=1;w<lenge-1;w++) IfGross(datensatz[i][w]) if(datensatz[i][w-1] == ' ') punkte[i]+=1; else { zz=0; break; }
if(zz) IfGross(datensatz[i][0]) punkte[i]+=3;
// Vokale und Konsonanten prüfen
if(lenge>3) { for(w=0;w<lenge-3;w++) IfVokal(datensatz[i][w]) IfVokal(datensatz[i][w+1]) IfVokal(datensatz[i][w+2]) IfVokal(datensatz[i][w+3]) punkte[i]-=3;
for(w=0;w<lenge-3;w++) NotVokal(datensatz[i][w]) NotVokal(datensatz[i][w+1]) NotVokal(datensatz[i][w+2]) NotVokal(datensatz[i][w+3]) punkte[i]-=3;
}
// Prüfen, ob vor Q ein u ist
if(lenge>1) for(w=0;w<lenge-1;w++) if(datensatz[i][w] == 'q' || datensatz[i][w] == 'Q') if(datensatz[i][w+1] == 'u') punkte[i]+=3; else punkte[i]-=3;
}
///////////////////////////////////////// ///////////// Punkte auswerten //////////
// zz = punkte // gross = welcher
gross=0; for(w=0;w<512;w++) if(punkte[w]>grpunkte) { grpunkte = punkte[w]; gross = w; }
return datensatz[gross]; }
//*/
int main() { char Code[10000]; short eingabe; cout << "////// OE2003 - Die Verschluesselungsmaschine Version 1.0 //////\n" << (char)-87 << " 2003 by Oli\n"; while(1) { cout << "\n\nHauptmenue\n\n" << "Code knacken <1>\n" << "Code machen <2>\n" << "Beenden <0>\n"; cout << "Ihr Eingabe: "; cin >> eingabe;
switch(eingabe) { case 1: cout << "Bitte geben Sie den zu knackenden Code ein: "; cin >> Code; cout << "Das koennte folgendes heissen: \n\n\"" << KnackeCode(Code) << "\"\n\n"; break; case 2: cout << "Bitte geben Sie das/den zu verschluesselnde Wort/Satz ein (@ steht fuer ein Leerzeichen: "; cin >> Code; MakeLeerzeichen(Code); MacheCode(Code); cout << "Ihr Eingabe könnte auf OE2003 so heissen: \"" << Code << "\"\n\n"; break; default: return 0; }
} cin.get();
return 0; }
|
So kann man auch den O_Code entziffern, mann muss nur das XX2 übergeben. Man könnte die Funktion ja vielleicht nur umbauen, dass nur eine Int Zahl zurückgegeben wird, die aussagt, um wie viel es verschoben wurde. Am besten lassen sich damit Sätze verschlüsseln, kurze Namen wie Tim und Tina, gehen aber nicht. -- Demokratie ist die Diktatur der Mehrheit.
www.siedler25.org/ ( Siedler2 - Remake ) Dieser Post wurde am 14.07.2003 um 15:15 Uhr von Pablo Yanez Trujillo editiert. |