Bonjour,
J'ai besoin de coder/décoder une chaîne de caractère dans mon appli C#/ASP.NET. J'ai donc trouvé sur le net un tel algorithme en PHP :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
public static function decrypt($val)
    {
 
    $mes=$val;
      $password="clé";
 
     $res=' ';
     $r="";
     $j=0;
     $tmp=0;
     $mes = base64_decode($mes);
     $lgmot = strlen($mes);
     for ($i = 0; $i < $lgmot; $i++) {
         $tmp = ord($mes[$i]) - ord($password[$j]);
         //ici on prends les 2 valeurs ascii des caratères du message
         //en position i et du mot de passe en position j et on les soustrait.
         //Si le résultat est négatif, pas de panique, on ajoute 256 et hop,
         //nous nous y retrouvons.
         if ($tmp < 0) {
             $tmp = 256 + $tmp;
         }
         $r.=chr($tmp);
 
         if ($j == (strlen($password)-1)) {
             $j= 0;
         } else {
             $j=(($j % (strlen($password))) + 1);
             //Modulo pour parcourrir le mot de passe...
         }
     }
     return $r;
    }
 
    public static function crypt($val)
    {
        $mes=$val;
        $password="clé";
        $res=' ';
        $r="";
        $j=0;
        $tmp=0;
        $lgmot = strlen($mes);
 
        for ($i = 0; $i < $lgmot; $i++) {
            $tmp = ord($mes[$i]) + ord($password[$j]);
 
            if ($tmp > 255) {
                $tmp = $tmp - 256;
            }
 
            $r.=chr($tmp);
            if ($j == (strlen($password)-1)) {
                $j= 0;
            } else {
                $j=(($j % (strlen($password))) + 1);
            }
        }
        $r = base64_encode($r);
        return $r;
    }
J'ai donc traduit ce code en C# :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 
        protected string decrypt(string val) {
 
            string password = ConfigurationSettings.AppSettings["CRYPT_KEY"].ToString();
            string mes = val;
            string r = "";
            int j = 0;
            int tmp = 0;
            //string mes = DecodeBase64String(mel);
            int lgmot = mes.Length;
            for (int i = 0; i < lgmot; i++) {
                tmp = (int)mes[i] - (int)password[j];
                //ici on prends les 2 valeurs ascii des caratères du message
                //en position i et du mot de passe en position j et on les soustrait.
                //Si le résultat est négatif, pas de panique, on ajoute 256 et hop,
                //nous nous y retrouvons.
                if (tmp < 0) {
                    tmp = 256 + tmp;
                }
                r += (char)tmp;
 
                if (j == (password.Length - 1)) {
                    j = 0;
                } else {
                    j = (j % (password.Length)) + 1;
                    //Modulo pour parcourrir le mot de passe...
                }
            }
            return r;
        }
 
        public string DecodeBase64String(string encodedData) {
            byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
            string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
            return returnValue;
        }
 
        protected string crypt(string val) {
            string password = ConfigurationSettings.AppSettings["CRYPT_KEY"].ToString();
            string r = "";
            int j = 0;
            int tmp = 0;
            int lgmot = val.Length;
 
            for (int i = 0; i < lgmot; i++) {
                tmp = (int)val[i] + (int)password[j];
 
                if (tmp > 255) {
                    tmp = tmp - 256;
                }
 
                r += (char)tmp;
                if (j == (password.Length - 1)) {
                    j = 0;
                } else {
                    j = (j % (password.Length)) + 1;
                }
            }
            //r = EncodeStringToBase64(r);
            return r;
        }
 
        public string EncodeStringToBase64(string toEncode) {
            byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
            string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
            return returnValue;
        }
Mais cet algo ne marche plus en C#...
Séparément, les fonctions d'encodage/décodage en Base64 fonctionnent très bien, et l'algorithme fonctionne également sans l'encodage en B64.

Mais en associant les 2 je ne retrouve jamais ma chaîne originale après l'avoir décryptée...

Le pb pourrait-il être causé par le type d'encodage de texte propre à mon navigateur ? (UTF, ISO etc...)

Merci pour votre aide.