Bonjour,

Voilà je dispose d'un site internet développé en PHP sur lequel j'ai mis en place un cryptage avec 3DES. Des site sde clients communique avec mon site, et les données transmises sont cryptées avec 3DES.

Nous avons réussi à le faire de site PHP vers mon serveur PHP, de site ASP vers mon serveur PHP, et hier, un client me dit qu'il développe en C# et n'arrive pas à mettre en place de cryptage.

Je ne connais pas le C# (mais j'ai tout de même une bonne connaissance java, j'ai cru comprendre que ça pouvait aider ...)

J'ai trouvé un script pour réaliser mon cryptage, et pour mes tests, j'écris mon résultat dans un fichier, voici le code :

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
 
public static string Encrypt(string plainText,
                                 string saltValue,
                                 string initVector)
    {
        // Convert strings into byte arrays.
        // Let us assume that strings only contain ASCII codes.
        // If strings include Unicode characters, use Unicode, UTF7, or UTF8 
        // encoding.
        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
        byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
 
        // Convert our plaintext into a byte array.
        // Let us assume that plaintext contains UTF8-encoded characters.
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
 
        // Create uninitialized Rijndael encryption object.
        SymmetricAlgorithm symmetricKey = new TripleDESCryptoServiceProvider();
 
        // It is reasonable to set encryption mode to Cipher Block Chaining
        // (CBC). Use default options for other symmetric key parameters.
        symmetricKey.Mode = CipherMode.CFB;
 
        // Generate encryptor from the existing key bytes and initialization 
        // vector. Key size will be defined based on the number of the key 
        // bytes.
        ICryptoTransform encryptor = symmetricKey.CreateEncryptor(
                                                         saltValueBytes,
                                                         initVectorBytes);
 
        // Define memory stream which will be used to hold encrypted data.
        MemoryStream memoryStream = new MemoryStream();
 
        // Define cryptographic stream (always use Write mode for encryption).
        CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                     encryptor,
                                                     CryptoStreamMode.Write);
        // Start encrypting.
        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
 
        // Finish encrypting.
        cryptoStream.FlushFinalBlock();
 
        // Convert our encrypted data from a memory stream into a byte array.
        byte[] cipherTextBytes = memoryStream.ToArray();
 
        FileStream fs = File.Create("encrypt.dat");
        fs.Write(cipherTextBytes, 0, (int)memoryStream.Position);
        fs.Close();
 
        // Close both streams.
        memoryStream.Close();
        cryptoStream.Close();
 
        // Convert encrypted data into a base64-encoded string.
        string cipherText = Convert.ToBase64String(cipherTextBytes);
 
        // Return encrypted string.
        return cipherText;
    }
Ce que je comprends pas, c'est que j'ai fait un test avec ce code et j'ai obtenu :

Le mêm cryptage réalisé en PHP m'a donné le résultat suivant :
Je vous confirme que j'ai utilisé la même valeur et la même clé pour le cryptage bien entendu.

Au final, il semble que le cryptage soit presque bon (oui nous avons 5 premiers caractères identiques...) mais je ne comprends pas pourquoi la version C# ajoute les caractères : "M¢"

Auriez-vous une idée qui explique cette différence ? et une solution pour obtenir le même résultat que le script PHP ?

D'avance merci.

Vince