Pins sicher verschlüsselt aufschreiben - Aber wie sicher ist das Verfahren?



  • Kyrptonerd schrieb:

    Ach ja und logischerweise ziehen die Automaten nach 3 mal Pin eingeben die Karte ein.

    ... wenn sie falsch eingegeben wurde.



  • Im Prinzip können wir auch einen Praxistest machen.

    Es sei definiert:
    1. neue geheime Pins
    2. mehr Pins, da mehr Karten
    3. und eine andere neue Superpin.

    Ihr findet meinen Geldbeutel mit dem Zettel auf dem folgende Pins, in verschlüsselter Form, draufstehen, welche nach obigem Verfahren berechnet wurden:

    P1 = 8412
    P2 = 13629
    P3 = 7010
    P4 = 11408
    P5 = 15620
    P6 = 9262
    P7 = 13188
    P8 = 1584900

    Frage:
    A) Wie lautet meine Superpin.
    😎 Wie lauten die richtigen Pins.

    Ihr dürft euch gerne einer Bruteforcetechnik bedienen um die Pins und die SP zu berechnen, am Ende müsst ihr euch aber für maximal 3 Möglichkeiten entscheiden. 😃


  • Mod

    Schwäche deines Verfahrens:
    -Man kann, wie du schon selber feststellst, aus den verschlüsselten Zahlen auf die Größenordnung der beteiligten Zahlen schließen.
    -Man muss im Kopf im Zahlenraum bis 100000 rechnen
    -Dein Verfahren mit der 5. Stelle ist totaler Murks. Man kann direkt auf einiger der Ziffern schließen:
    17023 * 14 + 1314 = 239636.
    Folgerung daraus, dass die letzte Ziffer eine 6 ist:
    Es gibt nur folgende Möglichkeiten für die letzten Ziffern von Pin und Superpin:

    Pin Superpin
    0     6
    1     3
    1     8
    2     2
    3     4
    3     9
    5     1
    5     6
    6     8
    7     2
    7     7
    8     4
    

    Das ist schon eine gehörige Einschränkung und kann sicher auch noch weiter getrieben werden. Für die letzten beiden Ziffern ergeben sich beispielsweise nur noch 160 Möglichkeiten, statt der erwarteten 10000. edit: Für die Gesamtpins hat man nur noch 603 Möglichkeiten! Wenn man zwei oder drei dieser 5-stelligen, verschlüsselten Pins hat und jedes Mal nur um die 600 Möglichkeiten für die Superpin bekommt, dann hat man eine sehr gute Chance, dass nur sehr wenige dieser Möglichkeiten bei allen Angriffe in Frage kommen. Dieser kleine Überlapp ist dann die Superpin! Ich kann mir schon vorstellen, dass da nur noch 2 oder 3 übrig bleiben.

    Verbesserung, die auch gleichzeitig dein Problem mit der 5. Stelle löst und zudem noch einfacher im Kopf zu berechnen ist:
    http://en.wikipedia.org/wiki/Vigenère_cipher
    Das heißt folgende Änderungen zu deinem Verfahren:
    -Statt Addition der beiden gesamten Zahlen wird ziffernweise gerechnet, modulo 10
    -Wenn der Schlüssel zu kurz ist, wird er einfach nochmal dran gehängt. Beispiel Schlüssel "1480":
    3693 wird zu 4073
    12345 wird zu 26146
    Da ich im Kopf lieber Addiere statt Subtrahiere, würde ich es andersrum machen und beim Verschlüsseln einmalig Subtrahieren, damit ich beim (häufiger vorkommenden) Entschlüsseln bequem addieren kann. Das ändert nichts an der Sicherheit/Unsicherheit des Verfahrens (siehe unten). Beispiel wieder mit Schlüssel "1480":
    3693 wird zu 2213
    12345 wird zu 08544

    Kryptoanalyse:
    Der Vigenère Chiffre ist an sich sehr leicht zu knacken, aber die Angriffe beruhen darauf, dass man Teile des entschlüsselten Textes erraten kann, Buchstabenhäufigkeiten natürlicher Sprachen kennt und/oder sich wiederholende Worte erkennt. Die verschlüsselten Daten sind hier aber zufällige Zahlenfolgen, ohne jede Struktur. Das heißt, alle diese Angriffe funktionieren nicht und es bleibt realistisch nur Brute Force (oder andere Methoden), um an den Schlüssel zu kommen (man kann sich jedoch denken, dass der Schlüssel vermutlich um die 4 Stellen hat). Im Gegensatz zu deiner Methode kann man anhand der verschlüsselten Zahlen keine Abschätzungen über den Schlüsselraum machen*.
    Ein Nachteil der Methode ist, dass sie sehr anfällig gegenüber known-plaintext-Attacken ist. Das heißt, wenn der Angreifer eine der unverschlüsselten Zahlen von irgendwoher kennt, dann kann er den Schlüssel einfach ablesen und damit die anderen verschlüsselten Zahlen entschlüsseln. (Das gilt auch für deine jetzige Methode)

    *: Eventuell kann man Wissen über Muster in den Pins anwenden. Ich bin zum Beispiel bei einer Bank, wo ich mir keine Pin aussuchen durfte, die mit 0 beginnt. Und ich durfte mir überhaupt die Pin aussuchen! Beides sind Schwächen im System (und ich war schwer schockiert, aber die sonstigen Konditionen waren zu gut), die man ausnutzen kann. So kann der Angreifer schon einmal eine von 10 Möglichkeiten bei der ersten Ziffer von Vornherein ausschließen. Und er kann bei einem Angriff Pins priorisieren, wie sie Menschen eher wählen: Vielleicht Geburtsdaten (DDMM mit DD von 01 bis 31 und MM von 01 bis 12), einfache Muster (4567) oder Ausschließen einfacher Muster (Menschen wählen ungern zwei gleiche Ziffern nacheinander, wenn es "sicher" sein soll).



  • Meine erste Einschätzung wäre dass das Verfahren bereits völlig Wasserdicht ist. Nicht, weil das eine gute Verschlüsselung wäre (du beschreibst hier quasi ein Many-Time Pad), sondern weil das was du verschlüsseln willst (die PINs) bereits komplett zufällig sind und es keine sinnvolle Möglichkeit gibt zu überprüfen ob eine erratene PIN richtig ist. So gesehen verschlüsselst du quasi deine Super-PIN mehrmals über ein One-Time Pad. Edit: *

    Bei der Personalausweisnummer stellen sich aber einige Fragen:
    - Sind die wirklich zufällig (genug) verteilt?
    - Gibt es vielleicht eine Methode mit der man einfach überprüfen kann ob man die richtige Nummer hat? (Einfach zu bruteforcen.)
    - Würde es praktisch gesehen nicht reichen 4 der 5 Ziffern zu verschlüsseln, und wozu hält man seine Personalausweisnummer überhaupt so geheim? (Wenn du dein Portemonnaie verlierst ist da doch vermutlich auch dein Perso drin, oder nicht?)

    *: Nach dem Lesen von SeppJs Post: Das beruht natürlich auf der Annahme dass die PINs zufällig generiert wurden und dass die Länge der PINs eh bekannt sind. (Ich denke mal dass alle PINs von Bank xyz genau 4 Zeichen haben ist public knowledge.)


  • Mod

    cooky451 schrieb:

    Meine erste Einschätzung wäre dass das Verfahren bereits völlig Wasserdicht ist.

    Ich habe in meinen Post noch eine wichtige Erläuterung zu seinem Verfahren für die 5. Stelle reineditiert. Durch diese schlecht gemachte Erweiterung wird das ganze, auf den ersten Blick sicher aussehende, Verfahren kompromittiert. Eine gute Lektion bezüglich laienhafter Versuche, ein bereits gutes Verfahren durch weitere Schritte "sicherer" zu machen und dabei ungewollt das Gegenteil zu erreichen. Das ist kein Zufall, dass dabei so oft Murks heraus kommt.



  • Das "Wasserdicht" galt ja auch nur den PINs. 😉 Beim Personalausweis stellen sich noch ganz andere Fragen.


  • Mod

    Da es gerade Spaß macht: Ich finde auf dem Zettel 3 Zahlen mit sechs oder mehr Stellen und die Anleitung zum Verfahren. Die Zahlen sind 239636, 679866, 1383548. Ich folgere, dass diese Zahlen auf jeden Fall mit dem 5er-Verfahren verschlüsselt sind. Eventuell probiere ich auch noch ein paar große 5-stellige Zahlen aus.

    Ich schreibe ein Programm, dafür brauch ich 20 Minuten:

    #include <iostream>
    #include <set>
    #include <algorithm>
    #include <iterator>
    #include <iomanip>
    using namespace std;
    
    int encrypt(int pin, int super)
    {
      return (pin*(super%100)+super);
    }
    
    int main()
    {
      int original_pins[] = {17023, 48468, 98731};
      const size_t num_pins = sizeof(original_pins)/sizeof *original_pins;
    
      int super_pin = 1314;
      cout << "Super Pin ist " << super_pin
           << "\n\nOriginal\tVerschlüsselt\n";
    
      int encrypted_pins[num_pins];
      for (size_t i = 0; i < num_pins; ++i)
        {
          encrypted_pins[i] = encrypt(original_pins[i], super_pin);
          cout << original_pins[i] << '\t' << encrypted_pins[i] << '\n';
        }
    
      set<int> possible_super_pins[num_pins];
      for (size_t i = 0; i < num_pins; ++i)
        {
          cout << "Forcing " << i+1 << ". pin.\n";
          for(int pin = 0; pin < 100000; ++pin)
            {
              for (int super = 0; super < 10000; ++super)
                {
                  if (encrypt(pin, super) == encrypted_pins[i])
                    possible_super_pins[i].insert(super);
                }
            }
          cout << "Found " << possible_super_pins[i].size() << " possibilities.\n";
        }
    
      cout << "Computing intersection.\n";
      set<int> result; 
      result.swap(possible_super_pins[0]);
      for (size_t i = 1; i < num_pins; ++i)
        {
          cout << "Intersection with " << i + 1 << ". set. " << result.size() << " possibilities remain.\n";
          set<int> overlap;
          set_intersection(result.begin(), result.end(), possible_super_pins[i].begin(), possible_super_pins[i].end(), inserter(overlap, overlap.begin()));
          overlap.swap(result);
        }
    
      cout << "\nDone. Remaining possibilities:\n";
      for (set<int>::iterator i = result.begin(); i != result.end(); ++i)
        cout << setfill('0') << setw(4) << *i << '\n';
    }
    

    Nach 10-20 Sekunden hat der Computer nur noch 14 mögliche Superpins zur Auswahl gelassen:

    Super Pin ist 1314
    
    Original	Verschlüsselt
    17023	239636
    48468	679866
    98731	1383548
    Forcing 1. pin.
    Found 603 possibilities.
    Forcing 2. pin.
    Found 210 possibilities.
    Forcing 3. pin.
    Found 310 possibilities.
    Computing intersection.
    Intersection with 2. set. 603 possibilities remain.
    Intersection with 3. set. 38 possibilities remain.
    
    Done. Remaining possibilities:
    0614
    1314
    2014
    2714
    3414
    4114
    4814
    5514
    6214
    6914
    7614
    8314
    9014
    9714
    

    Bei 14 möglichen Superpins und drei Versuchen bei jeder der verschlüsselten Nummern (es sind ja sogar noch mehr 5-stellige Zahlen auf dem Zetteln, die ich auch benutzen kann), habe ich sehr bald die richtige Superpin gefunden.

    Man sieht auch sehr schön, dass aus den Endziffern der verschlüsselten Pins (36, 66, 48) sogar für einen (sehr) begabten Grundschüler schon unmittelbar ersichtlich ist, dass die Superpin in diesem Beispiel auf den Ziffern "14" enden muss.

    Das Programm ist absichtlich so gehalten, dass man leicht mit den beteiligten Pins und Verschlüsselungsverfahren herumspielen kann.
    PS: Wenn man das Vigenère-Verfahren falsch programmiert und das Modulo-Rechnen vergisst, bekommt man lustigerweise auch einen etwas eingeschränkten Schlüsselraum heraus. Da bleiben bei 3 Zahlen nur wenige 1000 Möglichkeiten, alle zusammenhängend. Also aufpassen, das man auch alles richtig macht! Wenn man's richtig macht, dann kommen auch ganz korrekt alle 10000 Möglichkeiten heraus, das heißt, ein Brute-Forcer kann ohne Zusatzinformation aus den Zahlen selber absolut gar nichts ablesen.


  • Mod

    Kryptonerd schrieb:

    Ihr findet meinen Geldbeutel mit dem Zettel auf dem folgende Pins, in verschlüsselter Form, draufstehen, welche nach obigem Verfahren berechnet wurden:

    P1 = 8412
    P2 = 13629
    P3 = 7010
    P4 = 11408
    P5 = 15620
    P6 = 9262
    P7 = 13188
    P8 = 1584900

    Frage:
    A) Wie lautet meine Superpin.
    😎 Wie lauten die richtigen Pins.

    Daraus lese ich ab:
    Die Superpin ist mindestens 1408. Die Superpin ist höchstens 7010. Wahrscheinlich aber ziemlich in der Mitte. P8 gibt mir noch 480 Möglichkeiten mit diesen Nebenbedingungen. Jetzt wende ich Psychologie und und sage, dass du keine 0 in der Superpin hast, weil du irgendwie denkst, das wäre unsicher. Bleiben noch 254 Möglichkeiten. Auch alle mit 3 sich wiederholenden Ziffern. Ok, das bringt nicht viel es bleiben noch 248. Sagen wir, es müssen auch mindestens 3 verschiedene Ziffern vorkommen. 230, bringt auch nicht viel 😡 . 4 verschiedene? Hier wird's schon gewagt, Menschen bauen gerne 2 gleiche Ziffern ein, weil sie wissen, dass echter Zufall auch mal 2 gleiche Ziffern produzieren kann und dies nachmachen wollen. Es reduziert aber den Bereich ordentlich: 126.
    Ich greife mir 8*3 Zahlen aus der Mitte:

    3962
    3968
    3975
    3985
    4125
    4126
    4132
    4138
    4152
    4165
    4176
    4195
    4275
    4325
    4328
    4356
    4516
    4518
    4536
    4572
    4625
    4725
    4823
    4825
    

    Damit klappere ich alle Automaten mit den Karten ab und hoffe somit eine Chance von 24/126 ~= 20% zu haben, mindestens einmal richtig zu liegen (und wenn ich einmal richtig liege, dann weiß ich den Rest auch). Die letzte Annahme war wie gesagt sehr gewagt, aber ich bin ziemlich zuversichtlich, dass meine Chance mindestens 24/230 ~= 10% ist, einen Treffer zu landen. Das ist doch sehr viel besser als die 24/10000 = 0.24%, die ich gehabt hätte, wenn nicht die komische Methode mit den 5 Ziffern wäre und wenn die Addition mit Modulo erfolgt wäre. Diese beiden Fehler steigern meine Chancen also um einen Faktor 40! Ein bisschen höher noch, wenn wir annehmen, dass du dir Pins hier ebenfalls selber gewählt hast und diese somit auch "menschlich" verteilt sind und nicht mit 0 oder 9 losgehen (d.h. mein "aus der Mitte" hat bessere Trefferchancen). Ich könnte meine Überlegungen zu doppelten Ziffern auch noch auf die Pins loslassen. Das bringt mir für mindestens 3 verschiedene Ziffern in der Superpin und in jeder Pin noch 152 Möglichkeiten. Wieder 24 aus der Mitte gegriffen:

    3975
    3985
    4116
    4119
    4125
    4126
    4132
    4138
    4152
    4164
    4165
    4195
    4225
    4255
    4266
    4275
    4325
    4328
    4335
    4356
    4425
    4516
    4525
    4536
    

    Ja, das halte ich für vielversprechender als meinen ersten Ansatz. Die Chancen sind ungefähr die selben, aber die Psychologie überzeugender.

    Fazit: Wenn ich bloß eine weitere 6-stellige Zahl hätte, dann hätte ich es gewiss mit > 90% geknackt. Schon diese eine bringt sehr viel.

    PS: Noch was Faszinierendes: Keine der Möglichkeiten passt zu DDMM mit Tag und Monat, da die möglichen Superpins alle mindestens auf "16" enden. Also kann ich zumindest ausschließen, dass du dein Geburtsdatum als Superpin genommen hast (hätte ich auch nicht erwartet :p ). Man kann auch eine auffällige Häufigkeit von möglichen Superpins sehen, die auf "25" enden*. Ob man damit vielleicht was machen kann, um die Chancen beim Raten zu erhöhen?

    *: Das kommt natürlich davon, dass die letzten beiden verschlüsselten Ziffern "00" sind. Daher sind Endziffern in der möglichen Superpins wie 0 und 5 besonders häufig.



  • Vielen Dank für die sehr gute Analys. Ich hatte auch schon irgendwie ein schlechtes Bauchgefühl bei der Perso Pin Variante.

    Bei nur 4 stelligen Pins lässt sich der Wertebereich von SP übrigens eingrenzem
    in dem man für die kleinste verschlüsselte Pin den größtmöglichen Wert von SP annimmt.

    Beispiel:

    Es sei gegeben:
    kleinste Verschlüsselte Pin:
    p_klein = 2548

    Dann kann SP höchstens p_klein - 1 = 2547 gross sein.
    Der mögliche Wertebereich von SP wäre also nur von 0001 bis 2547

    Aufgrund des kleinen Wertebereichs, kann es somit auch keine größere Pin
    als p_gross >= 9999 + 2547 = 12546 geben.

    Sollte die Bank vorschreiben, dass keine führenden Nullen in der Pin verwendet werden dürfen, dann sinkt dieser Wertebereich nochmals deutlich.

    Denn dann musste die reale Pin für p_klein >= 1000 sein.

    Womit gilt:
    sp = sp_klein - 1000 = 1548

    Insofern ist das Vignere Kryptoverfahren wesentlich besser.
    Das Problem ist nur, dass die Berechnung wesentlich aufwendiger ist,
    wenn man jede Ziffer einzelnen verrechnen muss und dabei berücksichtigen muss,
    dass negative Werte mit Modulo nicht trivial sind und die oftmals auch kein Taschenrechner richtig kann. Der Windows Taschenrechner kann es jedenfalls nicht
    und die Programmiersprache C kann es ohne Sonderbehandlung auch nicht.

    Ich habe mal versucht das Vignere Verfahren für eine Pin + Superbin verrechnung zu implementieren.
    Probleme gibt es noch, wenn man modulo auf negative Werte anwenden muss:

    /* vignere.c 
       C Version = C99
    */
    #include <stdio.h>
    
    /* Anzahl der Ziffern einer Zahl*/               
    int length(int zahl){
      int length = 0;
       while(zahl){
         length++;
         zahl /= 10;
       }
       return length; 
    }
    
    /* Superpin wird gemaess Vignere aneinandergereiht, wenn Pin > Superpin */
    int erweitern(int len, int sp, int sp_len){
          int power = 1;
          len = len - sp_len;
          for (int i = 0; i < sp_len - len; i++){
            power = power * 10; // wir nutzen das, anstatt double pow()
          }
          power = sp/power; // Zwischenspeichern  
          for(int i = 0; i < len; i++){
            sp = sp * 10;
          }
          sp = sp + power;
      return sp;
    }
    
    int encrypt(int pin, int sp){
      int len = length(pin);
      int sp_len = length(sp);
      if (len > sp_len){
        sp = erweitern(len, sp, sp_len);
      }
      int c[len];
      int ergebnis = 0;
      for (int i = 0; i < len; i++){
         c[i] = (pin % 10 + sp % 10) % 10;
         pin = pin/10;
         sp = sp/10;
      }
      for (int i = len-1; i > 0; i--){
        ergebnis = (ergebnis + c[i])*10;
      }
      ergebnis = ergebnis + c[0]; 
      return ergebnis;
    }
    
    int decrypt(int pin, int sp){
      int len = length(pin);
      int sp_len = length(sp);
      if (len > sp_len){
        sp = erweitern(len, sp, sp_len);
      }   
      int c[len];
      int ergebnis = 0;
      for (int i = 0; i < len; i++){
         c[i] = (pin % 10 - sp % 10) % 10;
         pin = pin/10;
         sp = sp/10;
         // printf("%i => %i\n", i, c[i]);    
      }
      for (int i = len-1; i > 0; i--){
        ergebnis = (ergebnis + c[i])*10;
      }
      ergebnis = ergebnis + c[0]; 
      return ergebnis;
    }
    
    int main()
    {
      int sp = 1314;
      int pins[] = { 1234, 4812, 17023, 3145235 };
      int size = sizeof(pins)/sizeof(pins[0]);
      int ergebnis = 0;
    
      printf("Superpin = %i\n", sp);
      for (int i=0; i < size; i++){
        printf("Pin %i = %i\n", i, pins[i]);
      }
      printf("===================\n");
      for (int i = 0; i < size; i++){
        ergebnis = encrypt(pins[i], sp);
        printf("Pin %i verschluesselt = %i\n", i, ergebnis); 
        printf("Pin %i entschluesselt = %i\n", i, decrypt(ergebnis, sp));
        printf("==\n"); 
      }
    
      // Fehler für 3. Ziffer von Pin 1 beim Entschluesseln:
      // Folgendes muesste 8 ergeben, ist aber -2
      // printf("%i\n",(((51 % 10) - (13 % 10)) % 10) );
      // Fehler für 4. Ziffer von Pin 2 beim Entschluesseln
      // Folgendes muesste 7 ergeben, ist aber -3 
      // printf("%i\n",(((20 % 10) - (13 % 10)) % 10) );
      return 0;
    }
    
    /* TODO
       Fehler des Modulo Operators korrigieren
       den Aufruf der Funktion erweitern() koennte man aus decrypt und encrypt 
       nach main auslagern. 
       Das gleiche gilt für length, sofern man decrypt & encrypt entsprechend
       anpasst.
    */
    

    Ich habe daher ein neue Idee, basierend auf dem alten Verfahren.
    Die Superpin muss einfach nur mind. 1 Stelle größer als die reale Pin sein und die Ziffer des größten Zahlenwert > 2 sein, was der Finder aber nicht wissen muss.
    Dann kann die reale Pin nämlich jeden Wert von 0001-9999 annehmen bzw. falls die Bank eine vorangehende 0 nicht erlaubt eben 1000-9999

    Bsp:
    Superpin = 23145
    Pin = 4523
    Verschlüsselt = V_Pin = SP + Pin = 27668

    Mit so einer Zahl kann man praktisch nichts anfangen.
    Da
    SP = V_Pin - 9999 = 17669
    oder
    SP = V_Pin - 0001 = 27667 sein kann.

    Entsprecht liegt dann auch der Bereich der realen Pin zwischen 1 und 9999.

    Und wann der Überlauf erfolgt, dass weiß der Finder ja nicht, er könnte lediglich vermuten, dass die größte Ziffer von SP
    bewußt bei >= 2 liegt.

    Für die Pin des Persos, oder anders gesagt 5-stellige Pins müsste man ebenso verfahren.
    Nur sollte man dann für die 5 stelligen Pins eine andere eigene Superpin mit 5+1 Stellen verwenden,
    damit die 4er Pins nicht die größte Ziffer der Superpin verraten.
    Denn wenn das geschieht, dann wird die Schutzwirkung der Pin für den Perso von 1-99999 auf nur noch 1-9999 Möglichkeiten reduziert.

    Im Kopf ist eine größere Superpin dann immer noch leichter mit dem verschlüsselten Wert zu verrechnen, als das für Kopfrechenaufgaben recht aufwendige und aus dem Grund des im Kopf rechnen auch fehleranfällige Vignereverfahren.
    Man muss sich nämlich halt einfach mal vorstellen, dass man z.B. irgendwo Abends in der Stadt ist und man dann noch Geld vom Automaten holen möchte.
    Um die Uhrzeit ist man weder besonders fit zum Rechnen noch hat man vielleicht besonders Lust und Zeit dazu.
    Und wer zum Rechnen einen Stift und Papier auspackt, der umgeht die Sicherheit.
    Das gleiche gilt, wenn man das Handy auspackt und eine selbst programmierte App darauf losläßt.


  • Mod

    Kryptonerd schrieb:

    Das Problem ist nur, dass die Berechnung wesentlich aufwendiger ist,
    wenn man jede Ziffer einzelnen verrechnen muss und dabei berücksichtigen muss,
    dass negative Werte mit Modulo nicht trivial sind und die oftmals auch kein Taschenrechner richtig kann. Der Windows Taschenrechner kann es jedenfalls nicht
    und die Programmiersprache C kann es ohne Sonderbehandlung auch nicht.

    😮 Versuch mal ein bisschen das Verfahren im Kopf zu rechnen. Das ist furchtbar einfach. Jedenfalls viel einfacher als Addition vierstelliger Zahlen. Das kann jeder Erstklässler nach einem halben Schuljahr. Bloß mit dem Computer ist es vielleicht nicht ganz so einfach, aber das Verfahren ist ja auch nicht für den Computer gedacht. Und wenn man's doch im Computer macht, dann indem man die Pin als Ziffernfolge auffasst (sollte man sowieso, denn genau das ist sie!), anstatt als Zahl (denn das ist sie nicht!). Dann ist es auch ganz einfach.



  • SeppJ schrieb:

    Daraus lese ich ab:
    Die Superpin ist mindestens 1408. Die Superpin ist höchstens 7010.

    So weit korrekt. 🙂

    Wahrscheinlich aber ziemlich in der Mitte. P8 gibt mir noch 480 Möglichkeiten mit diesen Nebenbedingungen.

    Auch das ist richtig.
    Ja, dass mit dem (P+SP) * zwei_Ziffern war keine gute Idee von mir.

    Jetzt wende ich Psychologie und und sage, dass du keine 0 in der Superpin hast, weil du irgendwie denkst, das wäre unsicher. Bleiben noch 254 Möglichkeiten. Auch alle mit 3 sich wiederholenden Ziffern. Ok, das bringt nicht viel es bleiben noch 248. Sagen wir, es müssen auch mindestens 3 verschiedene Ziffern vorkommen. 230, bringt auch nicht viel 😡 . 4 verschiedene? Hier wird's schon gewagt, Menschen bauen gerne 2 gleiche Ziffern ein, weil sie wissen, dass echter Zufall auch mal 2 gleiche Ziffern produzieren kann und dies nachmachen wollen. Es reduziert aber den Bereich ordentlich: 126.

    Die Analyse gefällt mir, wenn du es aber noch einmal versuchen möchtest, dann verrate ich besser erst einmal nicht, ob ein oder mehrere Punkte der Psychoanalyse zutreffen.

    Nur so viel,

    Ich greife mir 8*3 Zahlen aus der Mitte:

    3962
    3968
    3975
    ... (snip)
    4825
    

    Unter diesen Zahl war die Superpin nicht.
    Aber sie ist auf alle Fälle unter den 480 obigen Möglichkeiten.

    Okay, jetzt habe ich ein klein wenig verraten, 8*3 Kombinationen kannst du schonmal in der nächsten Analyse ausschließen.
    Dann wären es immer noch 480 - 24 = 456 Kombinationen, immerhin.
    Puh, was ein Glück dass ich keine zweite Pin mit 5 Ziffern verrechnet habe. 😃

    Damit klappere ich alle Automaten mit den Karten ab und hoffe somit eine Chance von 24/126 ~= 20% zu haben,

    Wenn man diese 480 Möglichkeiten nimmt und berücksichtigt, dass du 24 Versuche hast, dann hast du die Chance immerhin auf 24/480 ~= 5 % erhöht. Das ist schon ein sehr guter Wert.
    Da rächt sich mein Fehler mit der Verrechnung bei der 5-stelligen Pin mit den Ziffern der SP.

    mindestens einmal richtig zu liegen (und wenn ich einmal richtig liege, dann weiß ich den Rest auch). Die letzte Annahme war wie gesagt sehr gewagt, aber ich bin ziemlich zuversichtlich, dass meine Chance mindestens 24/230 ~= 10% ist, einen Treffer zu landen. Das ist doch sehr viel besser als die 24/10000 = 0.24%, die ich gehabt hätte, wenn nicht die komische Methode mit den 5 Ziffern wäre und wenn die Addition mit Modulo erfolgt wäre. Diese beiden Fehler steigern meine Chancen also um einen Faktor 40!

    Ja, die komische Methode mit den 5 Ziffern war ne doofe Idee von mir. Bei der Addition wird AFAIK nur der mögliche Zahlenraumn eingeschränkt und das auch nur, wenn die Superpin genauso viele Stellen hat, wie die zu verschlüsselte Pin.
    Die neue Überlegung wäre, die Superpin um eine Stelle größer zu machen als die normale Pin. Siehe mein letzter Beitrag dazu.

    Ein bisschen höher noch, wenn wir annehmen, dass du dir Pins hier ebenfalls selber gewählt hast und diese somit auch "menschlich" verteilt sind und nicht mit 0 oder 9 losgehen (d.h. mein "aus der Mitte" hat bessere Trefferchancen). Ich könnte meine Überlegungen zu doppelten Ziffern auch noch auf die Pins loslassen. Das bringt mir für mindestens 3 verschiedene Ziffern in der Superpin und in jeder Pin noch 152 Möglichkeiten. Wieder 24 aus der Mitte gegriffen:

    3975
    3985
    4116
    ... (snip)
    4525
    4536
    

    Ja, das halte ich für vielversprechender als meinen ersten Ansatz. Die Chancen sind ungefähr die selben, aber die Psychologie überzeugender.

    Ohne zu viel zu verraten, aber leider auch nicht dabei.
    Dein Psychologieansatz ist dennoch gut gedacht.

    Fazit: Wenn ich bloß eine weitere 6-stellige Zahl hätte, dann hätte ich es gewiss mit > 90% geknackt. Schon diese eine bringt sehr viel.

    Das glaube ich dir, jetzt wo du das mit deinem vorherigen C++ Code aufgezeigt hast, sofort.

    PS: Noch was Faszinierendes: Keine der Möglichkeiten passt zu DDMM mit Tag und Monat, da die möglichen Superpins alle mindestens auf "16" enden. Also kann ich zumindest ausschließen, dass du dein Geburtsdatum als Superpin genommen hast (hätte ich auch nicht erwartet :p ). Man kann auch eine auffällige Häufigkeit von möglichen Superpins sehen, die auf "25" enden*. Ob man damit vielleicht was machen kann, um die Chancen beim Raten zu erhöhen?

    *: Das kommt natürlich davon, dass die letzten beiden verschlüsselten Ziffern "00" sind. Daher sind Endziffern in der möglichen Superpins wie 0 und 5 besonders häufig.

    Wenn du es nochmal versuchen möchtest oder ich es auflösen soll, dann sag mir Bescheid. 🙂



  • SeppJ schrieb:

    Kryptonerd schrieb:

    Das Problem ist nur, dass die Berechnung wesentlich aufwendiger ist,
    wenn man jede Ziffer einzelnen verrechnen muss und dabei berücksichtigen muss,
    dass negative Werte mit Modulo nicht trivial sind und die oftmals auch kein Taschenrechner richtig kann. Der Windows Taschenrechner kann es jedenfalls nicht
    und die Programmiersprache C kann es ohne Sonderbehandlung auch nicht.

    😮 Versuch mal ein bisschen das Verfahren im Kopf zu rechnen. Das ist furchtbar einfach. Jedenfalls viel einfacher als Addition vierstelliger Zahlen. Das kann jeder Erstklässler nach einem halben Schuljahr. Bloß mit dem Computer ist es vielleicht nicht ganz so einfach, aber das Verfahren ist ja auch nicht für den Computer gedacht. Und wenn man's doch im Computer macht, dann indem man die Pin als Ziffernfolge auffasst (sollte man sowieso, denn genau das ist sie!), anstatt als Zahl (denn das ist sie nicht!). Dann ist es auch ganz einfach.

    Ich werd es mal versuchen.



  • Kyptonerd schrieb:

    Mal angenommen meine Pins wären die folgenden:
    G = Girocard = 1234
    K = Kreditkarte (die für den Automaten) = 4812
    P = Personalausweis (ja, die hat eine Ziffer mehr) = 17023
    Nun merke ich mir eine vierstellige Superpin, die nutze ich dazu, um obige Pins zu verrechnen.

    fünfstellig wäre besser.

    Kyptonerd schrieb:

    Auffälligkeiten gibt es nur dann, wenn G + S den Wert 10000 übersteigt.

    Rechne doch ohne Übertrag!

    G=1234
    S=8376
    ------
    9500

    Kyptonerd schrieb:

    Dann weiß der Angreifer aber nur, dass eine der Pins G oder S so groß ist, dass es in Kombination beider zu einem Überlauf kommt.
    Oder anders gesagt, mindestens eine Pin G oder S ist >= 5000.

    Nö. 9999+0002=10001, mindestens eine ist größer als 0001.

    Kyptonerd schrieb:

    Komplizierter wird es allerdings bei der 5 stelligen Pin P für den Perso.
    Damit die erste Ziffer nicht verraten wird, habe ich mir ein folgendes überlegt.

    Wenn man definiert, dass P zuerst mit den ersten beiden Stellen der Superpin multipliziert wird,
    dann erhält man eine recht große Zahl und am Ende wird diese Zahl dann noch mit der S wie gehabt addiert.

    Fühlt sich für mich barbarisch unsicher an, Man betrachte mehrere aufgeschriebene PINs und berechne deren paarweise Differenzen und deren GGT. Das sind die ersten beiden Stellen.

    Und Du willst auf der Straße eine sechstellige Zahl durch eine zweistellige teilen? Nicht ohne Taschenrechner. Und dann, wenn der eh zu benutzen ist, kannste auch in die Vollen greifen. Wähle als S irgend eine vierstellige Zahl. Schreib auf P*S+rand()%S.
    Oder wähle eine

    Kyptonerd schrieb:

    Wer ein besseres Verschlüsselungsverfahren, das ebenso einfach im Kopf zu berechnen ist, kennt, aber sicherer ist, der kann das natürlich gerne nennen.

    Also ich schreibe eine Vorwahl davor und willkürliche Zahlen dahinter.

    Vanessa 030-471178998
    

    P=4711. Dazu mach halt noch Ziffernweises addieren ohne Übertrag. Sagen wie mal K=1234

    Vanessa 030-594578998
    

    Aber die Krypto kannste Dir auch sparen. Subversive Elemente dekryptieren nix, die geben Dir eins auf die Klappe und nehmen Dir einfach Dein Bargeld ab.



  • Würde einfach rotieren. ZB key 2233 würde aus 1234 -> 3467 machen.
    Kryptographisch Murks aber praktisch sehr sicher.



  • Ethon schrieb:

    Würde einfach rotieren. ZB key 2233 würde aus 1234 -> 3467 machen.
    Kryptographisch Murks aber praktisch sehr sicher.

    Du meinst, wenn deine Pin 9999 und dein key 2222 wäre, dass das dann durch rotieren ohne Übertragg 1111 geben würde?

    Ja, das wäre eine sehr elegante Möglichkeit, zumal die auch sehr einfach im Kopf zu berechnen ist.

    Aber ich hätte jetzt noch eine Variante, für die 4-er Pin bei einer 5 stelligen Superpin.

    Mit einer 5 stelligen Superpin ist die 5 stellige Perso Pin ja absolut sicher.
    Aber damit man bei einer vierstelligen 4er Pin nicht die größte Ziffer der Superpin verrät, könnte man hier auch die 5. Ziffer mit der Quersumme der 4er Pin verrechnen.

    Also z.B. so:

    SP = 13149
    P = 3213

    Gibt durch rotieren erst einmal:

    16352

    Und um 1 wegzukriegen, nimmt man die Quersumme von P,
    also 3 + 2 + 1 + 3 = 9 und verrechnet die mit der Superpin,
    was dann

    06352

    ergeben würde.


  • Mod

    Kryptonerd schrieb:

    Ethon schrieb:

    Würde einfach rotieren. ZB key 2233 würde aus 1234 -> 3467 machen.
    Kryptographisch Murks aber praktisch sehr sicher.

    Du meinst, wenn deine Pin 9999 und dein key 2222 wäre, dass das dann durch rotieren ohne Übertragg 1111 geben würde?

    Ja, das wäre eine sehr elegante Möglichkeit, zumal die auch sehr einfach im Kopf zu berechnen ist.

    😕 Das ist doch genau das, was jeder der hier im Thread geantwortet hat, vorgeschlagen hat.

    Aber ich hätte jetzt noch eine Variante, für die 4-er Pin bei einer 5 stelligen Superpin.

    Mit einer 5 stelligen Superpin ist die 5 stellige Perso Pin ja absolut sicher.
    Aber damit man bei einer vierstelligen 4er Pin nicht die größte Ziffer der Superpin verrät, könnte man hier auch die 5. Ziffer mit der Quersumme der 4er Pin verrechnen.

    Also z.B. so:

    SP = 13149
    P = 3213

    Gibt durch rotieren erst einmal:

    16352

    Und um 1 wegzukriegen, nimmt man die Quersumme von P,
    also 3 + 2 + 1 + 3 = 9 und verrechnet die mit der Superpin,
    was dann

    06352

    ergeben würde.

    Sieht auf den ersten Blick sicher aus, aber warum nicht so, wie von allen anderen Leuten hier vorgeschlagen? Einfach wieder von vorne anzufangen ist doch viel einfacher. Hier bringst du doch bloß wieder Informationen über die Gesamtpin ein, die eventuell ausgenutzt werden können. Sachen, wie die Quersumme zu bilden, macht man bei Dingen wie Barcodes und ISBN, wenn es darum geht, dass Information möglichst gut wieder hergestellt werden kann, wenn man nur einen Teil kennt. Hier willst du doch das Gegenteil!
    Wenn der Angreifer nun auf irgendeine Weise die erste Ziffer kompromittiert, so kennt er nun die Quersumme aller anderen Ziffern der Superpin. Damit kann man viel mehr anfangen, als wenn er nur eine Ziffer der Superpin kennen würde.

    PS: Ok, hier macht es keinen Unterschied, ob man eine Ziffer wiederholt oder die Quersumme bildet, weil das Kompromittieren der Quersumme modulo 10 genau so viel Information einbringt, wie das Kompromittieren einer einzelnen Ziffer. (Weil es 10 Möglichkeiten für die Quersumme modulo 10 gibt, schränkt man den Schlüsselraum um den Faktor 10 ein, genau wie bei einer einzelnen Ziffer) Was du hier mitnehmen solltest ist, dass jede einfache mathematische Abhängigkeit, die du(!) dir ausdenken kannst, vom Angreifer trivial zurück gerechnet werden kann. Du kannst nicht durch Mathematik (wie Quersummenziehen) neue Geheiminformation erfinden, die einfach nicht da ist. Im schlimmsten Fall, gibst du sogar Teile des Geheimnisses preis, wie bei deinem ersten Versuch aus dem Eingangsbeitrag. Immerhin hast du hier die Quersumme modulo 10 genommen, wodurch die Sicherheit des neuen Verfahren (wie oben erklärt) auf das gleiche hinaus läuft, als hättest du nichts getan; also immerhin kein Verlust. Wenn du das neue Verfahren aber nur ein klein wenig abgeändert hättest und nur die Quersumme ohne modulo genommen hättest, dann hättest du wieder einen Fall, in dem das neue Verfahren echt unsicherer geworden wäre, als wenn du nichts getan hättest. Denn aus der absoluten Quersumme kann man tatsächlich mehr Information entnehmen als in einer einzelnen Ziffer steckt.


  • Mod

    Hier noch das zugehörige Testprogramm, falls du es nicht glaubst:

    #include <stdio.h>
    
    int main()
    {
      int i, j, k, l, q, N;
      puts("Quersumme modulo 10 bekannt. Verbleibende Möglichkeiten für 4 Ziffern:");
      for (q = 0; q < 10; ++q)
        {
          N = 0;
          for (i = 0; i < 10; ++i)
            for (j = 0; j < 10; ++j)
              for (k = 0; k < 10; ++k)
                for (l = 0; l < 10; ++l)
                  {
                    if ((i + j + k + l) % 10 == q)
                      ++N;
                  }
          printf("%d: %d Möglichkeiten\n", q, N);
        }
      puts("Quersumme bekannt. Verbleibende Möglichkeiten für 4 Ziffern:");
      for (q = 0; q < 37; ++q)
        {
          N = 0;
          for (i = 0; i < 10; ++i)
            for (j = 0; j < 10; ++j)
              for (k = 0; k < 10; ++k)
                for (l = 0; l < 10; ++l)
                  {
                    if ((i + j + k + l) == q)
                      ++N;
                  }
          printf("%d: %d Möglichkeiten\n", q, N);
        }
      return 0;
    }
    
    Quersumme bekannt. Verbleibende Möglichkeiten für 4 Ziffern:
    0: 1 Möglichkeiten
    1: 4 Möglichkeiten
    2: 10 Möglichkeiten
    3: 20 Möglichkeiten
    4: 35 Möglichkeiten
    5: 56 Möglichkeiten
    6: 84 Möglichkeiten
    7: 120 Möglichkeiten
    8: 165 Möglichkeiten
    9: 220 Möglichkeiten
    10: 282 Möglichkeiten
    11: 348 Möglichkeiten
    12: 415 Möglichkeiten
    13: 480 Möglichkeiten
    14: 540 Möglichkeiten
    15: 592 Möglichkeiten
    16: 633 Möglichkeiten
    17: 660 Möglichkeiten
    18: 670 Möglichkeiten
    19: 660 Möglichkeiten
    20: 633 Möglichkeiten
    21: 592 Möglichkeiten
    22: 540 Möglichkeiten
    23: 480 Möglichkeiten
    24: 415 Möglichkeiten
    25: 348 Möglichkeiten
    26: 282 Möglichkeiten
    27: 220 Möglichkeiten
    28: 165 Möglichkeiten
    29: 120 Möglichkeiten
    30: 84 Möglichkeiten
    31: 56 Möglichkeiten
    32: 35 Möglichkeiten
    33: 20 Möglichkeiten
    34: 10 Möglichkeiten
    35: 4 Möglichkeiten
    36: 1 Möglichkeiten
    

Anmelden zum Antworten