App für Protected Document Exchange App für geschützte E2E-Ressourcen

Nach Kant entspricht Wahrscheinlichkeit einem Fürwahrhalten: Zur Lehre von der Gewissheit unsers Erkenntnisses gehört auch, die Lehre von der Erkenntniss des Wahrscheinlichen, das als eine Annäherung zur Gewissheit anzusehen ist.

Was ist Gewißheit? Was ist Sicherheit? Zur Datensicherheit gehören die Begriffe Vertraulichkeit (Confidentiality), Authentifizierung (Authentication), Integrität (Integrity), Verbindlichkeit (Commitment), Identität (Identity) und die Begriffe geheim (secret), vertraulich (confidential), intern (internal), öffentlich (public).


Projekt-Kurzfassung Was soll gemacht werden?

Bei "Cloud Storage" werden Anforderungen "non-proprietärer-Art" an "Protected Document Exchange" gestellt. Eine End-to-End-Verschlüsselung soll sicher sein, auch wenn kein SSL-Kommunikationskanal verfügbar ist.

Die "self-made"-App kann helfen "geschützte HTML5-Web-Seiten" zu erstellen, die als Internet-Ressourcen ( End to End ) verschlüsselt werden, selbst dann, wenn kein SSL-Kommunikationskanal verfügbar ist. Es wird eine robuste "self-made"-App entwickelt und getestet, die lokal-offline "geschützte HTML5-Seiten" erstellen kann. Zum Entschlüsseln und Anzeigen der Seite wird beim Aufruf das geheime Passwort abgefragt.

Eine "self-made"-Erstellungs-App für verschlüsselte Ressourcen ist zu entwickeln. Die App kann/soll "self-made"-Software-Komponenten verwenden, wie z.B.

Das Ergebnis sieht grob etwa so aus: crypt-seite-erstellen . Hier ist ein Anfang für das Experimentieren.

Einführendes ( Hintergund-Infos ) EU und W3C-CryptoKey

Zum Schutz personenbezogener Daten in der EU gehört der Artikel 8 ( CHARTA DER GRUNDRECHTE DER EUROPÄISCHEN UNION 2000/C 364/01). Dort steht:

Schutz personenbezogener Daten
(1) Jede Person hat das Recht auf Schutz 
    der sie betreffenden personenbezogenen Daten.
(2) Diese Daten dürfen nur nach Treu und Glauben 
    für festgelegte Zwecke und mit Einwilligung 
    der betroffenen Person oder auf einer sonstigen 
    gesetzlich geregelten legitimen Grundlage 
    verarbeitet werden. Jede Person hat das Recht, 
    Auskunft über die sie betreffenden erhobenen 
    Daten zu erhalten und die Berichtigung der 
    Daten zu erwirken.

Browser werden heute ( 2015 ) zu "Allzweckwerkzeugen" für dynamische Web-Sites und Internet-Apps. Bei Cloud Storage werden "abhörsichere" und "non-proprietäre" Anforderungen an "Protected Document Exchange" gestellt ( Industrie- und Werkspionage ). ein Virtueller Marktplatz, Elektronischer Handel, Internethandel, Online-Handel, Portale, Shopping-Apps, E-Commerce (en.wikipedia, Timeline) benötigen krypthografiche Methoden. Oft werden 2015 unterstützt: RSA encrypt/decrypt (PKCS#1 v1.5, OAEP, and PSS), AES-CBC and GCM encrypt/decrypt, SHA-256/384/512, HMAC with supported hash functions, PRNG (AES-CTR based) specified by NIST, ECDH, ECDSA, and KDF (Concat mode).

Internet-Ressourcen sollen möglichst End to End verschlüsselt werden, insbesondere, wenn kein SSL-Kommunikationskanal verfügbar ist.

Bei W3C ist ein Web Cryptography API - Entwurf ( W3C Candidate Recommendation 11 December 2014 ), Algorithm Overview verfügbar.

interface CryptoKey {
  readonly attribute KeyType type;  // "public", "private" and "secret". 
  readonly attribute boolean extractable;
  readonly attribute object algorithm;
  readonly attribute object usages; // "encrypt", "decrypt", "sign", "verify", 
                        // "deriveKey", "deriveBits", "wrapKey" and "unwrapKey"
};
Hinweise ( Unicode-Zeichen nach Ordinal-Number ) UTF-8 nach byte-Str und hex-Folge

Brauchbare ECMAScript-Funktionen für Unicode-Zeichenketten und Ordinalzahlen der Zeichen:

char_base36 = dez_num.toString(36) 
char_base2 = dez_num.toString(2) 

int_num_base36 = parseInt(str, 36)
int_num_base16 = parseInt(str, 16)
int_num_base10 = parseInt(str, 10)
int_num_base2  = parseInt(str,  2)

unicode_num = str.charCodeAt(idx) 
unicode_str = String.fromCharCode(unicode_nums) 
Hinweise ( String-Basen ) UTF-8 nach byte-Str und hex-Folge

Wie können UTF-8-Texte in einen Byte-String oder eine hex-Zeichenfolge gewandelt werden?

Hinweise ( XOR-Faltung )

xor ist eine bitweise Verknüpfung. Zu einem Byte-Zeichen gehört ein UTF-8-Unicode-Wert kleiner als 256. Was ergibt sich, wenn "Walter" zeichenweise xor mit "+" verknüpft wird?

 Byte-Zeichen-weise xor-Verknüpfung von "Walter" und "+":
                      xor-mit   
    hex     bin       dez 43       ergibt 
 W = 57   01010111 ^ 00101011  =  01111100  = |
 a = 61   01100001 ^ 00101011  =  01001010  = J
 l = 6c   01101100 ^ 00101011  =  01000111  = G
 t = 74   01110100 ^ 00101011  =  01011111  = _
 e = 65   01100101 ^ 00101011  =  01001110  = N
 r = 72   01110010 ^ 00101011  =  01011001  = Y

In der modernen Krypthografie sind Shift und xor-Verknüpfungen ( wegen den Symetrie-Eigenschaften ) wesentlich. Bsp.:

// Bsp: wrapping at 2^32 mit 16-bit operationen
function safe_add(x, y) {
  var msw, lsw = (x & 0xFFFF) + (y & 0xFFFF);
  msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}

Siehe z.B. Extended_Tiny_Encryption_Algorithm: Extended_Tiny_Encryption_Algorithm (wikipedia ) IJGDC/vol7_no5/4 ( .pdf ).

Hinweise ( xor-Faltung von Zeichenketten ) xor und one-time pads

Ist key ein String von min 5 Byte-Chars und str ein String von Byte-Chars, so kann eine zeichenweise xor-Faltung gemacht werden, etwa wie folgt

key_len = key.length; 
if (!key_len || key_len < 5) { key = "test"; }
for ( i = 0; i < str.length; i += 1) { 
  byte_char = str.charCodeAt(i);
  key_char = key.charCodeAt(i % key_len);
  if (byte_char !== key_char) { 
    byte_char ^= key_char; 
  } 
  r += String.fromCharCode(byte_char);
}

In gleicher Weise kann Verschlüsselt und Entschlüsselt werden. key soll eine hinreiched lange Byte-Zeichenkette sein. Ein krytografisch sicherer one-time pads mit etwa 0.6 * str.length liefert ein krytografisch sicheres Ergebnis.

Hinweise ( generateKey ) nützlich?

Hinweise kommen in der Veranstaltung ... Wie kann aus einem "relativ kurzen" User-Passwort mit Hilfe eines Hash-Algorithmus ein generateKeys ( relativ lange Zeichenkette ) entstehen?

Wenn der verschlüsselte Text lediglich aus hex-Ziffern besteht, so kann ein generateKey aus hex-Ziffern sinnvoll sein. Achtung! Es wird lediglich ein experimentelles Vorgehen gezeigt - keine endgültige Lösung ...

Test 1 anschauen.

<script> // Test 1 liefert ...
var i, j, k, kk, r = [ ], len = 16, cn, pw = " "; 

for( k = pw.length-1; k >= 0; k -= 1) { cn = pw.charCodeAt(k);

  for( i = 0; i < len; i += 1 ) { 
    for( j = len-1; j >= 0; j -= 1){ 
      kk = cn*(i+1)*(j+1) % (len+1) - 1;
      r.push( Math.abs(kk) );
    } r.push( "\n");
  } 
} alert(r);
</script>

Test 1 ergibt die Ausgabe:

 1,3,5,7,9,11,13,15,0,2,4,6,8,10,12,14,
,3,7,11,15,2,6,10,14,1,5,9,13,0,4,8,12,
,5,11,0,6,12,1,7,13,2,8,14,3,9,15,4,10,
,7,15,6,14,5,13,4,12,3,11,2,10,1,9,0,8,
,9,2,12,5,15,8,1,11,4,14,7,0,10,3,13,6,
,11,6,1,13,8,3,15,10,5,0,12,7,2,14,9,4,
,13,10,7,4,1,15,12,9,6,3,0,14,11,8,5,2,
,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,
,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
,2,5,8,11,14,0,3,6,9,12,15,1,4,7,10,13,
,4,9,14,2,7,12,0,5,10,15,3,8,13,1,6,11,
,6,13,3,10,0,7,14,4,11,1,8,15,5,12,2,9,
,8,0,9,1,10,2,11,3,12,4,13,5,14,6,15,7,
,10,4,15,9,3,14,8,2,13,7,1,12,6,0,11,5,
,12,8,4,0,13,9,5,1,14,10,6,2,15,11,7,3,
,14,12,10,8,6,4,2,0,15,13,11,9,7,5,3,1,

Test 2 anschauen ( NOCH NICHT PERFEKT! ).

<script>
var prims = [1201,1223,1249,1279,1297,1307,1367,1381,1427,1439,1459,1483,1489,1511,1559,1601],
len = prims.length, i, j, k, ii, jj, kk, cn,old = 1, r = [ ],
hex = "0123456789abcdef".split(''),  pw = "AA"; 

for( k = pw.length-1; k >= 0; k -= 1) { 
  cn = pw.charCodeAt(k) % 256; 
  cn = ( (cn << 2) * (cn >> 3) + 1 );
  for( i = 0; i < len; i += 1){  
    for( j = len-1; j >= 0; j -= 1){  
      kk = (old * cn  * prims[i] * prims[j]) % len;
      ii = len-kk-1; 
      jj = prims[ii]; prims[ii] = prims[kk]; prims[kk] = jj;
      r.push( hex[kk] );
    } r.push( "\n");
  } old = 199*cn;
} alert(r);
</script>

Test 2 ergibt die Ausgabe ( WIE VERBESSERN? ):

1,7,7,1,b,3,f,3,5,7,3,b,1,1,7,1,
,7,1,1,9,d,d,1,3,5,9,d,7,9,1,1,7,
,7,1,7,7,d,3,7,5,3,f,3,1,1,1,7,1,
,1,7,7,f,b,b,7,5,3,1,5,f,1,f,9,f,
,1,7,7,1,b,9,d,7,7,5,9,9,5,d,d,b,
,3,5,b,5,3,1,5,7,7,5,9,1,d,3,5,b,
,7,1,1,9,5,5,9,5,3,1,5,7,9,f,9,7,
,5,3,3,5,7,9,5,f,9,5,1,3,3,3,5,3,
,5,3,3,5,7,1,d,9,f,d,9,3,3,3,5,3,
,f,9,1,7,d,5,1,3,5,9,5,f,f,9,1,7,
,b,d,d,5,3,9,d,9,f,d,1,1,d,3,5,b,
,b,7,7,f,1,b,d,1,7,5,9,b,1,7,7,1,
,f,9,f,1,f,d,9,b,d,9,5,f,f,9,9,f,
,1,7,1,f,b,b,7,5,3,f,b,b,f,7,7,1,
,7,1,7,7,d,5,1,5,3,9,d,7,7,1,1,7,
,1,7,1,f,b,3,f,3,5,7,3,b,f,7,7,1,
,7,1,7,7,d,d,9,5,3,9,d,7,7,7,1,7,
,1,7,7,f,b,3,f,3,5,7,3,b,f,1,7,1,
,7,1,1,7,d,b,f,3,5,7,b,1,1,7,7,1,
,7,1,7,9,d,5,1,3,b,7,b,9,7,9,f,9,
,7,1,1,7,d,d,9,3,5,9,d,7,7,1,1,7,
,d,b,b,3,f,7,3,1,7,b,f,f,d,b,b,d,
,1,7,7,f,1,3,f,3,5,7,3,b,f,1,7,1,
,3,5,5,d,1,1,d,9,f,d,9,3,d,3,5,3,
,5,3,3,5,7,9,5,f,9,5,1,3,3,3,5,3,
,9,7,7,1,b,b,7,3,5,f,b,b,1,1,7,1,
,5,b,b,3,f,f,b,1,7,3,7,f,d,b,b,d,
,7,1,1,9,7,d,9,3,5,9,d,d,9,1,1,7,
,7,1,7,7,7,5,1,5,3,7,3,d,9,7,1,7,
,1,7,7,1,1,3,f,5,3,7,3,b,1,1,7,1,
,1,7,7,f,b,b,f,5,3,7,b,b,f,1,7,1,
,7,1,1,7,d,5,9,3,5,9,d,7,7,7,1,7
Hinweise ( extravagante Idee ) geht so was?

Idee: Byte-Zeichen-Code werden mit charCodeAt geholt und nach Primzahlen transformiert. Diese Primzahlen liefern die "verschüsselten" Zeichen aus unterschiedlichen Alphabeten. Stärken? Schwächen? Erweiterungen? ... Zahlen-Beispiel

                              i   =    0   1   2   3   4   5
                              s1  =    W   a   l   t   e   r
               s1.charCodeAt(i)   =   87  97 108 116 101 114

String.fromCharCode(prims1[s1.charCodeAt(i)])  s2 =    ǁ  ǽ   ɑ   ʁ   ȣ   ɫ
String.fromCharCode(prims2[s2.charCodeAt(i)])  s3  =   W  a   l   t   e   r

Wie wird das etwa programmiert? Etwa:

var i, r = [], quelltext = "Walter"; // Verschlüsseln:
for (i = 0; i < s.length; i += 1) { 
  r.push(String.fromCharCode(prims1["" + quelltext.charCodeAt(i)])); 
}  verschl = r.join(""); // verschl = "ǁǽɑʁȣɫ"; 

var r = [], verschl = "ǁǽɑʁȣɫ"; // Entschlüsseln:
for (i = 0; i < verschl.length; i += 1) {
  r.push(String.fromCharCode(prims2[verschl.charCodeAt(i)]));
} r = r.join(""); //r = "Walter";

Wie sehen die Objekte prims1 und prims2 aus?

// etwa:
var prims1 = { 1: 2, 2: 3, 3: 5, 4: 7, 5: 11, 6: 13, 7: 17, 8: 19, 9: 23, 10: 29, 11: 31, 12: 37, 13: 41, 14: 43, 15: 47, 16: 53,
    17: 59, 18: 61, 19: 67, 20: 71, 21: 73, 22: 79, 23: 83, 24: 89, 25: 97, 26: 101, 27: 103, 28: 107, 29: 109, 30: 113, 31: 127, 32: 131,
    33: 137, 34: 139, 35: 149, 36: 151, 37: 157, 38: 163, 39: 167, 40: 173, 41: 179, 42: 181, 43: 191, 44: 193, 45: 197, 46: 199, 47: 211,
    48: 223, 49: 227, 50: 229, 51: 233, 52: 239, 53: 241, 54: 251, 55: 257, 56: 263, 57: 269, 58: 271, 59: 277, 60: 281, 61: 283, 62: 293,
    63: 307, 64: 311, 65: 313, 66: 317, 67: 331, 68: 337, 69: 347, 70: 349, 71: 353, 72: 359, 73: 367, 74: 373, 75: 379, 76: 383, 77: 389,
    78: 397, 79: 401, 80: 409, 81: 419, 82: 421, 83: 431, 84: 433, 85: 439, 86: 443, 87: 449, 88: 457, 89: 461, 90: 463, 91: 467, 92: 479,
    93: 487, 94: 491, 95: 499, 96: 503, 97: 509, 98: 521, 99: 523, 100: 541, 101: 547, 102: 557, 103: 563, 104: 569, 105: 571, 106: 577,
    107: 587, 108: 593, 109: 599, 110: 601, 111: 607, 112: 613, 113: 617, 114: 619, 115: 631, 116: 641, 117: 643, 118: 647, 119: 653,
    120: 659, 121: 661, 122: 673, 123: 677, 124: 683, 125: 691, 126: 701, 127: 709, 128: 719, 129: 727, 130: 733, 131: 739, 132: 743,
    133: 751, 134: 757, 135: 761, 136: 769, 137: 773, 138: 787, 139: 797, 140: 809, 141: 811, 142: 821, 143: 823, 144: 827, 145: 829,
    146: 839, 147: 853, 148: 857, 149: 859, 150: 863, 151: 877, 152: 881, 153: 883, 154: 887, 155: 907, 156: 911, 157: 919, 158: 929,
    159: 937, 160: 941, 161: 947, 162: 953, 163: 967, 164: 971, 165: 977, 166: 983, 167: 991, 168: 997, 169: 1009, 170: 1013, 171: 1019,
    172: 1021, 173: 1031, 174: 1033, 175: 1039, 176: 1049, 177: 1051, 178: 1061, 179: 1063, 180: 1069, 181: 1087, 182: 1091, 183: 1093,
    184: 1097, 185: 1103, 186: 1109, 187: 1117, 188: 1123, 189: 1129, 190: 1151, 191: 1153, 192: 1163, 193: 1171, 194: 1181, 195: 1187,
    196: 1193, 197: 1201, 198: 1213, 199: 1217, 200: 1223, 201: 1229, 202: 1231, 203: 1237, 204: 1249, 205: 1259, 206: 1277, 207: 1279,
    208: 1283, 209: 1289, 210: 1291, 211: 1297, 212: 1301, 213: 1303, 214: 1307, 215: 1319, 216: 1321, 217: 1327, 218: 1361, 219: 1367,
    220: 1373, 221: 1381, 222: 1399, 223: 1409, 224: 1423, 225: 1427, 226: 1429, 227: 1433, 228: 1439, 229: 1447, 230: 1451, 231: 1453,
    232: 1459, 233: 1471, 234: 1481, 235: 1483, 236: 1487, 237: 1489, 238: 1493, 239: 1499, 240: 1511, 241: 1523, 242: 1531, 243: 1543,
    244: 1549, 245: 1553, 246: 1559, 247: 1567, 248: 1571, 249: 1579, 250: 1583, 251: 1597, 252: 1601, 253: 1607, 254: 1609, 255: 1613,
    256: 1619, 257: 1621
  };

  var prims2 = { 2: 1, 3: 2, 5: 3, 7: 4, 11: 5, 13: 6, 17: 7, 19: 8, 23: 9, 29: 10, 31: 11, 37: 12, 41: 13, 43: 14, 47: 15, 53: 16,
    59: 17, 61: 18, 67: 19, 71: 20, 73: 21, 79: 22, 83: 23, 89: 24, 97: 25, 101: 26, 103: 27, 107: 28, 109: 29, 113: 30, 127: 31, 131: 32,
    137: 33, 139: 34, 149: 35, 151: 36, 157: 37, 163: 38, 167: 39, 173: 40, 179: 41, 181: 42, 191: 43, 193: 44, 197: 45, 199: 46, 211: 47,
    223: 48, 227: 49, 229: 50, 233: 51, 239: 52, 241: 53, 251: 54, 257: 55, 263: 56, 269: 57, 271: 58, 277: 59, 281: 60, 283: 61, 293: 62,
    307: 63, 311: 64, 313: 65, 317: 66, 331: 67, 337: 68, 347: 69, 349: 70, 353: 71, 359: 72, 367: 73, 373: 74, 379: 75, 383: 76, 389: 77,
    397: 78, 401: 79, 409: 80, 419: 81, 421: 82, 431: 83, 433: 84, 439: 85, 443: 86, 449: 87, 457: 88, 461: 89, 463: 90, 467: 91, 479: 92,
    487: 93, 491: 94, 499: 95, 503: 96, 509: 97, 521: 98, 523: 99, 541: 100, 547: 101, 557: 102, 563: 103, 569: 104, 571: 105, 577: 106,
    587: 107, 593: 108, 599: 109, 601: 110, 607: 111, 613: 112, 617: 113, 619: 114, 631: 115, 641: 116, 643: 117, 647: 118, 653: 119,
    659: 120, 661: 121, 673: 122, 677: 123, 683: 124, 691: 125, 701: 126, 709: 127, 719: 128, 727: 129, 733: 130, 739: 131, 743: 132,
    751: 133, 757: 134, 761: 135, 769: 136, 773: 137, 787: 138, 797: 139, 809: 140, 811: 141, 821: 142, 823: 143, 827: 144, 829: 145,
    839: 146, 853: 147, 857: 148, 859: 149, 863: 150, 877: 151, 881: 152, 883: 153, 887: 154, 907: 155, 911: 156, 919: 157, 929: 158,
    937: 159, 941: 160, 947: 161, 953: 162, 967: 163, 971: 164, 977: 165, 983: 166, 991: 167, 997: 168, 1009: 169, 1013: 170, 1019: 171,
    1021: 172, 1031: 173, 1033: 174, 1039: 175, 1049: 176, 1051: 177, 1061: 178, 1063: 179, 1069: 180, 1087: 181, 1091: 182, 1093: 183,
    1097: 184, 1103: 185, 1109: 186, 1117: 187, 1123: 188, 1129: 189, 1151: 190, 1153: 191, 1163: 192, 1171: 193, 1181: 194, 1187: 195,
    1193: 196, 1201: 197, 1213: 198, 1217: 199, 1223: 200, 1229: 201, 1231: 202, 1237: 203, 1249: 204, 1259: 205, 1277: 206, 1279: 207,
    1283: 208, 1289: 209, 1291: 210, 1297: 211, 1301: 212, 1303: 213, 1307: 214, 1319: 215, 1321: 216, 1327: 217, 1361: 218, 1367: 219,
    1373: 220, 1381: 221, 1399: 222, 1409: 223, 1423: 224, 1427: 225, 1429: 226, 1433: 227, 1439: 228, 1447: 229, 1451: 230, 1453: 231,
    1459: 232, 1471: 233, 1481: 234, 1483: 235, 1487: 236, 1489: 237, 1493: 238, 1499: 239, 1511: 240, 1523: 241, 1531: 242, 1543: 243,
    1549: 244, 1553: 245, 1559: 246, 1567: 247, 1571: 248, 1579: 249, 1583: 250, 1597: 251, 1601: 252, 1607: 253, 1609: 254, 1613: 255,
    1619: 256, 1621: 257
  };

Plagiate sind out!
Viel Freude bei der Ausarbeitung!
Letzter Abgabetermin
So nach Pfingsten 12.00 Uhr