Version ULTIME du Système Dyrkien de Chiffrement !

papier-peint-687-yed

 

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 :)

 

 

  1. L'algorithme a évolué, il parcours chaque caractères de la chaîne à chiffrer.
  2. Il prend dans l'ordre les caractères de la clef.
  3. Si le caractère de la clef est un chiffre, il fait la différence entre le code Ascii et le chiffre.
  4. 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 :

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;
}

 

PHP :

 

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;
}
Partagez ce contenu

Laisser une réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *