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

Langage PHP Discussion :

Récuperer un tableau de Byte à partir d'un String UTF8


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Récuperer un tableau de Byte à partir d'un String UTF8
    Bonjour
    Je travaille en ce moment sur un système de cryptage PHP / décryptage VB.NET ...
    Et j'aimerais en quelque sorte traduire un code VB.NET en PHP, je sais que ce ne sont pas du tout les mêmes langages, mais je suis certain que c'est possible !

    Ma fonction VB.NET :

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Function Crypte(ByVal StringValue As String, ByVal Key As Integer) As String
            Dim Bytes As Byte() = System.Text.Encoding.UTF8.GetBytes(StringValue)
     
            Dim StringList As New List(Of String)
     
            For Index = Bytes.Count - 1 To 0 Step -1
                StringList.Add(CStr((Key - Bytes(Index)) * Key))
            Next
     
            Return Join(StringList.ToArray, "A")
        End Function

    Et la fonction PHP que je suis entrain de faire :

    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
    <?php
        function crypte($stringValue, $key)
        {
            $byteArray = array();
     
            //Ici, il me faudrait récupérer sous forme de tableau de Byte l'argument $stringValue (qui est en UTF8)
     
            //Ne faites pas attention à la suite, c'est du grand n'importe quoi ^^
     
            $stringArray = array();
     
            for ($i=strlen($_POST["Key"]); $i > 0; $i--)
            {
                array_push($stringArray, var)
     
     
                chr($chr);
                ord($str)
            }
     
            echo join($stringArray, "A")
        }
    ?>
    Et j'ai beau chercher, je ne trouve rien (pour faire ce qu'il y a écrit en commentaire dans la fonction PHP)

    Si vous pouvez me donner quelque piste, je serai très content
    Merci à vous et bonne journée !
    Dernière modification par Bovino ; 15/07/2013 à 08h43. Motif: Merci d'indiquer le langage utilisé ([code=xxx]) !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut correction du code
    Il y a la fonction ord() pour ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $bytes = array();
    $len = mb_strlen($stringValue);
    for($i = 0; $i < $len; $i++){
         $bytes[] = ord(mb_substr($i ,1));
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bytes[] = ord(mb_substr($len ,1));
    Je ne comprends pas très bien cette ligne.

    Je croyais que c'était array_push pour ajouter une valeur à un Array

    Et pourquoi n'utilise t-on pas $i, on en a pas besoin ?

    Merci
    Dernière modification par Invité ; 13/07/2013 à 10h58.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je croyais que c'était array_push pour ajouter une valeur à un Array
    La syntaxe [] fait la même chose en plus simple.

    Et pourquoi n'utilise t-on pas $i, on en a pas besoin ?
    $i est utilisé dans la boucle for

  5. #5
    Invité
    Invité(e)
    Par défaut
    Quand je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            $byteArray = array();
     
            $length = mb_strlen($stringValue);
     
            for($i = 0; $i < $length; $i++)
            {
                $byteArray[] = ord(mb_substr($length ,1));
            }
     
            for($i = 0; $i < count($byteArray); $i++)
            {
                echo $byteArray[$i] . "\r\n";
            }
    J'obtiens :

    51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51
    Alors que je suis censé obtenir :

    76 101 32 115 116 114 105 110 103 32 115 101 99 114 101 116 32 114 101 112 114 195 169 115 101 110 116 97 110 116 32 108 101 32 115 116 97 116 101 32 100 101 32 108 39 117 116 105 108 105 115 97 116 101 117 114 32 113 117 101 32 86 66 46 78 69 84 32 100 111 105 116 32 100 195 169 99 114 121 112 116 101 114
    Je suis certain que ça vient de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ord(mb_substr($length ,1));

  6. #6
    Invité
    Invité(e)
    Par défaut
    Cependant, avec ceci :

    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
    <?php
        header ('Content-type: text/html; charset=utf-8');
     
        echo crypte("Le string secret représentant le state de l'utilisateur que VB.NET doit décrypter", 48);
     
        function crypte($stringValue, $key)
        {
            $byteArray = array();
     
            $length = mb_strlen($stringValue);
     
            for($i = 0; $i < $length; $i++)
            {
                $byteArray[] = ord(mb_substr($stringValue, $i, 1, "UTF8"));
            }
     
            for($i = 0; $i < count($byteArray); $i++)
            {
                echo $byteArray[$i] . "\r\n";
            }
        }
    ?>
    Tout marche !
    Sauf qu'il manque trois Bytes

    Car j'obtiens :

    76 101 32 115 116 114 105 110 103 32 115 101 99 114 101 116 32 114 101 112 114 195 115 101 110 116 97 110 116 32 108 101 32 115 116 97 116 101 32 100 101 32 108 39 117 116 105 108 105 115 97 116 101 117 114 32 113 117 101 32 86 66 46 78 69 84 32 100 111 105 116 32 100 195 99 114 121 112 116 101 114 0 0
    Au lieux de :

    76 101 32 115 116 114 105 110 103 32 115 101 99 114 101 116 32 114 101 112 114 195 169 115 101 110 116 97 110 116 32 108 101 32 115 116 97 116 101 32 100 101 32 108 39 117 116 105 108 105 115 97 116 101 117 114 32 113 117 101 32 86 66 46 78 69 84 32 100 111 105 116 32 100 195 169 99 114 121 112 116 101 114
    Il y a trois Bytes de différences, pourquoi
    Il ne doit pas bien digérer les accents ...

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    En forçant l'encodage comme tu l'as fait sur mb_substr() je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $length = mb_strlen($stringValue,'UTF8');
    Au passage, pour parcourir un tableau PHP, utilise foreach et surtout pas une boucle for/count
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     foreach($byteArray as $byte)   {
                echo $byte . "\r\n";
            }

  8. #8
    Invité
    Invité(e)
    Par défaut
    Non, toujours pas ça ...

    Même de cette manière là, les Bytes sont différente de ce que je suis censé obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    utf8_encode(htmlentities("Le string secret représentant le state de l'utilisateur que VB.NET doit décrypter", ENT_QUOTES, "UTF-8"))

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Non, toujours pas ça ...
    Chez moi ça marche.
    Tu obtiens quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    utf8_encode(htmlentities("Le string secret représentant le state de l'utilisateur que VB.NET doit décrypter", ENT_QUOTES, "UTF-8"))
    La tu t'égares.
    htmlentities va convertir tes caractères en entités HTML, tu n'auras plus la même chaine.
    de même tu n'as pas besoin d'encoder en UTF8 puisque ta chaine est censé l'être déjà non ?
    Vérifie par contre que ton fichier .php est bien encodé en UTF8.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Je fais donc ceci :

    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
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
    <?php
        header ("Content-type: text/html; charset=UTF-8");
     
        echo crypte("Le string secret représentant le state de l'utilisateur que VB.NET doit décrypter", 48);
     
        function crypte($stringValue, $key)
        {
            $byteArray = array();
     
            $length = mb_strlen($stringValue,'UTF8');
     
            for($i = 0; $i < $length; $i++)
            {
                $byteArray[] = ord(mb_substr($stringValue, $i, 1, "UTF-8"));
            }
     
            foreach($byteArray as $byte)
            {
                echo $byte . " ";
            }
        }
    ?>
    </body>
    </html>
    J'obtiens 81 Bytes :

    76 101 32 115 116 114 105 110 103 32 115 101 99 114 101 116 32 114 101 112 114 195 115 101 110 116 97 110 116 32 108 101 32 115 116 97 116 101 32 100 101 32 108 39 117 116 105 108 105 115 97 116 101 117 114 32 113 117 101 32 86 66 46 78 69 84 32 100 111 105 116 32 100 195 99 114 121 112 116 101 114
    Au lieu de 83 Bytes :

    76 101 32 115 116 114 105 110 103 32 115 101 99 114 101 116 32 114 101 112 114 195 169 115 101 110 116 97 110 116 32 108 101 32 115 116 97 116 101 32 100 101 32 108 39 117 116 105 108 105 115 97 116 101 117 114 32 113 117 101 32 86 66 46 78 69 84 32 100 111 105 116 32 100 195 169 99 114 121 112 116 101 114
    Les accents ne sont pas gérés de la même façon ...

    Il manque toujours 2 Bytes ...

    Il faut que les deux listes de Bytes correspondent

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je crois que tu vas être content :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $byteArray= unpack('C*', "Le string secret représentant le state de l'utilisateur que VB.NET doit décrypter"));
    Mais sinon pourquoi tu n'utilises pas un algorythme de chiffrement existant ? Ca serait plus solide.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Trop fort
    C'est exactement ça

    Peux-tu m'expliquer comment ça fonctionne ?
    A quoi correspond le C* ?

    Encore merci, c'est parfait !

    Mais sinon pourquoi tu n'utilises pas un algorythme de chiffrement existant ? Ca serait plus solide.
    J'aime bien quand c'est à la main

  13. #13
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Patak Voir le message
    J'aime bien quand c'est à la main
    Oui d'accord, mais n'oublie pas que dans le domaine de la cryptographie, plus il y a de mains et mieux c'est...

  14. #14
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Obligé de renseigner l'encodage dans les fonctions mbstring parce que ton header est inefficace, vu qu'il génère un warning headers already send.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/03/2012, 20h26
  2. Création d'un tableau en shell à partir d'un string
    Par jimmy4413 dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 31/05/2011, 14h00
  3. Obtenir un entier à partir d'un tableau de bytes
    Par Papy214 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/04/2008, 15h45
  4. Création de bitmap à partir d'un tableau de byte
    Par Phenix26 dans le forum Windows
    Réponses: 2
    Dernier message: 06/12/2007, 20h30
  5. Alimenter une image byte[] à partir d'un String
    Par SheikYerbouti dans le forum AWT/Swing
    Réponses: 18
    Dernier message: 31/10/2006, 07h54

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