Wolf: Verschlüsselung

Guten Tag,

ich programmiere mir gerade in PHP eine einfache Seite in der ich Verträge, Rechnungen usw. eingebe, damit ich automatisch daran erinnert werde was zu tun ist.

Die Seite überlege ich online zu stellen (bislang lokal), aber hab Sicherheitsbedenken, daher:

Gibt es eine Möglichkeit vierstellige Zahlen mit einem Schlüsselwort so zu verschlüsseln das die Wahrscheinlichkeit eines Treffers bei <0,1% liegt?

habe mir folgendes überlegt gehabt:

  
$1, $2, $3, $4 sind die einzelnen Ziffern des Schlüssels.  
  
for($1 == 1) { $erste_ziffer = 5}  
for($1 == 2) { $erste_ziffer = 8}  
for($1 == 3) { $erste_ziffer = 3}  
for($1 == 4) { $erste_ziffer = 2}  
for($1 = ....  
  
for($2 == 1) { $zweite_ziffer = 7}  
for($2 == 2) { $zweite_ziffer = 4}  
for($2 == 3) { $zweite_ziffer = 5}  
for($2 == 4) { $zweite_ziffer = 0}  
for($2 = ....  
  
for($3 == 1) { $dritte_ziffer = 1}  
for($3 == 2) { $dritte_ziffer = 4}  
  
for($2 == 1) { $vierte_ziffer = 9}  
for($2 == 2) { $vierte_ziffer = 8}  

Dann hätte man den Prüfwert von z.B. 4422 und als Resultat 2048. Da es beim jeder Ziffer 10 Möglichkeiten gibt, ist die Wahrscheinlichkeit eines zufälligen Treffers bei P(treffer) = (1/10)^4 = 0,0001 was 0,01% entspricht und da jedes Ergebnis gleich Wahrscheinlich ist, kann man es durch Logik nicht weiter eingrenzen (z.B. abgleich mit Wörterbuch oder ähnlichem).

Aber... mit dem Schlüssel 4422 könnte ich jetzt nicht 1024 heraus bekommen, was ich aber für den zweiten Schlüssel ggf. wöllte.

--> Gibt es eine Möglichkeit mehrere unterschiedliche, vierstellige (am besten n-stellig) Zahlen mit EINEM vierstelligem Schlüsselwort so zu verschlüsseln das die Wahrscheinlichkeit eines Treffers bei <0,01% liegt?

Danke,
Wolf

  1. $1, $2, $3, $4 sind die einzelnen Ziffern des Schlüssels.

    for($1 == 1) { $erste_ziffer = 5}
    for($1 == 2) { $erste_ziffer = 8}
    for($1 == 3) { $erste_ziffer = 3}
    for($1 == 4) { $erste_ziffer = 2}
    for($1 = ....

    for($2 == 1) { $zweite_ziffer = 7}
    for($2 == 2) { $zweite_ziffer = 4}
    for($2 == 3) { $zweite_ziffer = 5}
    for($2 == 4) { $zweite_ziffer = 0}
    for($2 = ....

    for($3 == 1) { $dritte_ziffer = 1}
    for($3 == 2) { $dritte_ziffer = 4}

    for($2 == 1) { $vierte_ziffer = 9}
    for($2 == 2) { $vierte_ziffer = 8}

      
    ist natürlich immer nen IF, KEIN FOR!, gemeint :D LG Wolf xD  
    
    
  2. --> Gibt es eine Möglichkeit mehrere unterschiedliche, vierstellige (am besten n-stellig) Zahlen mit EINEM vierstelligem Schlüsselwort so zu verschlüsseln das die Wahrscheinlichkeit eines Treffers bei <0,01% liegt?

    Ich fürchte ich kann dir nicht folgen :)

    Wie wärs, wenn du dir nicht selbst irgend eine Verschleierung zurecht legst sondern ordentlich mit einem halbwegs tauglichen und erprobten Algorithmus verschlüsselst - AES z.B. - das können verschiedene DBMS bereits nativ. Zwar gilt AES-768 und abwärts nicht mehr als kryptographisch sicher_, in deinem Fall wird das aber wohl bei weitem ausreichen.

  3. Hi Wolf.

    Die Seite überlege ich online zu stellen (bislang lokal), aber hab Sicherheitsbedenken, daher:

    Gibt es eine Möglichkeit vierstellige Zahlen mit einem Schlüsselwort so zu verschlüsseln das die Wahrscheinlichkeit eines Treffers bei <0,1% liegt?

    Verschlüsselungen haben den Zweck, Daten für Leute unlesbar zu machen, die diese Daten bekommen, aber nicht bekommen sollen. Das allerbeste ist, sofern möglich, immer, dafür zu sorgen, dass diese Leute die Daten gar nicht erst bekommen.

    Soll heißen: Vor allem anderen solltest Du Deine vorhandene Energie in ein Login-System investieren, das andere Leute als Dich aussperrt. Wenn Du zusätzlich die Daten verschlüsseln willst, dann noch folgende Punkte:

    Da es beim jeder Ziffer 10 Möglichkeiten gibt, ist die Wahrscheinlichkeit eines zufälligen Treffers bei P(treffer) = (1/10)^4 = 0,0001 was 0,01% entspricht und da jedes Ergebnis gleich Wahrscheinlich ist, kann man es durch Logik nicht weiter eingrenzen (z.B. abgleich mit Wörterbuch oder ähnlichem).

    Das ist ein ziemlich gefährlicher Irrtum: höchstwahrscheinlich (je nach genauer Natur der Daten) sind die Ziffern sehr weit davon entfernt, gleich wahrscheinlich zu sein:

    1.: Falls Du etwa Rechnungsbeträge hast, dann werden die auftretenden Nachkommastellen alles andere als gleichverteilt sein - die Ziffern 0, 5 und
    9 werden dort sehr viel häufiger auftreten als die anderen.

    2.: Selbst wenn man die Nachkommastellen beiseite lässt - solche Daten wie Rechnungs- und andere Geldbetraäge sind im allgemeinen *logarithmisch* gleichverteilt, und daher sind die Ziffern (etwas überraschenderweise) alles andere als selbiges (siehe etwa Benfords Gesetz).

    Soll heißen: Wenn ein Angreifer nur hinreichend viele Deiner Daten zur Verfügung hat, die er vergleichen kann, dann hat er Deine Verschlüsselung schneller geknackt, als Du mit dem Finger schnippen kannst. Was Du zuallermindest tun musst, ist, Deinen Schlüssel (d.h. die Zuordnungen für die Ziffernvertauschungen) dynamisch zu halten, d.h. etwa aus dem Erstellungsdatum jedes Dokumentes zu generieren, damit keine großen Mengen von mit demselben Schlüssel verschlüsselten Daten entstehen. Was Du noch besser tust, hat suit je bereits geschrieben.

    Aber... mit dem Schlüssel 4422 könnte ich jetzt nicht 1024 heraus bekommen, was ich aber für den zweiten Schlüssel ggf. wöllte.

    Dat hab ich jetzt nicht verstanden. :-( 4422 ist hier auch nicht Dein Schlüssel.

    --> Gibt es eine Möglichkeit mehrere unterschiedliche, vierstellige (am besten n-stellig) Zahlen mit EINEM vierstelligem Schlüsselwort so zu verschlüsseln das die Wahrscheinlichkeit eines Treffers bei <0,01% liegt?

    Was meinst Du eigentlich mit "Treffer"? (Das ist ne echte Frage, versuch die mal präzise zu beantworten)

    Die Antwort wird jedenfalls "nein" sein, denn ne Trefferwahrscheinlichkeit von 0,01% hat man bereits beim schlichten Raten Deines Schlüssels. Drunter wirstes dann kaum kriegen. Im übrigen hast Du hier aber auch kein vierstelliges Schlüsselwort, Dein Schlüssel ist größer.

    Viele Grüße,
    der Bademeister