IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

cryptage 3DES c# / PHP


Sujet :

C#

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Par défaut cryptage 3DES c# / PHP
    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

  2. #2
    Membre émérite
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Par défaut
    Ça sent le remplissage différent...
    Regarde donc du coté de la propriété padding en mettant, à vu de nez, PaddingMode.None.

    Les sources Php (javascript, ...) sont des scripts (puisque interprété) tandis qu'en C# (java, c++, ...) on parle plus volontiers de code (étant lui compilé).

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Par défaut
    Merci pour cette réponse.
    J'ai donc testé avec PaddingMode.None, mais j'obtiens l'erreur suivante :

    Longueur des données à chiffrer inccorecte.
    Une idée ?
    Merci.

  4. #4
    Membre émérite
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Par défaut
    Il faut connaitre exactement tous les paramètres de la partie php afin de faire de même en c#:
    • Le mode
    • Le remplissage (il y a d'autres possibilités que none)
    • Le vecteur d'initialisation
    • La clé

    Faire attention à l'encodage de caractère (utf-8, iso-8859-1, ascii, ...)
    Est-ce qu'il y a toujours "M¢" à la fin ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Par défaut
    Bonjour,

    OK voici les éléments :

    Mode : CFB
    Remplissage : pour l'instant None
    vecteur d'initialisation : 'password' (pour les tests, en cas normal, il est généré de façon alétaoire et transmis en paramètre
    clé : valeur sur 24 caractères

    Les données sont encodées en UTF8.

    J'espère que ces éléments pourront vous aider.
    Merci

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Par défaut
    même problème avec un remplissage Padding.Zeros.
    Une idée?

Discussions similaires

  1. [PHP 5.4] Cryptage AES <-> Java / PHP
    Par karistote dans le forum Langage
    Réponses: 1
    Dernier message: 22/10/2014, 09h26
  2. Cryptage 3DES & stockage SQLite
    Par steph68b dans le forum Android
    Réponses: 7
    Dernier message: 30/10/2012, 13h42
  3. [WD17] Cryptage Windev vers PHP
    Par Mary. dans le forum WinDev
    Réponses: 4
    Dernier message: 24/08/2012, 17h24
  4. Cryptage 3DES : problème
    Par stof dans le forum Langage
    Réponses: 9
    Dernier message: 23/08/2012, 14h08
  5. Cryptage de fichier PHP
    Par diopy2001 dans le forum Zend
    Réponses: 1
    Dernier message: 05/05/2006, 18h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo