mir reicht's! Kryptostream muß her!



  • ok wieder was zu gelernt
    aber wie ich es in erinerung habe ist pointer mit pointer nicht erlaubt
    wenn schon dan reinterpret_cast in ints,

    [ Dieser Beitrag wurde am 17.04.2002 um 23:43 Uhr von Dimah editiert. ]



  • Mit strlen geht das IMHO nicht, da diese Funktion bei einer \0 aufhört zu zählen. Wenn du jetzt binäre Daten hast wo eine \0 vorkommt, wird nicht alles verschlüsselt. Ich glaube die Länge muss auf jeden Fall übergeben werden!



  • aber wie ich es in erinerung habe ist pointer mit pointer nicht erlaubt

    Ich glaube da hast du was falsches in Erinnerung.



  • Mein Compiler birtet mir speziell für die Differenz von Zeigern sogar nen eigegenen Typen an:

    ptrdiff_t
    


  • ok, ich lag falsch
    jetz habe ich noch mal nachgekuckt, das addieren von zwei zeigern ist verboten, da habe ich wohl was duch einander gebracht

    [ Dieser Beitrag wurde am 18.04.2002 um 00:04 Uhr von Dimah editiert. ]



  • so ich hab auch mal was geschrieben, basiert zwar nur auf der Caesar Chifre (also einer monoalphabetischen Substitution) ist ja auch nur zur Demo

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    namespace crypto
    {
      class out_crypto_caesar
      {
      private:
        int key;
        ostream& out;
    
      public:
        out_crypto_caesar(int ckey,ostream& to):key(ckey),out(to) { }
        out_crypto_caesar& operator<<(const char*str)
        {
          for(size_t i=0;*(str+i)!=0;++i)
        out << (char)(*(str+i)+key);
          return *this;
        }
      };
    }
    
    using namespace crypto;
    
    int main()
    {
      char*d1="hallo";
      out_crypto_caesar ccout(1,cout);
      ccout << d1;
      cout << endl;
    }
    


  • Wer übernimmt Part c) ?



  • Hallo,
    ich habe jetzt mal einen CryptOStream implementiert.
    Eine Anwendung sähe so aus:

    int main()
    {
        CryptoStream<Caeser> MyStream("KryptoTest.txt", ios: :out, Caeser('a'));
        MyStream << "Dieser Satz wird verschlüsselt" << endl;
        MyStream << "Schlüssel ist: " << 'a' << " als int: " << int('a') << endl;
        return 0;
    }
    

    Bisher basiert das ganze noch auf basic_filebuf und ist demzufolge nicht sehr performant (doppelt Pufferung usw.).

    Schneller wäre es, wenn der Puffer von basic_streambuf abgeleitet wäre und sich selbst um das Filehandling kümmern würde.

    So war's aber erstmal weniger arbeit images/smiles/icon_wink.gif

    Wenn interesse besteht, würde ich den Code schnell hochladen. Ich denke für's Forum ist er etwas zu lang und unübersichtlich.



  • Ob Interesse besteht? Nein, ich hab das Projekt eigentlich ins Leben gerufen, um Euch zu veralbern.

    Nicht optimal performant im Moment? Völlig egal. Es geht. Und wie ich Dich kenne, haste gleich alles richtig gemacht, Heißt, daß optimale Lösung genau gleich anzuwenden sein wird wie diese. Dann isses ja egal, wie die ganz innen drin implementiert ist. Den Schritten d) bis z) steht dann nichts mehr im Wege.



  • Hallo,
    hier der Link: ...

    Noch ein paar Hinweise:
    Da ich das ganze nur mit dem VC entwickelt habe, wird es wahrscheinlich auch nur mit dem funktionieren. Der gcc kennt z.B. keine char_traits. Es fehlen also auf jeden Fall noch ein paar #ifdefs usw.

    Die Parameterreihenfolge von CryptoStream ist derzeit etwas unglücklich.

    Der Code ist noch sehr Alpha images/smiles/icon_smile.gif

    [ Dieser Beitrag wurde am 19.04.2002 um 04:34 Uhr von HumeSikkins editiert. ]



  • Hmm, jetzt ist die Phase wo ich mal was lernen kann - werd ich mir sofort anschauen deinen CryptoStream.

    MfG SideWinder



  • @Side
    Jetzt hast wenigstens schon mal gelernt, wie man es nicht machen sollte images/smiles/icon_smile.gif

    Damit das allen anderen erspart bleibt, habe ich die Datei erstmal wieder gelöscht. Sobald eine neue Version fertig ist, sage ich bescheid.



  • faulheit zahlt sich manchmal aus, ich war gestern zu faul mir dein code anzuckuen images/smiles/icon_smile.gif



  • Na dann, warten wir mal auf deine neue Version images/smiles/icon_wink.gif.

    MfG SideWinder



  • @Side und Dimah
    Keine Angst, die erste Version war auch nicht ganz falsch. Ich habe da nur den Puffer nicht richtig genutzt. Insofern war sie wenig effizient.

    Ich habe jetzt mal die neue Version hochgeladen, die Lesen und Schreiben in Ansätzen unterstützt und den Puffer wesentlich effizienter einsetzt (genauer gesagt setzt sie diesen jetzt richtig ein). Allerdings fehlen da noch ne riesen Menge Sachen (steht auch den Kommentaren).

    Da ich aber in der nächsten Zeit aus studiumtechnischen Gründen nur wenig Zeit habe, gebe ich euch lieber jetzt schon mal die halbfertige Version. Vielleicht kann der ein oder andere von euch ja anhand des Codes die fehlenden Teilstücke einbauen.

    Der Link ist wieder: http://fara.cs.uni-potsdam.de/~kaufmann/CryptoStream.h

    @Volkard
    Kannst du noch mal auflisten, was du alles haben wolltest.
    Ich kann mich leider nicht mehr an alles erinnern images/smiles/icon_sad.gif



  • Na dann, schau ich mir das mal an - und Gnade dir Gott ich finde einen Fehler images/smiles/icon_wink.gif.

    MfG SideWinder



  • Tja, und beim Anschauen tauchen auch schon die ersten Fragen auf:

    1.) Gehe ich richtig in der Annahme das die Methode setbuf() in std::filebuf, die Information setzt von wo bis wo der Puffer verläuft?

    2.) Was bringt mir die Methode seekoff()?

    3.) Sollte file.open() nicht bei Fehlschlag (ich meine den, wo schon geöffnet wurrde) ebenfalls 0 zurückgeben?

    4.) Warum setzt du hier Ret nochmals auf dieselbe Adresse?:

    template < class C >
    std::filebuf* CryptoBuffer< C >:  :open(const char *s, std::ios_base:  :openmode mode)
    {
    using std::filebuf;
    filebuf* Ret = this;
    if (!m_IsOpen)
    {
    if (filebuf:  :open(s, mode))
    {
    m_IsOpen = true;
    Ret = this;                                                // HIER!
    m_Mode = mode;// openmode setzen
    setbuf(&m_Buffer[0], m_MaxBufSize);// Puffer setzen
    }
    else
    Ret = 0;
    
    }
    

    5.) Warum benützt du hier nicht maxbufsize?:

    template < class C >
    std::filebuf* CryptoBuffer< C >::close()
    {
    using std::filebuf;
    
    if (!m_IsCrypted && (m_Mode & ios:  :out))
    {// Sicherstellen, dass auch alle Daten verschlüsselt und geschrieben werden.
    std::streamsize Size = pptr() - pbase();                   // HIER!
    m_Algo.crypt(&m_Buffer[0], (&m_Buffer[0]) + (Size -1));
    m_IsCrypted = true;
    }
    filebuf::sync();
    m_IsOpen = false;
    return filebuf::close();
    }
    

    MfG SideWinder

    [ Dieser Beitrag wurde am 20.04.2002 um 16:28 Uhr von SideWinder editiert. ]



  • Hallo,
    also der Reihe nach:
    1. setbuf setzt einen Puffer. Du übergibst setbuf einen Zeiger auf den Beginn des Puffers und als zweiten Parameter die Länge des selbigen.

    2. seekoff wird aufgerufen, wenn der Benutzer eine Operation wie seekg oder seekp aufruft. Innherhalb von seekoff musst man sicherstellen, dass der get- bzw. set-Pointer richtig positioniert wird.

    3. Jo.
    4. Ist quatsch

    Die open-Methode sollte wohl eher so aussehen:

    template < class C >
    std::filebuf* CryptoBuffer< C >::open(const char *s, std::ios_base::openmode mode)
    {
        using std::filebuf;
        filebuf* Ret = 0;
        if (!m_IsOpen)
        {
            if (filebuf::open(s, mode))
            {
                m_IsOpen = true;
                Ret = this;
                m_Mode = mode;                      // openmode setzen
                setbuf(&m_Buffer[0], m_MaxBufSize); // Puffer setzen
            }   
        }
        return Ret;
    }
    

    5. Weil ich nicht davon ausgehen kann, dass m_MaxBufSize Zeichen im Puffer sind.
    Durch std::streamsize Size = pptr() - pbase();
    bestimme ich, wieviele Zeichen tatsächlich im Puffer stehen. Und genau diese Anzahl von Zeichen wird auch verschlüsselt.
    Die -1 ist allerdings quatsch!



  • Na, dann thanx - werds mir dann noch detaillierter ansehen ;).

    MfG SideWinder



  • Kommen jetzt Verschlüsselungs-Klassen auch noch oder belassen wirs hier auf a? Ich mein: Was bringt mir ein toller Einbau in die Stream-Klassen wen ich nicht mal einen Algo habe der eingefügt werden kann?

    MfG SideWinder


Anmelden zum Antworten