Vigenère-Chiffre
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Javascript</language>
Die Vigenère-Chiffre ist eine kompliziertere Variante der einfachen Cäsar-Verschlüsselung. Dabei ist nicht nur jeder Buchstabe um einen festen Wert verschoben, sondern mit einem Schlüssel wird die Verschiebung dynamisch gewählt. Sie verändert sich so mit jedem weiteren Zeichen und bleibt nicht konstant wie bei der Cäsar-Verschlüsselung.
Dazu wird ein Gitter verwendet, in dem für jeden Buchstaben des Geheimschlüssels eine andere Cäsar-Verschiebung angegeben ist:
<code id="5d49e0654067a">
var Gitter = {
"A" : ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],
"B" : ["B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A"],
"C" : ["C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B"],
"D" : ["D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C"],
"E" : ["E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D"],
"F" : ["F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E"],
"G" : ["G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F"],
"H" : ["H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G"],
"I" : ["I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H"],
"J" : ["J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I"],
"K" : ["K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J"],
"L" : ["L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K"],
"M" : ["M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L"],
"N" : ["N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M"],
"O" : ["O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M","N"],
"P" : ["P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O"],
"Q" : ["Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P"],
"R" : ["R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q"],
"S" : ["S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R"],
"T" : ["T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S"],
"U" : ["U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T"],
"V" : ["V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U"],
"W" : ["W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V"],
"X" : ["X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W"],
"Y" : ["Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X"],
"Z" : ["Z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y"]
};
function encrypt(Eingabe,Key){
var Ausgabe = "";
var KeyIndex = 0;
for (var i=0; i < Eingabe.length; i++){
var EingabeBuchstabe = Eingabe[i].toUpperCase();
// Alles was nicht A-Z ist, direkt so ausgeben ohne Verschlüsselung
if(EingabeBuchstabe.match(/[^A-Z]/)) {
Ausgabe = Ausgabe + EingabeBuchstabe;
continue;
}
var KeyBuchstabe = Key[KeyIndex].toUpperCase();
var AusgabeBuchstabe = Gitter[EingabeBuchstabe][KeyBuchstabe.charCodeAt(0) - 65];
Ausgabe = Ausgabe + AusgabeBuchstabe;
KeyIndex++;
// wieder vorn anfangen wenn Key aufgebraucht ist
if(KeyIndex >= Key.length) KeyIndex = 0;
}
return Ausgabe;
}
function decrypt(Eingabe,Key){
var Ausgabe = "";
var KeyIndex = 0;
for (var i=0; i < Eingabe.length; i++){
var CryptedBuchstabe = Eingabe[i].toUpperCase();
if(CryptedBuchstabe.match(/[^A-Z]/)) {
Ausgabe = Ausgabe + CryptedBuchstabe;
continue;
}
var KeyBuchstabe = Key[KeyIndex].toUpperCase();
for (var k in Gitter){
if(Gitter[k][KeyBuchstabe.charCodeAt(0) - 65] == CryptedBuchstabe){
Ausgabe = Ausgabe + k;
break;
}
}
KeyIndex++;
// wieder vorn anfangen wenn Key aufgebraucht ist
if(KeyIndex >= Key.length) KeyIndex = 0;
}
return Ausgabe;
}
</code>
Das Verfahren kann nun angewendet werden auf beliebige Eingaben:
<run id="5d49e9a8e186a">
var botschaft = "MORGEN ABEND UM NEUN GEHT'S LOS.";
var encrypted = encrypt(botschaft,"GEHEIMWORT");
console.log("Original: "+botschaft);
console.log("Verschlüsselt: "+encrypted);
// Die Umkehrung mit decrypt:
var decrypted = decrypt(encrypted,"GEHEIMWORT");
console.log("Entschlüsselt: "+decrypted);
</run>
Da man den Schlüssel nicht mitsenden möchte (das wäre ja gefährlich) beschrieben Whitfield Diffie und Martin Hellman 1976 ein Verfahren, um die Schlüssel geheim zu halten. Dazu wird die Nachricht mehrmals ausgetauscht und mehrfach verschlüsselt:
<run id="5d49e065406f6">
console.log("Alice möchte eine Nachricht verschicken.");
var Ausgabe1 = encrypt("MORGEN ABEND UM NEUN GEHT'S LOS.","EINFACH");
console.log("Verschlüsselt: "+Ausgabe1);
console.log("--> verschicken an Bob");
console.log("Bob verschlüsseln die Nachricht erneut mit seinem Key2.");
var Ausgabe2 = encrypt(Ausgabe1,"SCHWER");
console.log("Verschlüsselt: "+Ausgabe2);
console.log("<-- zurück an Alice");
console.log("Alice entschlüsseln die Nachricht mit ihrem Key1.");
var Ausgabe3 = decrypt(Ausgabe2,"EINFACH");
console.log("Entschlüsselt: "+Ausgabe3);
console.log("--> verschicken an Bob");
console.log("Bob entschlüsseln die Nachricht mit seinem Key2.");
console.log("Entschlüsselt: "+decrypt(Ausgabe3,"SCHWER"));
console.log("Bob hat die Nachricht erhalten, ohne je Key1 zu kennen.");
console.log("Alice hat die Nachricht übermittelt, ohne je Key2 zu kennen.");
</run>