Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Erstes O-rätsel (der O_code, eher für Anfänger)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.07.2003, 10:10 Uhr
Oliver
S2-Pixelgeneral


Hallo

Ich hab eine Verschlüsselungsmethode für meine Highscorliste entworfen und wollte sie mal an euch austesten

Also gegeben ist folgendes:


C++:
#include <iostream>
#include <Zufall.h>

/* Zufall.h beherbergt folgende Inhalt:
#include <ctime>
#include <cstdlib>
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);
}
*/


#include <cstring>
#include <fstream>
using namespace std;

struct O_Code
{
    char* XX1;
    int XX2;
};

O_Code InitO_Code(const char*STR);
char*ReadO_Code(const O_Code oc);

// Programm

int main()
{
                 ofstream of;
    O_Code oc;
    char zwischen[10000]="";
    while(1) {
    cout << "Bitte geben sie etwas ein: ";
    cin>>zwischen;
                  oc = InitO_Code(zwischen);
    cout << "Auf O_Code geschrieben heisst Ihre Eingabe: " <<  oc.XX1 << "\n";
    of.open("text.txt",ios::app);
    of << ReadO_Code(oc) << " = \noc.XX1 = " << oc.XX1 << "\noc.XX2 = " << oc.XX2 << "\n\n";
    of.close();
    cout << "Aber sie haben folgendes eingegeben: " << ReadO_Code(oc) << "\n\n";
    }
    cin.get();
    return 0;
}



Also in der Funktion InitO_Code wird der O_Code intialisiert. Dafür wird der zu verschlüsselnde String übergeben.
Der verschlüsselte O_Code wird in O_Code::XX1 reingeschrieben: Was XX2 ist, müsst ihr selber rausfinden.
Es müssen also beide Funktionen geschrieben werden, das ist nicht so schwierig, aber man muss erstmal den Code knacken.
Hier einige Beispiele, wie die Datei "text.text" aussehen könnte:


Code:

Oliver =
oc.XX1 = c€}Šy†
oc.XX2 = 4173

C/C++ =
oc.XX1 = wcw__
oc.XX2 = 21845

Windoof =
oc.XX1 = 3EJ@KKB
oc.XX2 = 18383

Linux =
oc.XX1 = ½ÂÉÌ
oc.XX2 = 10205

DirektX =
oc.XX1 = ÅÎÁÇд
oc.XX2 = 11439

OpenGL =
oc.XX1 = gˆ}†_d
oc.XX2 = 3318



Viel Spaß und ich hoffe ich hab mich deutlich ausgedrückt .

PS: Alle Include Dateien müssen auf sinnvolle Weise genutzt werden.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )

Dieser Post wurde am 10.07.2003 um 10:12 Uhr von Oliver Müller editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.07.2003, 13:06 Uhr
ao

(Operator)


... und wenn wirs knacken, kommt der Geheimdienst und killt uns. Da gabs doch mal son Film mit Bruce Willis und einem autistischen Kind, oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.07.2003, 10:26 Uhr
virtual
Sexiest Bit alive
(Operator)


Hm, scheint ja ein sicherer Code zu sein, bei der Menge Antworten bisher
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.07.2003, 10:57 Uhr
Oliver
S2-Pixelgeneral


Eigentlich ist er doch relativ leicht, mir ist schon ein besserer als Zusatzaufgabe eingefallen.

Kleiner Tip: Es ist eine Art "dynamischer" Code.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.07.2003, 11:45 Uhr
virtual
Sexiest Bit alive
(Operator)


Okay:
Mein beobachtungen:

1. Der String wird mit einer Zufallszahl codiert, wobei XX2 diese zahl enhält
2. Der Codierungsalgo funktioniert Zeichenweise, weil gleiche Zeichen immer in der codierten Version gleich erscheinen. Bei den Strings "OpenGL" und "DirectX" ist ausserdem zu vermuten, daß die codierte Version ein nicht durckbares Zeichen enthält.
3. für jedes Zeichen wird der gleiche Kodierungsschlüssel verwendet, dh der Schlüssel verändert sich nicht.
4. Die Zeichen werden auf den Breich 0-255 gemappt.
5. Der Abstand zwischen dem Originalzeichen und dem Codierten zeichen in der Zeichentabelle ist stets identisch.

Das heist, man muß eine Regel finden, die aus XX2 den in (5) genannten Abstand berechnet.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.07.2003, 08:20 Uhr
Oliver
S2-Pixelgeneral


Richtig, wie man die Zeichen dann noch verschiebt, ist mehr oder weniger Ratesache.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.07.2003, 10:45 Uhr
~Zoe
Gast


Also alles eine ganz einfache Cäsar verschlüsselung, nur etwas schwer gemacht!! Versuch es doch mal mit Vigenär(hoffentlich ist der richtig geschrieben)!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.07.2003, 15:16 Uhr
Pablo
Supertux
(Operator)


So jetzt kann man deine arrays mit Variable u erkennen, sonst ... war das unverständlich
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: