ich bin gerade dabei ein Verschlüsselungsalgorithmus zu erstellen für
PHP. Dabei werden alle Zeichen eines Textes ähnlich wie beim Cäsar-Code in der Ascii-Tabelle verschoben.
Man wählt zunächst ein Passwort und dann wird von der Position eines Zeiches in der Ascii Tabelle die Stelle abgezogen, die ein jeweiliges Zeichen des Textes hat.
Also im Passwort kommt z.B. ein t vor, das hat in der Ascii Tabelle die Position 116. Wenn nun im Text z.B. ein A vorkommt (Position 65), dann wird in den verschlüsselten String nur 51 geschrieben (116-51). Bisher werden auch negative Zahlen übernommen.
Abhängig von der Länge des Passworts wird dann jeweils das nächste Zeichen des zu verschlüsselnden Texts genommen und das nächste Zeichen des Passworts und wiederrum "verschlüssel" bzw. verschoben:
function encrypt($str, $pw)
{
$keys = array();
for($a = 0; $a < 128; $a++)
{
for($b = 0; $b < strlen($pw); $b++)
{
if(substr($pw, $b, 1)==chr($a))
{
$keys[$b] = $a;
}
}
}
$str2 = "";
$i2 = 0;
$i = 0;
while($i < strlen($str))
{
if($i2 > (count($keys)-1))
{
$i2 = 0;
}
for($x = 0; $x < 128; $x++)
{
if(substr($str, $i, 1)==chr($x))
{
$str2 .= ($keys[$i2]-$x).'#';
}
}
$i2++;
$i++;
}
return $str2;
}
Standardgemäß wird dann ein 64-Bit Passwort (also mit 64 Zeichen) aus a-Z, 0-9 erstellt (Sonderzeichen lassen sich auch mit einfügen).
Nur wie sicher ist so eine Verschlüsselung. Lässt sich ohne viel Programmieraufwand der Originaltext auch herauslesen ohne das Passwort z.B. mit der Brute-Fore-Method auszuprobieren?
Mir ist klar, dass so ein Algorithmus nicht unbedingt "sicher" ist, aber wo genau ist da die Angriffsfläche? Ein 64-Bit Key mit der Brute-Fore-Methode auszuprobieren dauert ja ein paar Tage bis Monate mit jeweils 128 bzw. 255 Zeichen im Ascii-Format.
Die Programmiersprache ist ja erstmal nebensächlich, es geht jetzt mal nur um den verschlüsselten Code. Mal ein Beispiel:
Dies ist ein Text hab ich verschlüsselt mit dem generierten Passwort 0xNytHjaNvsN1bbjuC7JFXAx7cL5iTeJLP1MbXx9t0x8JuHPKUdFRS9yrXI6kyfs.
Das kommt dabei heraus (die einzelnen Zahlen getrennt durch ein '#', damit man später besser "decodieren" kann):
-20#15#-23#6#84#-33#-9#-19#46#17#10#-32#17#14#-3#-14#1
Natürlich ist dabei praktisch gesehen das Passwort nur so "effizient" wie der Text lang ist, denn die vollen 64 Zeichen des Passworts kommen ja gar nicht zum Einsatz.