unit Caesar;
interface
type
// siehe http://de.wikipedia.org/wiki/Caesar-Verschlüsselung
TCaesarCipher =
class
private const
CCharCount = 26;
// 26 Buchstaben im Alphabet
CFirstPlainChar = '
a';
// Klartext in Kleinbuchstaben und startet mit 'a'
CFirstCryptChar = '
A';
// Geheimtext in Großbuchstaben und startet mit 'A'
private
function GetPositiveShift( AShift : Integer ) : Integer;
function GetShiftedCode( ACode, AShift : Integer ) : Integer;
public
function Encrypt(
const APlainStr :
string; AShift : Integer ) :
string;
function Decrypt(
const ACryptStr :
string; AShift : Integer ) :
string;
end;
implementation
{ TCaesarCipher }
function TCaesarCipher.GetPositiveShift( AShift : Integer ) : Integer;
begin
Result := AShift
mod CCharCount;
// -CCharCount+1 .. CCharCount-1
Result := Result + CCharCount;
// 1 .. 2*CCharcount-1
Result := Result
mod CCharCount;
// 0 .. CCharCount-1
end;
function TCaesarCipher.GetShiftedCode( ACode, AShift : Integer ) : Integer;
begin
// Bei einer festen Anzahl x ist es egal, ob man 2 zurück oder (x-2) vor geht
// Start ....... : 1(2)3 4 5
// 2 zurück .... : 1 2 3 4(5)
// (5-2) = 3 vor : 1 2 3 4(5)
Result := ( ACode + GetPositiveShift( AShift ) )
mod CCharCount;
end;
function TCaesarCipher.Decrypt(
const ACryptStr :
string; AShift : Integer ) :
string;
var
LStrLength : Integer;
LStrIndex : Integer;
LPlainChar : Char;
LCryptChar : Char;
LPlainCode : Integer;
LCryptCode : Integer;
begin
LStrLength := Length( ACryptStr );
SetLength( Result, LStrLength );
for LStrIndex := 1
to LStrLength
do
begin
LCryptChar := ACryptStr[LStrIndex];
LCryptCode := Ord( LCryptChar ) - Ord( CFirstCryptChar );
{ TODO : Überprüfung von 0 <= LCryptCode < CCharCount }
LPlainCode := GetShiftedCode( LCryptCode, - AShift );
LPlainChar := Char( LPlainCode + Ord( CFirstPlainChar ) );
Result[LStrIndex] := LPlainChar;
end;
end;
function TCaesarCipher.Encrypt(
const APlainStr :
string; AShift : Integer ) :
string;
var
LStrLength : Integer;
LStrIndex : Integer;
LPlainChar : Char;
LCryptChar : Char;
LPlainCode : Integer;
LCryptCode : Integer;
begin
LStrLength := Length( APlainStr );
SetLength( Result, LStrLength );
for LStrIndex := 1
to LStrLength
do
begin
LPlainChar := APlainStr[LStrIndex];
LPlainCode := Ord( LPlainChar ) - Ord( CFirstPlainChar );
{ TODO : Überprüfung von 0 <= LPlainCode < CCharCount }
LCryptCode := GetShiftedCode( LPlainCode, AShift );
LCryptChar := Char( LCryptCode + Ord( CFirstCryptChar ) );
Result[LStrIndex] := LCryptChar;
end;
end;
end.