Verschlüsselung testen


  • Mod

    verschlüsseler schrieb:

    Was heißt "den Zustand"? Ich will den Seed wissen.

    Meinst du wirklich, dass du nicht weißt, was der Zustand eines Zufallsgenerators ist? Oder meinst du wirklich, dass du nicht weißt, wieso der Seed scheißegal ist und der Zustand das einzig wichtige ist? Beides sind doch ganz schön große Wissenslücken, wenn du hier mitreden möchtest, siehe letzter Absatz.

    Außerdem kann man, wenn der RNG nicht speziell dafür konstruiert ist, ebenfalls recht einfach vom momentanen Zustand auf vorherige Zustände, also insbesondere den Seed, zurück rechnen. Somit wären nicht nur alle zukünftigen, sondern auch vorherige Nachrichten lesbar 👎 . Wieder klingt es harmlos, solch einen speziellen Generator zu konstruieren, aber wieder ist das etwas, wo man mit Expertenwissen und Mathematik dran muss, nicht mit Ausprobieren.

    Dravere schrieb:

    Du wirfst gerade wild Begriffe um dich und es kommt einem vor, dass dir kaum selber bewusst ist, worüber du hier eigentlich redest. Ich empfehle dir unbedingt ein paar grundsätzliche theoretische Grundlagen zuvor anzueignen. Sonst läufst du hier nur kopflos herum und hast keine Ahnung was du eigentlich machst.

    Da hat Dravere recht. Bisher war mit dir ja noch halbwegs zu kommunizieren, aber diese Frage mit dem Zufallsgenerator gerade: 😮

    Wie soll man da höhere Zusammenhänge erklären, wenn du schon so etwas nicht weißt?



  • Dann hab ich wohl keinen Zufallsgenerator gebaut, der eurer Definition von Zufallsgenerator entspricht. Bei mir wird ein Teil des Seeds (Passworts) für jede Berechnung eines neuen "Zustandes" verwendet.



  • verschlüsseler schrieb:

    Dann hab ich wohl keinen Zufallsgenerator gebaut, der eurer Definition von Zufallsgenerator entspricht. Bei mir wird ein Teil des Seeds (Passworts) für jede Berechnung eines neuen "Zustandes" verwendet.

    lol. der war gut.



  • 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 Gelegenheit

    cout << (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...


  • Mod

    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


Anmelden zum Antworten