Verschlüsselung testen
-
SeppJ schrieb:
verschlüsseler schrieb:
SeppJ schrieb:
verschlüsseler schrieb:
Kannst man anhand eines Zahlen/Bytemusters den Seed eines Zufallszahlengenerators erkennen?
Ja.
Und wie aufwendig ist das?
Wenn ich einen Teil der Nachricht kenne: Ganz einfach (durch direkten Vergleich).
Wieso sollte das ganz einfach sein? Was willst du direkt vergleichen? Willst du eine Tabelle für einen bekannten Teil mit allen möglichen Kombinationen der Passwörter aufbauen und da die gleichen Suchen? Das wird eine riesige Tabelle.
Nein. Man kann an der Stelle wo der bekannte Quelltext steht direkt den Zustand des Zufallsgenerators ablesen. Aufwand geht gegen Null. Ich meine wirklich Null. Nicht ein bisschen rechnen oder denken, sondern ablesen!
Ok, dann zeigt doch mal wie einfach ihr das ablest.
Die crypt funktion vom Anfang +int main(int argc, char** argv) { vector<char> data(20,0); string pass1; cout << "passwort 1:\n"; cin >> pass1; string pass2; cout << "passwort 2:\n"; cin >> pass2; crypt(data, pass1, pass2, 000); for(int i = 0; i<data.size(); i++) { cout << (int)data[i] << "\n"; } }
Ausgabe:
71 112 52 -24 -94 -73 -7 26 68 -47 -12 12 -104 -108 -71 47 -6 12 89 -48
Wie ist der "Zustand"? Was hab ich als Passwörter eingegeben?
-
verschlüsseler schrieb:
vector<char> data(20,0);
Wenn du nur so wenig Daten verschlüsselst, ist sogar eine Vigenère-Verschlüsselung unknackbar (weil Schlüssellänge ≥ Textlänge). Poste hier bitte einmal die Ausgabe von
vector<char> data(std::numeric_limits<std::size_t>::max(),0);
und ändere bei Gelegenheitcout << (int)data[i] << "\n";
zu
cout << static_cast<int>(static_cast<unsigned char>(data[i])) << '\n';
-
gelöscht
-
Abgesehen davon, daß andauernd %=0 gerechnet wird, was zum Absturz führt,
schon bemerkt, daß die Verschlüsselung manchmal ein unterschiedliches Chiffrat erzeugt?
pass1[pass2[cs%pass2.length()]]
geht doch gar nicht. pass1 hat evtl nicht so viele Zeichen.
-
Ich kann mir vorstellen, dass man bei der chiffre eine Menge machen kann. Ich glaube, dass das Ding recht infach zu brechen ist, wenn man sich anschaut, welche Zusammenhänge es zwischen verschiedenen Passwörtern geben kann. Wahrscheinlich wird es darauf hinauslaufen, dass ich mit gut gewählten Kombinationen bereits eine Menge Passwörter ausschließen kann.
-
ableser schrieb:
verschlüsseler schrieb:
vector<char> data(20,0);
Wenn du nur so wenig Daten verschlüsselst, ist sogar eine Vigenère-Verschlüsselung unknackbar (weil Schlüssellänge ≥ Textlänge). Poste hier bitte einmal die Ausgabe von
vector<char> data(std::numeric_limits<std::size_t>::max(),0);
Die Passwortlänge war kürzer als Textlänge. Was soll es bringen die Foren DB zu sprengen? Aber ein paar Zeichen mehr hab ich dir ausgegeben.
volkard schrieb:
Abgesehen davon, daß andauernd %=0 gerechnet wird, was zum Absturz führt,
Du solltest ja auch nicht mit passwort = 0,0,0... bruteforcen, sondern nur ablesen und nicht ein bisschen rechnen oder denken, wie es SeppJ behauptet.
schon bemerkt, daß die Verschlüsselung manchmal ein unterschiedliches Chiffrat erzeugt?
pass1[pass2[cs%pass2.length()]]
geht doch gar nicht. pass1 hat evtl nicht so viele Zeichen.
Gefixt.
#include <iostream> #include <vector> using namespace std; size_t charSum(std::string const& pass) { size_t q = 1; for(size_t i = 0; i<pass.length(); i++) { q+=pass[i]; } return q; } void crypt( vector<char>& data, std::string const& pass1, std::string const& pass2, size_t startPos ) { if ( pass2.length() == 0 || pass1.length() == 0 || startPos >= data.size() ) return; size_t p1 = 0; size_t p11 = 0; size_t p2 = 0; size_t p22 = 0; size_t s1 = 0; size_t s2 = 0; size_t k = pass1.length(); size_t k1 = 0; size_t cs = charSum(pass1) + charSum(pass2); size_t c = pass1[pass1.length()/3]; size_t ms = 1 + pass1[cs%pass1.length()] * pass1[pass2[cs%pass2.length()]%pass1.length()] * pass2[cs%pass2.length()] * pass2[pass1[cs%pass1.length()]%pass2.length()]; size_t m = pass2.length(); if (m>cs) ms *= data.size()/m-cs; for(size_t i = startPos; i<data.size(); i++) { data[i] ^= pass1[p1]; data[i] ^= pass2[p2]; data[i] ^= pass1[p11] * pass2[p22]; p1++; p1 %= pass1.length(); p2++; p2 %= pass2.length(); s2 += k+c; p22+= s2 % (1+pass1[p11]); p22 %= pass2.length(); s1 += k1+m; p11 += s1 % (1+pass2[p22]); p11 %= pass1.length(); k++; if ( k > pass1[k1] ) { k = 0; k1++; k1 %= pass1.length(); } size_t cm = 1 + pass2[p2] % pass1.length(); c+=pass1[p1]/cm; c %= cs; m+=pass2[p22]; m %= ms; } } int main(int argc, char** argv) { vector<char> data(60,0); string pass1; cout << "passwort 1:\n"; cin >> pass1; string pass2; cout << "passwort 2:\n"; cin >> pass2; crypt(data, pass1, pass2, 000); for(int i = 15; i<data.size(); i++) { cout << i << ": " << (int)data[i] << "\n"; } }
Die Ausgabe startet jetzt bei i = 15, weil 0 zu einfach ist.
15: -19 16: 103 17: 1 18: -74 19: -118 20: -13 21: -37 22: -125 23: 56 24: -36 25: -24 26: -72 27: -75 28: -100 29: -36 30: -66 31: 92 32: -31 33: 119 34: 126 35: -105 36: -2 37: 63 38: 45 39: 11 40: 86 41: -54 42: -45 43: -72 44: -127 45: 56 46: -124 47: -46 48: 9 49: 101 50: -31 51: -3 52: -20 53: -62 54: -108 55: 93 56: -19 57: 18 58: -45 59: 110
-
verschlüsseler schrieb:
Die Ausgabe startet jetzt bei i = 15, weil 0 zu einfach ist.
-
Die erste Stelle war bei Quelltext 0,0,0... zu einfach.
SeppJ hat ja auch behauptet "Man kann an der Stelle wo der bekannte Quelltext steht direkt den Zustand des Zufallsgenerators ablesen.", da steht nix von am Anfang des bekannten Quelltexts.
-
verschlüsseler schrieb:
Die erste Stelle war bei Quelltext 0,0,0... zu einfach.
SeppJ hat ja auch behauptet "Man kann an der Stelle wo der bekannte Quelltext steht direkt den Zustand des Zufallsgenerators ablesen.", da steht nix von am Anfang des bekannten Quelltexts.
Ich mache mich mal ran...
-
Wo ist das Problem beim Ablesen? Wir wissen, du hast 0 XOR mit dem momentanen Wert deines "Zufallsgenerators" verschlüsselt. Entsprechend ist der herausgekommene verschlüsselte Text einfach 1:1 der momentane Zustand. Da wir den Algorithmus kennen würden, wenn du ihn hier mal sauber darlegen würdest (ich sehe immer noch nicht ein, wieso ich mir Code mit Variablennamen wie p1, p11, p2, usw. angucken sollte), könnte man sich mal überlegen, wie man von diesem Zustand aus auf die folgenden und die vorherigen Werte kommt. Dass das irgendwie möglich ist, ist so gut wie sicher, da du keinerlei Mechanismen konstruiert hast, die das verhindern und der Algorithmus direkt umkehrbar ist, da es bloß Verschiebeoperationen sind. Es braucht auch kein Mensch zu rechnen, das macht ein Computer.
Im Gegensatz zu volkard habe ich aber keine Lust das an einem völlig willkürlichen Problem tatsächlich durchzuführen. Ich sehe schon voraus, wenn jemand es löst, wirst du ein paar Pluszeichen mit Minus vertauschen, eine vierte Ebene einführen und uns dann herausfordern, es noch einmal zu versuchen, ohne zu verstehen, dass das nichts bringt. Es reicht doch, dass du keine Gegenmaßnahmen eingebaut hast. Tatsächlich das Ding zu Knacken ist bloß ein 1000 Teile Puzzle. Viel Arbeit, aber machbar. Da hilft es auch nichts, wenn du dann im nächsten Versuch 2000 Teile nimmst.
Wenn du hingegen durchdachte Maßnahmen präsentierst, eine Entschlüsselung unmöglich zu machen, dann wäre es mal interessant, es sich anzusehen, ob das auch tatsächlich alles sauber konstruiert ist.
-
SeppJ schrieb:
Wo ist das Problem beim Ablesen? Wir wissen, du hast 0 XOR mit dem momentanen Wert deines "Zufallsgenerators" verschlüsselt. Entsprechend ist der herausgekommene verschlüsselte Text einfach 1:1 der momentane Zustand.
Der Zustand der Zufallsgenerators ist bei dir die zuletzt ausgegebene Zahl? Ist das die offizielle Definition von Zustand eines Zufallsgenerators? Wäre aber irgendwie Qutatsch, ein Zufallszahlengenerator kann ja auch mehrmals die gleiche Zahl ausgeben. Der interne Zustand meines (und wohl auch jeden anderen) Zufallsgenerators enthält aber mehr Information, als die zuletzt ausgegebene Zahl.
-
SeppJ schrieb:
Aufwand geht gegen Null. Ich meine wirklich Null. Nicht ein bisschen rechnen oder denken, sondern ablesen!
SeppJ schrieb:
Im Gegensatz zu volkard habe ich aber keine Lust das an einem völlig willkürlichen Problem tatsächlich durchzuführen.
Ich finde das irgendwie witzig, SeppJ betont immer wieder, wie einfach es sei, das zu entschlüsseln.
Auf der anderen Seite sagt er, dass er leider keine Lust darauf hat und schreibt mehrere seitenlange Posts darüber.
SeppJ hat ganz sicher schon mehr als 10min ins formulieren seiner Posts investiert, aber die 1min um aus dem Kryptotext das Passwort "abzulesen", hat er sich nicht genommen.
-
@verschlüsseler: Bitte sage mir die Längen von pass1 und pass2.
Damit kann ich besser fummeln. Sobald ich die erste Aufgabe gelöst habe, falls ich sie lösen kann, dann noch eine Aufgabe mit unbekannten Passwortlängen und nicht bei 15 anfangen, sondern irgendwo, auch in den vieltausenden.
-
...
-
volkard schrieb:
@verschlüsseler: Bitte sage mir die Längen von pass1 und pass2.
Damit kann ich besser fummeln.Das schränkt den Suchraum aber ganzschön ein. 9 und 6.
-
@te
Beschäftige dich besser 1,2 jahre mit kryptologie und du wirst verstehen was mir meinen... mit xor so wie du es praktizierst kannst du nur deine Gschwister davon abhalten dein 'cipher text' zu lesen ! Aber einer der es versteht wird es in wenigen Minuten brechen.
-
Im Gegensatz zu volkard habe ich aber keine Lust das an einem völlig willkürlichen Problem tatsächlich durchzuführen. Ich sehe schon voraus, wenn jemand es löst, wirst du ein paar Pluszeichen mit Minus vertauschen, eine vierte Ebene einführen und uns dann herausfordern, es noch einmal zu versuchen, ohne zu verstehen, dass das nichts bringt.
Boing
@verschlüsseler:
Schau dir mal das Programm CrypTool an. Dort kannst du unter anderem auch ein wenig mit den Analyse Optionen herumspielen. Aber eine scheinbare gute Verschlüsselung bringt dir auch nichts wenn dir ein Hacker mit Reverse Engineering zur Leibe rückt.Interresant auch "Breaking 104 bit WEP in less than 60 seconds" http://eprint.iacr.org/2007/120.pdf
-
@verschlüsseler:
Bitte verschlüssele mir mal einen Text mit 200 Zeichen. Der Text als auch der Schlüssel soll bitte Englisch oder Deutsch sein. Ich will das Ganze mal durch die Analyse von CrypTool jagen.
-
Bitte ein Bit schrieb:
@verschlüsseler:
Schau dir mal das Programm CrypTool an. Dort kannst du unter anderem auch ein wenig mit den Analyse Optionen herumspielen. Aber eine scheinbare gute Verschlüsselung bringt dir auch nichts wenn dir ein Hacker mit Reverse Engineering zur Leibe rückt.Interresant auch "Breaking 104 bit WEP in less than 60 seconds" http://eprint.iacr.org/2007/120.pdf
Bei WEP ist aber nicht grundsätzlich RC4 das Problem sondern unter anderem der zu kleine IV, übertragen des Inititalisierungsvektors in Plaintext und obendrein schwache Initialisierungsvektoren.
-
Bitte ein Bit schrieb:
@verschlüsseler:
Bitte verschlüssele mir mal einen Text mit 200 Zeichen. Der Text als auch der Schlüssel soll bitte Englisch oder Deutsch sein. Ich will das Ganze mal durch die Analyse von CrypTool jagen.
Könntest du mit dem von mir geposteten Code ja auch relativ einfach selber machen.
Hier:0: -4 1: -102 2: -14 3: 73 4: 13 5: -37 6: 69 7: 115 8: -59 9: -81 10: 100 11: 103 12: -128 13: 106 14: -121 15: -127 16: 117 17: -36 18: -8 19: 67 20: -5 21: 40 22: 1 23: -40 24: 64 25: 110 26: -42 27: -57 28: 30 29: 53 30: 124 31: -2 32: -42 33: 126 34: 97 35: -47 36: 50 37: -121 38: -9 39: -60 40: -98 41: 32 42: 122 43: 103 44: 63 45: -92 46: 77 47: -81 48: 88 49: 127 50: 18 51: 105 52: 124 53: -114 54: 105 55: 4 56: -18 57: -93 58: -9 59: 52 60: 119 61: -106 62: -102 63: 49 64: 4 65: -52 66: 84 67: 122 68: 112 69: -45 70: 57 71: -78 72: -71 73: 58 74: -13 75: 114 76: -16 77: -7 78: 96 79: -94 80: 47 81: -86 82: -32 83: 107 84: 110 85: -98 86: -50 87: -64 88: 74 89: -58 90: 15 91: -30 92: -93 93: -34 94: 1 95: -106 96: 108 97: -35 98: 15 99: 66 100: -4 101: -53 102: -29 103: 37 104: -71 105: -119 106: 74 107: -105 108: 98 109: 83 110: 3 111: 17 112: 44 113: -38 114: -72 115: 87 116: 88 117: -116 118: -76 119: -55 120: 106 121: 120 122: -92 123: 102 124: 65 125: 26 126: 2 127: 97 128: 100 129: -11 130: -108 131: 114 132: 111 133: 92 134: 31 135: -107 136: -62 137: 98 138: 19 139: 103 140: -5 141: 47 142: 0 143: 63 144: 126 145: -117 146: -82 147: 115 148: 58 149: 70 150: -14 151: -19 152: 79 153: -123 154: 39 155: -23 156: -37 157: 8 158: 93 159: -4 160: -34 161: -18 162: 8 163: -97 164: 68 165: -40 166: -36 167: 53 168: 47 169: -88 170: 13 171: -8 172: 111 173: 23 174: 8 175: -56 176: 86 177: -26 178: -2 179: -23 180: 78 181: -16 182: 14 183: 33 184: -109 185: -119 186: 100 187: 122 188: 55 189: -94 190: -42 191: 100 192: -32 193: -46 194: 104 195: 34 196: 23 197: -122 198: -43 199: 6 200: 83 201: -31 202: 126 203: 82 204: 78