Version ULTIME du Système Dyrkien de Chiffrement !
Haha quel nom élogieux pour un modeste article .. n’est-ce pas ?
Encore un petit update de mon système de chiffrement, qui cette fois permet de gérer des clés sans limite de taille ni de caractère :)
- L’algorithme a évolué, il parcours chaque caractères de la chaîne à chiffrer.
- Il prend dans l’ordre les caractères de la clef.
- Si le caractère de la clef est un chiffre, il fait la différence entre le code Ascii et le chiffre.
- Si ça n’est pas un chiffre, il concatène les 2 premières lettres du base64 ainsi qu’un caractère correspondant au code Ascii du caractère additionné de la taille de la clef modulo 10
Exemple :
Prenons le mot toto avec la clef ‘a1z2’
encrypt( « toto » , ‘a1z2‘ ) ;
- Je prends la première lettre de toto : » t «
- » a » (première lettre de la clef ‘ a1z2 ‘) n’est pas un chiffre
- Je prends les 2 premiers caractères du base64 de la lettre » a » ==> » YQ== » ==> YQ
- Auquel j’ajoute le caractère correspondant au :
- code Ascii de la lettre » t » : 116
- additionné à la taille de la clef ( a1z2 = 4 lettres ) modulo 10 => 4 % 10 : 4
- Soit 116+ 4 = 120
- 120 correspond à la lettre » x »
Soit : YQx
- Je prends la deuxième lettre de toto : » o «
- » 1 » est un chiffre (deuxième lettre de la clef ‘ a1z2 ‘)
- j’additionne donc son le code Ascii de » o » soit 111 avec le chiffre 1 : 112
- Le caractère correspondant au code Ascii 112 est » p «
- Ainsi nous pouvons rajouter à YQe la lettre » p » : YQep
- Je prends la troisième lettre de toto : » t «
- » z » (troisième lettre de la clef ‘ a1z2 ‘ ) n’est pas un chiffre
- Je prends les 2 premiers caractères du base64 de la lettre » a » ==> » eg== » ==> eg
- Auquel j’ajoute le caractère correspondant au :
- code Ascii de la lettre » t » : 116
- additionné à la taille de la clef ( a1z2 = 4 lettres ) modulo 10 => 4 % 10 : 4
- Soit 116+ 4 = 120
- 120correspond à la lettre » x »
Soit : egx
- Nous obtenons désormais YQxpegx
- Je prends enfin la dernière lettre de toto : » o «
- » 2 » est un chiffre (dernière lettre de la clef ‘ a1z2 ‘ )
- j’additionne donc son le code Ascii de » o » soit 111 avec le chiffre 2 : 113
- Le caractère correspondant au code Ascii 113 est » q «
- Ainsi nous pouvons rajouter à YQxpegx la lettre » q » :YQxpegxq
Pour terminer le processus, nous convertissons YQxpegxq en base64 et nous obtenons : WVF4cGVneHE=
Toto devient donc WVF4cGVneHE=
[EDIT] : une faille existait dans l’algorithme que je vous décrit ci-dessus, qui permettait à un attaquant de dechiffrer un texte, dans le cas ou la clé ne contient que des lettres, et si il met une clé avec le même nombre de lettre.
J’ai mis à jour mon code.
Ci-Joint le code JavaScript et PHP :
Javascript :
[pastacode lang= »javascript » message= » » highlight= » » provider= »manual »]
function encrypt(msg, key) {
i = 0; j = 0; k = 0;
tmp = msg;
while (msg.length - 1 >= i ) {
caractere = msg.charAt(i);
clef = parseInt(ord(key.charAt(j++)))
if (clef >=48 && clef <= 57){ clef -= 48; tmp = tmp.replaceAt(k++, chr(ord(caractere) + clef)); } else { clef2 = base64_encode(chr(clef)).substr(0,2); tmp = tmp.substr(0, k) + clef2 + tmp.substr(k, tmp.length); k+=2; tmp = tmp.replaceAt(k++, chr(ord(caractere) + clef)) } i++; j=(j>key.length-1)?0:j;
}
tmp = base64_encode(tmp);
return tmp;
}
function decrypt(msg, key) {
i = 0; j = 0; k = 0;
tmp = base64_decode(msg);
while (tmp.length - 1 >= i ) {
caractere = tmp.charAt(i);
clef = parseInt(ord(key.charAt(j++)))
if (clef >=48 && clef <= 57){ clef -= 48; tmp = tmp.replaceAt(k++, chr(ord(caractere) - clef)); } else { tmp = tmp.substr(0, k) + tmp.substr(k + 2, tmp.length); caractere = tmp.charAt(i); tmp = tmp.replaceAt(k++, chr(ord(caractere) - clef)) } i++; j=(j>key.length-1)?0:j;
}
return tmp;
}
[/pastacode]
PHP :
[pastacode lang= »php » message= » » highlight= » » provider= »manual »]
function encrypt($msg, $key) {
$i = 0; $j = 0; $k = 0;
$tmp = $msg;
while (strlen($msg) - 1 >= $i ) {
$caractere = $msg[$i];
$clef = intVal((ord($key[$j++])));
if ($clef >=48 && $clef <= 57){ $clef -= 48; $tmp[$k++] = chr(ord($caractere) + $clef); } else { $clef2 =substr(base64_encode(chr($clef)),0,2); $tmp = substr($tmp, 0, $k).$clef2.substr($tmp, $k, strlen($tmp)); $k+=2; $tmp[$k++] = chr(ord($caractere) + $clef); } $i++; $j=($j>strlen($key)-1)?0:$j;
}
$tmp = base64_encode($tmp);
return $tmp;
}
function decrypt($msg2, $key2) {
$i2 = 0; $j2 = 0; $k2 = 0;
$tmp2 = base64_decode($msg2);
while (strlen($tmp2) - 1 >= $i2 ) {
$caractere2 = $tmp2[$i2];
$clef2 = intVal(ord($key2[$j2++]));
if ($clef2 >=48 && $clef2 <= 57){ $clef2 -= 48; $tmp2[$k2] = chr(ord($caractere2) - $clef2); } else { $tmp2 = substr($tmp2, 0, $k2).substr($tmp2, $k2 + 2, strlen($tmp2)); $caractere2 = $tmp2[$i2]; $tmp2[$k2]=chr(ord($caractere2) - $clef2); } $i2++;++$k2; $j2=($j2>strlen($key2)-1)?0:$j2;
}
return $tmp2;
}
[/pastacode]
Dyrk.org