mir reicht's! Kryptostream muß her!
-
Original erstellt von volkard:
Hey, Leute!
Schon mal aufgefallen, daß alle 7 Tage jemand fragt, wie er verschlüsselt speicher kann?
Nur, nimmt er dann ein Tauschalphabet, ist die Datei in Millisekunden geknackt.
Nimmt er Blasefisch oder sowas, dann braucht er erstmal drei Wochen, bis er drin ist.
Nu ist mir aber eingefallen, daß die iostrem-Bibliothek doch genau das kann, was wie suchen. Immer nen ganzen Block von sagen wie mal 2048 Bytes lesen, den entschlüsseln und dem Benutzer ganz normal geben, als hätte der nen normale Datei.
Was ich brauche:
a) Einen, der die iostream-lib soweit kenn oder sich damit vertraut machen kann, daß er rausfindet, wie man zwei Funktionen wie z.B. void crypt(char const key,char const data,size_t datalen), void decrypt(char const* key,char const* data,size_t datalen) einspleißen könnte. Geht das überhaupt? Kann man sich drauf verlassen, daß die gelesenen Blocks immer gleich groß sind?
b) einen, der ne simple crypt() und decrypt() anbietet.
c) einen, der die beiden von a) und b) erstmal findet.
d) einen, der mir bescheid sagt, wenn Ihr fertig sein. Ich mach's nämlich net. Das sollt Ihr schön selber machen.
e) bis r) Leute, die immer mal, wenn sie sich echt langweilen klassiker wie Caesar, IDEA, RSA, DES udn was man alles im Netz so finden kann, einfach mal einbauen.
Müßte eigentlich nen Heidenspaß machen. Außerdem wär das Produkt ziemlich brauchbar.**Hola Ladies,
hier haben sich wohl mehr so die geheimen Typen versammelt images/smiles/icon_wink.gif
Also die Idee an sich is' ja net schlecht.
Nur wollte ich mal unnötigerweise drauf hinweisen das die Idee
nicht wirklich neu ist.
Gib's schon alles frisch, fix und fertig verpackt zum mitnehmen.
DES, RC2, IDEA, RC4, RSA und Freunde inklusive Stream-Konzept.Wenn man sich gar zu der zivilisierten Welt zählen kann (Exportbeschränkungen) läßt sich die
länge des Schlüssels unendlich erhöhen.
http://java.sun.com/j2se/1.4/docs/guide/security/jce/JCERefGuide.htmlOops, ich seh gerade, is' ja 'ne andere Sprache images/smiles/icon_wink.gif
Ich glaub der volkard wird mein Posting lieben.bis dänn, O'Dog
-
@O'Dog
Was genau willst du eigentlich mit deinem Beitrag sagen? Das Java eine flexible und umfangreiche Klassenbibliothek hat und das es zusätzlich sehr viele nützliche Klassen(bibliotheken) gibt sollte doch eigentlich allen bekannt sein.Eine Suche bei google hat mir außerdem gezeigt, dass es auch für C++ ein Haufen Crypto-Klassenbibliotheken existieren. Mal den ersten Link kopiert:
http://www.eskimo.com/~weidai/cryptlib.htmlOder bemängelst du, dass die Idee für ein solches Projekt nicht neu/einzigartig ist?
Oder geht es dir einfach nur darum mal wieder Java in den Raum zu rufen? Nur für den Fall, dass Leute wie SteveB auftauchen?
-
Das mit der Aufteilung versteh ich nicht ganz, soll cryptostream eine Stream-Klasse sein, die von basic_streambuf abgeleitet wird?
MfG SideWinder
-
Original erstellt von HumeSikkins:
**@O'Dog
Was genau willst du eigentlich mit deinem Beitrag sagen? Das Java eine flexible und umfangreiche Klassenbibliothek hat und das es zusätzlich sehr viele nützliche Klassen(bibliotheken) gibt sollte doch eigentlich allen bekannt sein.Eine Suche bei google hat mir außerdem gezeigt, dass es auch für C++ ein Haufen Crypto-Klassenbibliotheken existieren. Mal den ersten Link kopiert:
http://www.eskimo.com/~weidai/cryptlib.htmlOder bemängelst du, dass die Idee für ein solches Projekt nicht neu/einzigartig ist?
Oder geht es dir einfach nur darum mal wieder Java in den Raum zu rufen? Nur für den Fall, dass Leute wie SteveB auftauchen?**
Nö, hat sich für mich nur so angehört als wäre es 'ne
Idee auf die die Welt gewartet hat.Original erstellt von O'Dog:
Nur wollte ich mal unnötigerweise drauf hinweisen das die Idee
nicht wirklich neu ist.righty right.
O'Dog
-
soll cryptostream eine Stream-Klasse sein, die von basic_streambuf abgeleitet wird?
Nein. Cryptostream sollte eine Stream-Klasse sein, die einen Streampuffer verwendet, der von streambuf abgeleitet ist.
Die Streamklassen sind nur für die Formatierung (/me ignoriert bewußt einmal Facets und co.). Für das eigentliche Lesen-/Schreiben, Puffern usw. von Zeichen sind die Streampufferklassen zuständig.
Den Vorteil dieser Aufteilung hat Volkard ja schon genannt.
-
Hi,
ich würde das aber wenn so implementieren
cout[crypt]<<"sowieso";
und nicht
cout<<crypt<<sowieso;
und man will sicherlich nicht nur teile von datein verschlüssen
-> super idee volkard images/smiles/icon_smile.gif , stefan
-
ich würde das aber wenn so implementieren
cout[crypt]<<"sowieso";
images/smiles/icon_confused.gif
Woher nimmst du den dazu benötigten Indexoperator?
cout ist ein Streamobjekt und hat demzufolge keinen solchen Operator.
-
Original erstellt von const Stefan:
Hi,
ich würde das aber wenn so implementieren
cout[crypt]<<"sowieso";
und nicht
cout<<crypt<<sowieso;
und man will sicherlich nicht nur teile von datein verschlüssen
-> super idee volkard images/smiles/icon_smile.gif , stefanNein und ja.
Also datei<<bla<<endl; oder so.
und nach 27 solchen aufrufen ist endlich der unter cout liegende Puffer voll und muß auf die Platte getan werden. Dann macht das normale fstream einfach sowas wie fwrite und schreibt nen ganzen Puffer weg. Wir wollen einfach vor das Schreiben den ganzen Puffers ein Verschlüsseln des ganzen Puffers setzen.
-
Bin noch zu dumm für diese Aufgabe, und werde schauen was ich hier lernen kann - für mich persönlich habe ich zur Zeit die Aufgabenaufteilung mal in die Ecke gestellt da ich sie nicht in die Praxis umsetzen kann. Hab mir meine Manipulatoren-Version gemacht, die bevor der Text überhaupt in den cout-Buffer kommt schon am Stream arbeitet.
MfG SideWinder
-
Hi,
@volkard: ach so, ich hab da dann was falsch verstanden, sorry
aber wie das zu lösen ist kann ich leider auch nicht sagen images/smiles/icon_smile.gifstefan
-
Nur, damit ich es nicht falsch vertehe: Soll das Verschlüsselte auf dem Bildschirm ausgebbar sein? Ergo: Sollen die verschlüsselten Bytes Werte zw. 32 und 128 haben?
-
denke, am besten, wir denken erstmal nur an dateien.
-
So, hier ist die Vignereverschlüsselung mit einer Schlüssellänge von 32 Bit. Der Schlüssel sollte min. 2^24 + 1 betragen, da ansonsten jedes vierte Byte sonst mit 0x0 verschlüsselt wird, also gar nicht. Wie ihr seht, ist die Vignereverschlüsselung nur ein besseres Caesarchiffre.
Hier mal der Code:typedef unsigned char byte; const int keySize = 4; void getBytes (byte* b, unsigned int n, size_t s) { unsigned int mask = 0; for (unsigned i = 0; i < s; i++) { mask = (mask + 1) * 0x100 - 1; b[i] = (n & mask) >> (8 * i); } } void encipher (const char* m, char* c, unsigned int key, size_t dataSize) { byte* k = new byte[keySize]; getBytes(k, key, keySize); for (unsigned i = 0, j = 0 ; i < dataSize; i++, (!(i % keySize) ? j = 0 : j++)) *c++ = m[i] + k[j]; *c = 0; } void decipher (const char* c, char* m, unsigned int key, size_t dataSize) { byte* k = new byte[keySize]; getBytes(k, key, keySize); for (unsigned i = 0, j = 0; i < dataSize; i++, (!(i % keySize) ? j = 0 : j++)) *m++ = c[i] - k[j]; *m = 0; }
Die meisten professionellen Algorithmen sind Blockchiffrierungen und basieren auf sogenannten Feistelnetzwerken. Bevor ich also in der Lage bin, einen solchen professionellen Algorithmus zu implementieren, muss ich erst einen eigenen Feistelalgorithmus entwerfen, um die Funktionsweise genau zu verstehen.
Für diese Vorgänge wäre es ganz gut, wenn sich noch jemand dafür opfern könnte.
-
jo, vielen vielen dank erstmal.
leider sind die vielen parameter durchaus mehr als die beiden, mit denen ich gerechnet hatte. überleg. vielleicht müßte man die zwei schlüsseldinge als klassenattribute nehmen? Naja, egal. Der wo dann so sich mit streams auskennt und und weiterhilft, darf sich jetzt erstmal alles aussuchen und anpassen wie er es für am angenehmsten hält.
-
@volkard
Man kann die Anzahl der Parameter noch auf 2 reduzieren. Dazu müsste man dann das Resultat (einmal m, einmal c) zurückgeben und dataSize durch strlen(m) bzw. strlen(c) ersetzen.m ist immer Klartext, c Chiffretext.
Gibt es noch jemanden, der bereit wäre, an der Implementierung eines professionellen Algorithmus mitzuwirken?
-
@volkard
Sollen die Daten denn bereits verschlüsselt im Puffer liegen, oder reicht es, wenn dies erst passiert, wenn der Puffer voll ist und dieser in die Datei geschrieben wird?Letzteres wäre natürlich leichter zu implementieren.
Man könnte dann nämlich leicht den ganzen Puffer an den Verschlüsslungsteil übergeben, dieser verschlüsselt, liefert das Ergebnis zurück und die von streambuf abgeleitete Klasse schreibt das ganze dann in die Datei. Danach kann der Puffer geleert werden und das Spiel beginnt von vorn.Die erste Variante sollte allerdings auch nicht viel komplizierter sein.
Man müßte sich aber auf jeden Fall auf eine Verschlüsselschnittstelle einigen. Es wäre ja schließlich quatsch, wenn der Stream Kentniss über den Algo besitzen müsste.
-
Einfach, möglichst einfach.
-
Hume: Wäre es einfacher für dich, wenn decipher() und encipher() nur noch 2 Parameter hätten und das Resultat in der Form char* zurückgäben?
-
Original erstellt von Doktor Prokt:
Hume: Wäre es einfacher für dich, wenn decipher() und encipher() nur noch 2 Parameter hätten und das Resultat in der Form char zurückgäben?*Ich vermute, am einfachsten ist ein Objekt, das alle Statusinformationen wie Schlüssel als Attribute hat und decipher() und encipher() je nur zwei Parameter, char*buf und size_t len. und daß decipher und encipher ihre Arbeit inplace zu machen haben. Für die selten Fälle, wo inplace nicht geht, kann man sie immer noch so machen, daß sie in ne lokale kopie verschlüsseln und zurückkopieren. Kopierkosten sind eh vernachlässigbar gering.
-
Hm, ich bin mit den Fachausdrücken nicht so vertraut: Was bedeutet inplace und die beiden Parameter buf und len? Wo bleibt der Schlüssel?