Caesar-Chiffre |
|
| System | Win9x, WinNT, Win2000, WinXP, Vista, Win7 |
|---|---|
| Ab Delphi-Version | Delphi 1 |
| Letzte Änderung | 21.01.2012 |
Die Caesar-Chiffre ist eine einfache Verschlüsselung, die von Gaius Julius Caesar benutzt wurde und nach ihm benannt ist. Da es nur 25 möglichliche sinnvolle Schlüssel gibt, ist diese Verschlüsselung mit jedem Computer in Sekundenbruchteilen zu knacken und sollte deshalb nicht für sensible Daten verwendet werden.
Verschlüsselung
Math;
function EncryptCaesar(AText: string; AKey: Char): string;
var
i: Integer;
tmp: Integer;
normedKey: Integer;
begin
SetLength(Result, Length(AText));
// alles in Großbuchstaben umwandeln
// Caesar unterscheidet nicht zwischen Groß- und Kleinbuchstaben
AText := UpperCase(AText);
AKey := UpCase(AKey);
if not (AKey in ['A'..'Z']) then
raise EInvalidArgument.CreateFmt('Schlüssel ungültig(%s). AKey muss ein '
+ 'Buchstabe zwischen ''A'' und ''Z'' sein.', [AKey]);
normedKey := Ord(AKey) - Ord('A') +1; // Schlüssel normalisieren
for i := 1 to Length(AText) do
begin
if AText[i] in ['A'..'Z'] then // nur Buchstaben verschlüsseln
begin
tmp := (Ord(AText[i])) - Ord('A'); // Normalisieren
tmp := (tmp + normedKey) mod 26; // Verschieben
Result[i] := Chr(tmp + Ord('A')); // Denormalisieren
end
else
begin
Result[i] := AText[i]; // nicht verschlüsseln, wenn kein Buchstabe
end;
end;
end;
function DecryptCaesar(AText: string; AKey: Char): string;
var
i: Integer;
tmp: Integer;
normedKey: Integer;
begin
SetLength(Result, Length(AText));
// alles in Großbuchstaben umwandeln
// Caesar unterscheidet nicht zwischen Groß- und Kleinbuchstaben
AText := UpperCase(AText);
AKey := UpCase(AKey);
if not (AKey in ['A'..'Z']) then
raise EInvalidArgument.CreateFmt('Schlüssel ungültig(%s). AKey muss ein '
+ 'Buchstabe zwischen ''A'' und ''Z'' sein.', [AKey]);
normedKey := Ord(AKey) - Ord('A') +1; // Schlüssel normalisieren
for i := 1 to Length(AText) do
begin
if AText[i] in ['A'..'Z'] then // nur Buchstaben sind verschlüsselt
begin
tmp := (Ord(AText[i])) - Ord('A'); // Normalisieren
tmp := (26 + (tmp - normedKey)) mod 26; // Verschieben
Result[i] := Chr(tmp + Ord('A')); // Denormalisieren
end
else
begin
Result[i] := AText[i]; // nicht verschlüsseln, wenn kein Buchstabe
end;
end;
end;
Aufruf:
begin
Memo1.Text := EncryptCaesar(Memo1.Text, 'C');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Text := DecryptCaesar(Memo1.Text, 'C');
end;
Mögliche Schlüssel sind Die Buchstaben 'A' bis 'Z', wobei bei Verwendung von 'Z' wieder der Klartext ausgegeben wird.
Ber der Caesar-Verschlüsselung wird das Alphabet um einen bestimmten Wert verschoben. Bei einer Verschiebung um 'C' bzw. 3, würde also 'A' zu 'D', 'B' zu 'E', 'C' zu 'F', usw. Weitere Informationen zur Caesar-Chiffre finden sich im Wikipedia-Artikel Verschiebechiffre.
Kryptoanalyse
Dass Caesar nicht besonders sicher ist, wurde ja schon gesagt. Wie aber lässt sich Caesar angreifen? Eine Möglichkeit wäre, einfach alle 25 mögliche Schlüssen durchprobieren. Allerdings muss man sich dann alle 25 Resultate ansehen um herauszufinden, was nun der richtige Schlüssel war. Demgegenüber gibt es eine ebenso einfache, aber praktikablere Lösung:
var
letters: array['A'..'Z'] of Integer;
i: Integer;
mostFrequentChar: Char;
c: Char;
begin
FillChar(letters, SizeOf(letters), 0);
// Häufigkeiten der einzelnen Buchstaben zählen
for i := 1 to Length(AText) do
begin
if AText[i] in ['a'..'z', 'A'..'Z'] then
begin
Inc(letters[UpCase(AText[i])]);
end;
end;
// häufigsten Buchstaben bestimmen
mostFrequentChar := 'A';
for c := 'B' to 'Z' do
begin
if letters[c] > letters[mostFrequentChar] then
mostFrequentChar := c;
end;
// häufigsten Buchstaben als 'E' annehmen
Result := Chr(((26 + Ord(mostFrequentChar) - Ord('A') - 5) mod 26) + Ord('A'));
end;
function CrackCaesar(const AText: string): string;
begin
Result := DecryptCaesar(AText, GetCaesarKey(AText));
end;
Aufruf:
begin
Memo1.Text := CrackCaesar(Memo1.Text);
end;
In der deutschen Sprache ist der Buchstabe 'E' der häufigste. Buchstaben wie 'Q' sind hingegen sehr selten. So hat die deutsche Sprache eine charakteristische Buchstabenverteilung. Da bei der Caesar-Chiffre dem 'E' ein ganz bestimmter Buchstabe zugeordnet wird(und nicht etwa mehrere), können wir einfach den häufigsten Buchstaben ermitteln und schon wissen wir, welcher Buchstabe das 'E' sein muss. Die restlichen Buchstaben ergeben sich hier automatisch.
Das beschriebne Verfahren funktioniert allerdings nur, wenn der verschlüsselte Text eine ausreichende Länge besitzt. Wird beispielsweise nur das Wort "Delphiprogrammierer" verschlüsselt, so ist hier der häufigste Buchstabe 'R' und nicht 'E'. Sind die Texte aber lang genug, funktioniert diese einfache Methode schon sehr gut.
Auch andere Verschlüsselungsverfahren lassen sich per Häufigkeitsanalyse knacken, wenn auch nicht ganz so einfach. Weitere Infos finden sich im Wikipedia-Artikel zur Häufigkeitsanalyse.