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?
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.
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":
Erzeugen sie bitte von Hand die Rückwärtstransformation, so daß wieder der orginal-String erscheint.
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.
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; }
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; }
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