Verschlüsselung?
-
Hi,
also mein Zeil ist es einen String zu verschlüsseln und wieder entschlüsseln zu können.
Dabei möchte ich nicht auf fertige Bibilotheken zurückgreifen sondern selber eine Klasse schreiben mit der ich das dann mit den dementsprechenden Funktionen umsetzen kann.
Ich hab mir ein paar Verfahren angesehn bin aber nicht so ganz schlau darauß geworden.
Deswegen wollte ich fragen ob ihr mir da ein bisschen weiterhelfen könnt?
sollte aber nicht zu einfach sein wie XOR oder Cesar.
Gruß
GT
-
Hallo,
Wie wärs mit blowfish?
http://www.schneier.com/blowfish.html
http://de.wikipedia.org/wiki/Blowfish
-
Viginere, Beale, Caesar, und und und.
Was willst du jetzt genau wissen? Sollen wir dir hier jetzt alle Algos posten und du suchst dir den besten raus, den du dann "selbst in deine eigene Klasse schreibst" ?
-
ne das nicht.
Ich versteh nur nicht ganz wie die "Algos" so funktioniern. BlowFish ne ich will ja selber was schreiben.
Jetzt nur mal um zu sehn ob ichs verstanden hab:
Im prinzip hab ich doch meinen Text den ich verschlüsseln will und dann z.B. einen Key mit dem ich dann die Verschlüsselte Datei/Text erstelle oder?
Nur versteh ich noch nicht ganz wie das funktioniert.
Und Hash geht nur in eine richtung oder? Also könnte ich den Hash aus meinem Text erzeugen und denn dann mit dem Selben vergleichen oder?
-
Also, ich habe zwar überhaupt keine Ahnung von Verschlüsselungen, aber ich würde es so machen (ganz simpel)
1. Für jeden Buchstaben setzt du einen anderen ein, z.b für A == Z ...
oder:
2. Für jeden Buchstabn, nimmst du eine Zahlenkombination von 3 Zahlen, also für A == 639 ...
und:
3. Du vertauscht die Buchstaben eweils immer, z.b den ersten an dritter stelle, den zweiten and 1 Stelle und den dritten an zweiter stelle, das würde dann so ausehen:ABC == CBA
Wenn man das noch mit der Zahlenkombination macht:
int A = 637; int B = 158; int C = 956; //Wort schreiben char Wort[3] = "ABC" //Buchstaben verdrehen char VerdrehtesWort[3] = Verdrehen(Wort[]); // ergibt: CBA Char Zahlen[9] Zahlensetzen(VerdrehtesWort[]); // ergibt: 956158637
Also hast du dann für ABC == 956158637
Und das wieder zurück zu verschlüsseln sollte niht ganz einach sein, wenn man nicht weis wie es verschlüsselt wurde! (ist nur Pseudocode ne^^)
-
Ich hoffe ich verbreite jetzt keine halbwahrheiten:
Vigenere und Ceasar sind im prinzip das gleiche denn Vigenere ist die Allgemeinere form während Ceasar nur ROT 13 verwendet ( kann mich auch irren).Die frage ist willst Du deinen Text nur codieren oder chiffrieren ?
Codierungsmechanismen wie NRZI sind zur Takterkennung und Störungsfreiheit während des Transportes.
Während SSL oder andere schlüssel bezogen sind und darauf bedacht das man diese ohne nicht lesen kann.Schreib für den anfang doch erst mal ein prog für vigenere, und zwar nicht nur fürs alphabet sondern den ganzen ASCII code haufen
Dann sollte deine idee^^ auch funzen.
grüüße
-
Showball schrieb:
Und das wieder zurück zu verschlüsseln sollte niht ganz einach sein, wenn man nicht weis wie es verschlüsselt wurde!
das ist eine sehr naive einstellung
-
Jaja^^
Also, enn ich soetwas sehen würde hätte ich nicht grad lust heraus zu finden was das eigentlich bedeutet, und man kann das ja nch weiter ausbauen, das nicht nur 3 Buchstaben vertauscht werden, sondern jeweils 100 und das es nicht immer nur 3 Zahlen sind sonder 1-100 zahlen pro Buchstabe
-
eine variable anzahl von zahlen pro buchstabe fänd ich interessant:
so wie:
A = 12
B = 345
C = 6Aber ich denke dann währe der key für eine Volltextverschlüsselung ziemlich groß,...
grüße
-
überhaupt kein problem bei so einer substitution mithilfe von Buchstabenvorkommen in einer bestimmten sprache die Zahlenkombination eines Buchstabens zu ermitteln.
*Vorsicht: schneller gedanke.keine garantie darauf
*
-
@ Showball:
Deine Methode scheint mir einen sehr interessanten Ansatz zu haben. Ich bezweifle allerdings, ob das in der Praxis einigermassen sicher ist. Wenn man z.B. herausfindet, dass immer 3 Zeichen zusammengehören, kann man mit BruteForce relativ vieles ausprobieren und dann auf die Häufigkeiten der Buchstaben schliessen. Das ist generell ein Problem bei Verschlüsselungsalgorithmen, deshalb ist von einem assoziativen Ansatz (jeweils ein Buchstabe entspricht einem Code) eher abzusehen.Um es relativ einfach zu machen, könntest du die XOR-Verschlüsselung implementieren, die ist auch nicht ganz so leicht zu knacken. Das heisst, du hast einen Schlüssel (z.B. ein Integer- oder Char-Array) und führst dann für jedes Zeichen des Klartextes ein bitweises Exklusives Oder (^) mit der entsprechenden Stelle im Schlüssel durch. Beim Erreichen des Schlüsselendes fängst du wieder von vorne an (mit Modulo). Bei der XOR-Verschlüsselung ist besonders hilfreich, dass derselbe Algorithmus sowohl für die Ver- als auch für die Entschlüsselung verwendet werden kann. Allerdings ist die Methode nicht extrem sicher, aber fürs erste sollte es reichen.
Und da du den Anspruch erhebst, so etwas selber schreiben zu wollen, bringt es dir auch nicht wahnsinnig viel, wenn du wahnsinnig komplizierte Techniken anschaust und dann höchstens anhand von Codebeispielen überhaupt ansatzweise verstehst.
-
Nexus schrieb:
Allerdings ist die Methode nicht extrem sicher, aber fürs erste sollte es reichen.
was du beschrieben hast, ist eine one-time-pad verschlüsselung. wenn der schlüssel genau so lang wie der plaintext ist, ist dies sogar einzig nachweisbar sichere verschlüsselungsmethode
-
@ Fencer:
jo das ist richtig,
beachte aber dass es substitutionmethoden gibt die häufig vorkommende zeichen durch mehrere andere zeichen ersetzen, so dass im codierten text alle zeichen rund die gleiche wahrscheinlichkeit haben.grüüße
-
Wow, dessen war ich mir gar nicht bewusst... Aber für kleine Programme wird man wahrscheinlich eher kurze Schlüssel anlegen und ist damit schon relativ (aber nicht extrem) sicher ;).
-
Erstmal danke für die vielen Antworten.
Also ich hab da jetzt mal was gefunden was relativ einfach ist.
unsigned char txt[] = "aaaabbbb"; int i, j; // verschluesseln for (i = 0; txt[i]; ++i) txt[i] ^= txt[i + 1]; // in hex ausgeben (verschluesselt) for (j = 0; j < i; ++j) cout << hex << setfill('0') << setw(2) << (unsigned int) txt[j] << " "; cout << endl; // entschluesseln for (j = i - 1; j >= 0; --j) txt[j] ^= txt[j + 1]; // zeichenweise ausgeben for (j = 0; j < i; ++j) cout << txt[j] << " "; cout << endl; // in hex ausgeben (entschluesselt) for (j = 0; j < i; ++j) cout << hex << setfill('0') << setw(2) << (unsigned int) txt[j] << " "; cout << endl;
Da kann ich ja txt[] verschlüsseln entschlüsseln und als Hex ausgeben lassen. Meine Frage ist jetzt nur wie könnte ich das in 2 Funktionen Einbauen bzw. wie weis ich nur ich weis nicht wie ich das txt[] als Parameter der funktion übergeben muss.
Wäre nett wenn ihr mir das noch erklären könntet.
-
Mir fallen da noch zwei einfach zu programmierende Verfahren ein.
Zum einen ein symmetrisches Verfahren, das wurde hier auch schon in einer ähnlichen Form aufgeführt, wäre folgendes:
Es werden zwei Schlüsselzahlen a und b benötigt, womit insgesamt a Primzahlen p ab pb, also p mit dem Index b, berechnet werden, wobei als erste Primzahl die Zwei gilt. a kann ein Wert zwischen 1 und x sein, das bedeutet die Liste enthält maximal x aufeinander folgende Primzahlen. Das Muster zur Verschlüsselung sieht dann wie folgt aus:geheimzahl = (zeichen + pb) mod 256
Und wenn die Primzahlliste einmal durchlaufen ist, aber noch Zeichen zum Verschlüsseln vorhanden sind, beginnt man wieder mit der kleinsten Primzahl p0 aus der Liste. Natürlich steigt die Festigkeit des Verfahrens um so mehr Primzahlen benutzt werden und wenn die Liste mit den Primzahlen nicht einfach von vorne nach hinten durchgearbeitet wird, sonder über einen Algorithmus.
Zum anderen kann man auch einen Text in einem Bild verstecken. Dafür kannst du eine BMP Datei nehmen und einfach in regelmäßigen Abständen die einzelnen Zeichen rein schreiben. Dies wäre die einfachste Methode und nicht gerade sehr unauffällig, da es passieren kann, dass sich in mitten eines dunklen Bereiches ein rosa Pixel (übertrieben gesagt
) befindet. Eine andere Variante wäre es den ASCII Wert eines Zeichens mit dem Farbwert an einer Stelle zu vergleichen und nur bei einer annähernden Übereinstimmung dieses Farbwerts, diesen mit dem ASCII Wert zu ersetzen.
-
So ich hab jetzt noch mal eine Frage:
Im Prinzip ist es doch so das ich wenn ich einen Text verschlüsseln will 1tens den Text brauche und 2tens einen Schlüssel(key) mit dem ich verschlüssel oder?
Dann muss ich doch meinen Text und den Key zusammenbringen. Und wenn ich wieder nur den Text haben will dein Key wieder abziehn?
Seh ich das so richtig?
Und das sollte man in einem Spezielen musste machen z.B 1 Buchstabe vom Text dann Key usw. Was ich aber nicht für sicher halte.
Eine andere Möglichkeit wäre jedem Buchstaben eine Zahl zuzuweisen oder jeder Zahl eine Buchstaben reihe? Die müsste ich aber davor dann schon abspeichern also in einem Array oder Vector damit ich drauf zugriff hab oder?
Und dann brauch ich was was die sachen wieder ersetzt und wieder zurücksetzt richtig soweit?
Aber was für mich jetzt am wichtigesten wäre gibt es eigentlich nirgendwo so eine deffinierte Standart Lösung oder tutorial wo man dann drauf aufbauen kann. Weil ich komm damit nicht wirklich gut zurrecht.
Wäre auch nett wenn mir hier jemand was kurzes schreiben würde.
Was ich mir so gedacht habe war erstmal:
2 Funktionen (später 3)
1. Verschlüsseln(Text, Schlüssel)
2. Entschlüsseln(Verschlüsselter Text, Schlüssel)
3. Erstellung eines SchlüsselsWäre das in soweit richtig erdacht? Bzw. kann man das gut umsetzen und ist es einigermassen sicher?
Aber wie gesagt das einfachste für mich wäre ein fertiges Minibeispiel auf dem ich aufbauen kann.
-
Ich hoffe das versteht niemand als Spam:
hier ein kleines demo prog wie vigenere funktioniert, ich habe dabei eine relativ kurze schlüssellänge gewählt, alles in der konsole sichtbar.
Bitte net über die form der Programmierung meckern,..
// Name: vigenere Demo // Copyright: (c) 2008 // Author: ZeuSOsC // Date: 10.01.08 15:40 // Description: simple (en-)cryption demo #include <cstdlib> #include <iostream> #include <stdlib.h> #include <stdio.h> #include <sstream> #include <vector> /*at first hashing, vigenere will follow*/ using namespace std; typedef struct vig_table{ protected: int columns,rows; string solved_encoded; public: string solved_coded; vector<string> string_table; vig_table(string alphabet):local_alphabet(alphabet),columns(0),rows(0) {//here will the vigtable be created string temp1,temp2; temp2=""; temp2=local_alphabet; string_table.push_back(temp2); for(long int i1=0;i1<local_alphabet.length()-1;i1++) { temp1=""; temp1=temp2; for(long int i=0;i<local_alphabet.length();i++) { if((i+1)<local_alphabet.length()){temp2[i]=temp1[i+1];} else{temp2[i]=temp1[0]; }; } //cout<<temp1<<" "<<string_table.size()<<endl; string_table.push_back(temp2); } }; ~vig_table(){}; void operator()(string key,string chiffre){ //here will be coded and encoded string temp1,temp2; temp1=""; temp2=""; long int chiffre_counter,key_counter; key_counter=0; chiffre_counter=0; cout<<endl; do { if(key_counter>=key.length()){key_counter=0;}; if(find_local_coding_index(key[key_counter],chiffre[chiffre_counter])>=0) { temp1+=string_table[rows][columns]; //cout<<" "<<temp1; }else{cout<<"error "<<rows<<" "<<columns<<endl; break;}; if(find_local_encoding_index(key[key_counter],chiffre[chiffre_counter])>=0) { temp2+=string_table[0][columns]; //cout<<" "<<temp2<<endl; }else{cout<<"error "<<rows<<" "<<columns<<endl; break;}; key_counter++; chiffre_counter++; }while(chiffre_counter<chiffre.length()); solved_coded=temp1; solved_encoded=temp2; cout<<endl<<"Chiffre: "<<chiffre<<endl<<endl<<"Coded: "<<solved_coded<<endl<<endl<<"Encoded: "<<solved_encoded<<endl<<endl; } private: string local_alphabet; int find_local_coding_index(char key_member,char text_member) { int local_error; int found; char temp; local_error=-1; found=local_alphabet.find(text_member); if(found!=string::npos){columns=found;}else{return local_error;}; for(long int i=0;i<string_table.size();i++) { temp=string_table[i][0]; if(temp == key_member){local_error=0; rows=i; return local_error; }; } }; int find_local_encoding_index(char key_member,char text_member) { int local_error; int found; char temp; local_error=-1; for(long int i=0;i<string_table.size();i++) { temp=string_table[i][0]; if(temp == key_member) { local_error=0; rows=i; found=string_table[i].find(text_member); if(found!=string::npos){columns=found;}else{return -1;}; return local_error; }; } }; }; ostream& operator<<(ostream& os,const struct vig_table &rhs) { string temp; for(long int i=0;i<rhs.string_table.size();i++) { temp=""; temp+=rhs.string_table[i]; os<<temp<<endl; } return os; }; int main(int argc, char *argv[]) { string example_alphabet; example_alphabet=""; //example_alphabet+="°^\"§$%&/()=?\}]][{³²*+~#'-_.:,;µ<>|@ "; example_alphabet+="!\"&%=? \\}][{()_-,.+*#':;/$"; example_alphabet+="0123456789"; example_alphabet+="abcdefghijklmnopqrstuvwxyz"; example_alphabet+="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //example_alphabet+="áéúíóàèùìòâêûîô"; //example_alphabet+="ÁÉÚÍÓÀÈÙÌÒÂÊÛÎÔ"; //example_alphabet+="äöüÄÖÜ"; string example_key="This_is_a_KEY, to_code_a_TEXT!\0"; string example_chiffre="And this is a text, which should be coded and encoded in this demo of VIGENERE ALGORITHM for polyalphabetic substitution.\0"; cout<<endl; cout<<"______________________________________________________"<<endl<<endl; cout<<" vigenere_ coding and encoding demo_code v0.2 "<<endl<<endl; cout<<" ZeuSOsC (c) - Jan 2008 "<<endl<<endl; cout<<" mail: 9387@gmx.de "<<endl; cout<<"______________________________________________________"<<endl<<endl; cout<<"Example Aplhabet: "<<example_alphabet<<endl; cout<<"Creating Vigenere Table:"<<endl<<"______________________________________________________"<<endl<<endl; vig_table testa(example_alphabet); system("pause"); cout<<testa<<endl<<"______________________________________________________"<<endl; cout<<"Key: "<<example_key<<endl; testa(example_key,example_chiffre); testa(example_key,testa.solved_coded); system("pause"); return EXIT_SUCCESS; }
grüüße