ESA 2012.A7: Kryptografisch geschützte HTML-Seite

H. Stanley Judd: "The ultimate security is your understanding of reality."

Die Kryptologie ist eine 'alte Wissenschaft vom Verborgenen' Siehe z.B. Wikipedia: Kryptologie , Kryptographie . Im Internet gibt es hierzu zahlreiche Tutorials siehe z.B. Kryptologie. Hier sind einige Fragen zur Eigenerkundung Kryptologie

Die Kryptologie hängt zusammen mit der Kryptografie, Kryptanalyse, Informationssicherheit , Verschlüsselungsverfahren, digitale Signaturen, Identifikationsprotokolle, kryptografische Hashfunktionen, Geheimnisteilung, elektronische Wahlverfahren, elektronisches Geld, usw. beschäftigt.

Diese Aufgabe besteht darin, ein Tool "Erstelle HTML-Seite mit verschlüsselten Quelltext" zu entwickeln. Das Tool soll den Der body-Qulltext einer HTML-Seite soll verschlüsselt sein. Die erstellte verschlüsselt Seite kann wie eine normale HTML-Seite gespeichert und im Netz übertragen werden. Ein Leser braucht ein gültiges Passwort, das in der Seite eingegeben wird, damit die Seite lesbar ist.

Wird als Ausgangsstring z.B. der HTML-body (ohne das body-Tag) verwendet, so kann ein Toolchen die Verschlüsselung mit einem Passwort durchführen und die HTML-Seite mit dem Header (einschließlich der Funktionen zum entschlüsseln) erzeugen (siehe z.B. geschützte Seite präparieren ). Wie können die statischen, lesbaren Darstellungen der Header-Funktionen (einfach) verschlüsselt werden?


Schutz personenbezogener Daten in EU Wie geht das organisatorisch-technisch?

In der CHARTA DER GRUNDRECHTE DER EUROPÄISCHEN UNION (2000/C 364/01), dort im Artikel 8 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.
Basisiwwissen und Anschauung "Zeichensalat"?

Was gehört zum Grundwissen? Bei HTML-Quelltext geht es um Zeichen. Heute ist ein lateinischer Zeichensatz oft nicht ausreichend (Internationalisierung). Deshalb wird ein UTF-8-Unicode-Zeichensatz unterstellt. Ein UTF-8-Unicode-Zeichen kann aus einer kodierte Bytefolge von bis zu 4 Byte bestehen.

Was gehört zum Grundwissen und kann experimentell aufgefrischt werden? Bitte zunächst mit dem mit Tool'chen experimentiert.

Zunächst kann einen Teststring in den Editor kopiert werden (Menü-Punkt MCT-erstellen text-Muster) und dann kann dieser Unicode-String im Editor z.B. in der folgenden Reihenfolge manipuliert werden:

"Vorwärts-Transformation":

  1. unter dem Menü-Punkt "Bearbeiten Zeichenoperationen Transformat"
    [encode_utf8] auswählen (macht aus utf-8-Zeichenstring einen Byte-String) Bitte die geänderten Unicode-Zeichen im unteren Editor anschauen.
  2. Mit [Transformat] die Stringlänge des oberen Texteditors anzeigen. Editor-Content unten und oben vertauschen und mit [Transformat] die Stringlänge des encode_utf8-Textes anzeigen.
  3. Mit Generieren [xor43-Verschlüsselung] auswählen und anwenden.
  4. (Editoren-Tausch ↑↓) und unter [Transformat]
    [encode_base64] auswählen (macht aus einem Byte-String einen base64-String)

Erzeugen sie bitte von Hand die Rückwärtstransformation, so daß wieder der orginal-String erscheint.

Wie sieht eine 'geschützte Seite' etwa aus? Gibt es einen Entwurf?

Mit dem Entwurf eines Erstellungstoolchen kann eine 'geschützte Seite' erstellt und angesehen werden. Hier ist eine crypt-Bibliothek crypt.js, die fehlerhaft, verbesserbar, erweiterbar, verständlich und hilfreich sein kann.

Hinweise zum Codierung UTF-8 und Bytefolge

Um eine UTF-8 Zeichenfolge in eine Bytefolge (und umgekehrt) zu wandeln, können die eingebauten Funktionen escape(), unescape(), encodeURIComponent(), decodeURIComponent() verwendet werden, etwa

function encode_utf8(str) {
  try { str = unescape(encodeURIComponent(str)); 
  } catch (e1) { /*win.alert('ERR: encode_utf8()');*/ }
  return str;
}
function decode_utf8(str) {
  try { str = decodeURIComponent(escape(str)); 
      } catch (e2) { /*win.alert('ERR: decode_utf8()');*/ }
  return str;
}
"Selfmade" Verschlüsselungsalgorithmus Ist dieser Algorithmus sicher?

Wie kann ein eigener Verschlüsselungs/Entschlüsselungs-Algorithmus entwickelt werden? Ein "perfekter" Algorithmus braucht umfangreiche mathematische Kenntnisse. Ein erster Versuch (wie nachfolgend) wird bei Crypt-Seite-erstellen verwendet. Der key-String wird byteweise und ggf. mehrfach auf den src-String gelegt. Aufeinanderfallende Bytes von key und str werden byteweise (=zeichenweise) mit XOR verknüpft. Jedes Byte einer Byte-Zeichen-Kette str wird "zyklisch" mit dem Byte von key verknüpft (XOR). Achtung! (str_char XOR str_char) liefert 0, d.h. kein gültiges Zeichen.

function encrypt_string(str, key) { // nur fuer 8-Bit-Zeichen
var i, j, key_char, str_char, r = "", str_len = str.length, key_len = key.length;
if (key_len < 1) { key = "test"; }
for ( i = 0; i < str_len; i += 1) { 
str_char = str.charCodeAt(i);
key_char = key.charCodeAt(i % key_len);
if (str_char != key_char) { str_char ^= key_char; }
r += String.fromCharCode(str_char);
} return r;
}

Hier eine (ungeprüfte) Idee für einen verbesserten Algorithmus encrypt_string_ex(src, key, n). Anstelle einer i-Schleife werden 2 Schleifen verwendet. Die ii-Schleife macht einen Index-Versatz. Nach jeder Rotation wird dieser "neue" key-String erneut auf den (nicht-rotierten) src-String gelegt und zeichenweise mit XOR verknüpft.

 // NICHT GEPRÜFT!
function encrypt_string_ex(src, key, n) { // nur fuer 8-Bit-Zeichen
 var lk = key.length, ls = src.length, 
 nn = Math.abs(n), c, ii, i, j, k, r;
 // Vermutung: nn muss wohl kleiner als key.length-1 sein
 for (ii=0; ii < nn; ii += 1) { r = ""; 
 for (i=0; i < ls; i += 1) { 
   c = src.charCodeAt(i); 
   j = ((i+ii) % lk) & 0xff;
   k = (key.charCodeAt(j) >>> nn)+(j&1);
   c = (c ^ k) & 0xff;
   r += String.fromCharCode(c); 
 } src = r;  
 } return src;
}
Hash-Code Wozu?

Ein Passwort (und Teile davon) können zahlreiche Hash-Werte liefern, die das ursprüngliche Passwort "verkomplizierend erweitern" können. Ist das ursprüngliche Passwort unbekannt, so ist es auch das "verkomplizierte".

Nachfolgend eine einfache Hash-Funktion, die zu einem String s einen Hash-Wert liefert. base kann 2,3,4,...,32 sein.

function myhash(s, base) {
  var i, h, g, c; base = base || 10;
  s = s.replace(/\r/g, '');
  if (!s || s === "") {return 0;} else { 
    h = 0; g = 0;
    for (i = s.length - 1; i >= 0; i -= 1) {
      c = parseInt(s.charCodeAt(i), 10);
      h = ((h << 6) & 0xfffffff) + c + (c << 14);
      if ((g = h & 0xfe00000) !== 0) { h = (h ^ (g >> 21)); }
    } return h.toString(base);
  }
}

Achtung! Die obigen Beschreibungen sollen nützliche Hinweise zur Lösung sein, Entwicklungsenergie nicht blockiert und der kreativen Entfaltung einen hinreichenden Freiraum für das eigene Projekt lassen.

Viel Freude bei der Ausarbeitung!
Letzter Abgabetermine Mo 12.00 Uhr