mir reicht's! Kryptostream muß her!
-
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.gifDamit 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 quatschDie 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
-
Original erstellt von 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 SideWinderDie Burrows-Wheeler-Transformation hab ich irgendwo rumfliegen...
Ähm, wißt ihr was? Vielleicht war der Gedanke mit dem Blockweise-Vorgehen gar net so ultraklug. Aber egal. Ne Lösung, die geht, wär ja vollauf genug, erstmal egal, welche.
-
@Volkard
Kannst du noch mal auflisten, was du alles haben wolltest.Sammelt mal Ideen, was man alle brauchen könnte.
-
Hi,
um den Thread nicht absterben zu lassen, da er ja sehr interessant ist:
Wie waers, wenn wir so Verfahren wie XOR, Rot13, Blowfish und sowas
implementieren??mfg
v R
-
Ich weiß, dass ich von Kryptographie keine Ahnung habe, aber ist XOR nicht ein Verfahren, welches nur in eine Richtung funktioniert?
Übrigens kannst du gerne einmal eine Klasse Crypto bauen. Die Stream-Implementation ist fast fertig. Schau sie dir mal an und such dir die Methoden raus, die deine Klasse unterstützen muss.
MfG SideWinder
-
Original erstellt von SideWinder:
**Ich weiß, dass ich von Kryptographie keine Ahnung habe, aber ist XOR nicht ein Verfahren, welches nur in eine Richtung funktioniert?
**XOR ist keine Hashfunktion. XOR ist sogar symmetrisch, du brauchst also keine extra Dechiffrierfunktion:
E(E(M)) = MM: Plaintext