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 :
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 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; }
Mais cet algo ne marche plus 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; }
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.
Partager