Hallo Leute,
vllt koennt auch ihr damit was anfangen. Dieser Thread hat mich zum nachdenken angeregt. Ich habe inzwischen relativ viele lange und bunte Passwoerter. Die moechte ich nicht digital rumliegen haben, ist mir zu unsicher und merken kann ich mir die auch nur schlecht, einfach weil staendig neue dazu kommen. Ich habe mir folgendes ueberlegt. Warum sich kein Cardan-Gitter (
https://de.wikipedia.org/wiki/Cardan-Gitter) fuer die Hosentasche zu legen?
Ich stelle mir das wie folgt vor, man erzeugt einen grossen zufaelligen Text und versteckt dort die Passwoerter drin. Zusaetzlich erstellt man die entsprechenden Gitter bzw Schablone. Ein Text kann prinzipiell mehrere Passwoerter enthalten und eine Schablone mehrere Passwoerter dekodieren. Die Idee ist nun, dass man die Schablonen - am besten aus Pape oder Plastik - im Geldbeutel hat, aehnlich wie diese kleinen Kalender oder Kreditkarten. Den Text traegt man am Schluesselbund. Man muss schon Beides verlieren damit die Passwoerter in falsche Haende geraten koennen.
Ich habe mir jetzt ein kleines Java-Programm zusammengehackt, welches mir die Arbeit der Erzeugung des Textes aus den Passwoertern und der dazugehoerigen Schablonen abnimmt (siehe ganz unten). Der Code ist vollkommen frei, macht damit was ihr wollt. Jedoch uebernehme ich keine Verantwortung falls er Bugs enthaelt und die Passwoerter nicht korrekt entschluesselt werden. Ein Bsp.-Resultat fuer drei Passwoerter sieht dann wie folgt aus (siehe unten). Ihr koennt ja mal versuchen die Schluessel rauszubekommen, die Zahlen rechts von den Schablonen markieren die Positionen der Buchstaben im Passwort (falls Mist rauskommt, dann hat sich noch nen Fehler eingeschlichen, der Code ist aber ziemlich simpel und deshalb leicht zu korrigieren ...). Auf den ausgedruckten Schablonen liessen sich die Loecher mit Linien verbinden um die Reihenfolge anzugeben. Eine Mehrfachschablone liesse sich durch "uebereinanderlegen" mehrer Einerschablonen erzeugen, verschiedene Passwoerter waeren durch getrennte Verbindungslininen markiert, gerne auch mehrfarbig:
Edit: Mist, die Dekodierung der Schluessel geht ja in O(1)
, naja, wenigstens koennt ihr so den Algo ueberpruefen.
+------------------------------------------+
|_VLfNs^@`*uej4jL6fFt;V*g$pBQJ==4LuM2k3=W,J|
|9vB%E)LFKiBw:gry}U7%.?BoWqx,v'!ZGc@e5h({IU|
|p9tpme;&ck=`8xax(#B7a93oe:!,3Vnc4LB0b60Sjn|
|4BM=)i6-PePSs[y;6:8J&E[*LqTBDLghJxf(i8%m=_|
|^9%*T9TkMZTeVC66&"3s.=*9d?Tu*W]/rH?v'umWSP|
|+e^V3\'mYX=!0(fF.XSM%l7k4n]V;pOut/OsR.U][^|
|.3x03lK$/>T`O_QPy_JNu8^}A51jpr_vK*BTlhotoa|
|R"zk^-\U<(TU'DgCrKN*1U-:L=2ym_0GKu7`|}i},z|
|pO"pe)&o'7#`|usgN1Q=QrJUHtwHA].2]|j|,9F)#(|
|^sLAT"b}tisQJ/xi-+P4Fb>Mt:e9#MCaK4D[\H2?6s|
|;e\L.EkGI*,c"8k6}M]@_Rb`=[zbOn"#e"A"a*g4+h|
|zDbe^Q0t[[.sC|&NQ#=:fWy(u/Jgd*Rv6n`rneSN:B|
|huR}*Ymz{POtl.xoU|lB>Oze-Q1zVfb?j|E}\($j:t|
|sTrk|rN,"iT4\ENd(G85|'o$&i2lhlNuol*@[;]kZ\AH{8Gh{C04")bz(EA3w25|
|p`kX7Z#FqIv?>Slj{e(334t?]7e8OIH#pR,q;X(iNF|
|^o#e3ZYs^6v2)T]+2I#SH-YX011sf#esD*XEN%43{t|
|yG.4Cw&{dY@A:O#7LD{,qV9PC\3b3t{Fp^S}qG1z4Z|
|/Y-]TT)`q0Ih!0Kkd-+c4HRHRu`d:cr?)6;CpL_?[;|
|M/FgL|f|sL,4Y#hrG]es|X(WK5/JSZyi5$T-8/5h6l9U,FY0uxo*@[h{itg\*^k|
|'BuhYzQ^7CO,\v28`w2QCO`azyy#}N6ld9h5h)Y,ju|
|Fbj!Bt)o5!{T{Y>gnte.HL{*SPU)`Z_g(puIk;ancF|
|aVJF_^00AebR%5>p0r1&qo5;z,3YTyH):jyZ5EX^,u|
|!5CGu0F4Z1A9Ji8N{vumEfCRS|
+------------------------------------------+
+------------------------------------------+
| * | 15
| * | 13
| * | 9
| |
| * | 1
| |
| * | 6
| |
| |
| * *| 4 14
| |
| * | 2
| |
| |
| * * * | 17 12 11
| |
| * * | 5 3
| * | 8
| * | 7
| * | 16
| * | 10
| |
| |
| |
| |
+------------------------------------------+
+------------------------------------------+
| * | 17
| |
| |
| * | 14
| * | 13
| * | 12
| * | 8
| |
| |
| * | 16
| |
| * * | 3 5
|* | 11
| * | 7
| * | 1
| |
| |
| |
| * | 10
| * | 15
| * | 4
| * * | 2 18
| * | 6
| |
| *| 9
+------------------------------------------+
+------------------------------------------+
| |
| |
| * | 6
| |
| * | 7
| |
| |
| |
| |
| * | 3
| * * *| 10 14 11
| |
| * | 18
|* * | 15 1
| |
| * | 12
| * *| 16 5
| * | 4
| * * | 13 2
| |
| |
| |
| * | 9
| * * | 8 17
| |
+------------------------------------------+
Der Code:
import java.util.*;
public class Main {
private Random rand;
/**
* @param args
*/
public static void main(String[] args) {
// main method
Random rand = new Random();
// size of text array
int n = 25; //new Integer(args[0]);
int m = 42; //new Integer(args[1]);
// keys to encrypt
//String[] keys = new String[args.length - 2];
//for (int i = 0; i < args.length - 2; i++)
// keys[i] = args[i + 2];
String[] keys = new String[]{"erster_Schluessel", "zweiter_Schluessel", "dritter_Schluessel"};
// as many grilles as keys
char[][][] grilles = new char[keys.length][n][m];
// as many lists for character number as keys
int[][][] lists = new int[keys.length][n][m];
// array for text
char[][] text = new char[n][m];
// array for already used cells of array
boolean[][] set = new boolean[n][m];
// fill array with random text
for (int j = 0; j < m; j++){
for (int i = 0; i < n; i++){
int r = rand.nextInt(93) + 33;
text[i][j] = (char)r;
}
}
// encrypt keys
for (int k = 0; k < keys.length; k++){
// create empty grille
for (int j = 0; j < m; j++)
for (int i = 0; i < n; i++)
grilles[k][i][j] = ' ';
// key to be encrypted
String key = keys[k];
// encrypt key
insertText(key, text, grilles[k], set, lists[k], rand);
}
// print text
printArray(text, null);
// print grilles
for (int k = 0; k < keys.length; k++)
printArray(grilles[k], lists[k]);
}
public static void insertText(String key, char[][] text, char[][] grille, boolean[][] set, int[][] list, Random rand){
// encodes key in text and marks grille, set and list with the corresponding character
int n = text.length; // vertical size of text
int m = text[0].length; // horizontal size of text
// encrypt key
for (int j = 0; j < key.length(); j++){
// sample some cell of text array
int ri = rand.nextInt(n);
int rj = rand.nextInt(m);
// make sure that it is not already used
while (set[ri][rj]){
ri = rand.nextInt(n);
rj = rand.nextInt(m);
}
list[ri][rj] = j + 1; // save character number of key
text[ri][rj] = key.charAt(j); // put character into text
grille[ri][rj] = '*'; // mark hole of current grille
set[ri][rj] = true; // mark cell as being used
}
}
public static void printArray(char[][] array, int[][] list){
// prints text and grilles on the screen
// print horizontal boarder on the top
System.out.print("+");
for (int j = 0; j < array[0].length; j++)
System.out.print("-");
System.out.println("+");
// print text and left and right boarder as well as character number
for (int i = 0; i < array.length; i++){
System.out.print("|");
for (int j = 0; j < array[0].length; j++)
System.out.print(array[i][j]);
System.out.print("| ");
// print character numbers in the current line
if (list != null)
for (int j = 0; j < list[0].length; j++)
if (list[i][j] != 0)
System.out.print(list[i][j] + " ");
System.out.println();
}
// print horizontal boarder on the bottom
System.out.print("+");
for (int j = 0; j < array[0].length; j++)
System.out.print("-");
System.out.println("+");
System.out.println();
}
}