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

Delphi Discussion :

JvXORCipher bug sur widestring


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2016
    Messages : 7
    Points : 6
    Points
    6
    Par défaut JvXORCipher bug sur widestring
    Bonjour,
    j'utilise le composant JEDI JvXORCipher afin d'encoder une chaine de caractères et la décoder.

    si la chaine de caractères à décoder est "fournie" par la méthode Decodestring : ok
    si je lis cette chaine de caractères dans un fichier texte la méthode decodestring ne prend pas en compte tous les caractères.

    le bug est lié au fait que sur embarcadero XE7 les widestring sont alloués sur 2 octets.

    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
    procedure TRELCALChoixSortieFrm.FormActivate(Sender: TObject);
    var
    ii: integer;
    tempstr: string;
    bRandomCode: string;
    Codedépart: string;
    Codeactivation : string;
    bACoder: string;
    bYear: string;
    bBlocCode : widestring;
    bDecodestring: string;
    bLicTxt : string[100];
     
     
     
    begin
      RELCALDataModule.ConnectBdd;
      ASerial := getserial;
      Edit2.Text := ASerial;
      bLicTxt := RELCALCommon.CleAnnuelle;
     
      RELCALDataModule.ADOSPGetMyDate.Parameters.ParamByName('@Ladate').Direction := pdOutput;
      RELCALDataModule.ADOSPGetMyDate.ExecProc;
      ADateJourStr := RELCALDataModule.ADOSPGetMyDate.Parameters.ParamByName('@Ladate').value;
      AdateJour := StrtoDate(ADateJourStr);
      AYear := YearOf(AdateJour);
      bYear := inttostr(AYear);
      EdAnnee.Text := bYear;
     
        if RELCALCommon.CleGen = '' then
      begin
        bRandomCode := RELCALDataModule.RandomPassword(10);
        RELCALCommon.BIniFile.WriteString('Produit', 'Gen ', bRandomCode );
        RELCALCommon.CleGen := bRandomCode;
      end;
      edAbonnement.Text := RELCALCOMMON.NomAbonnement;
      bACoder := bYear+ASerial+RELCALCOMMON.NomAbonnement;
      adACoder.Text := bACoder;
      bBlocCode := GetGenReg(bACoder, RELCALCommon.CleGen);
      EdLiceCode.Text := bBlocCode;
      EdLicenceLUE.text := bLicTxt;
      bDecodeString := DecodeReg(bBlocCode,RELCALCommon.CleGen);
      edLicenceDec.Text := bDecodeString;
      eddectxt.Text := DecodeReg(RELCALCommon.CleAnnuelle ,RELCALCommon.CleGen);
     
      SetCombo;
    end;
     
    function TRELCALChoixSortieFrm.DecodeReg(pACoder: widestring; pkey: widestring):string;
    begin
      result := JvXORCipher1.DecodeString(pKey,pACoder);
    end;

    merci pour votre aide,
    Images attachées Images attachées  

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut


    Sur XE7 String et WideString sont les deux sur 2 octets !
    C'est quoi le prototype de la TJvXORCipher.DecodeString ? String ou RawByteString ?
    Pour ce genre chose, vaut mieux utiliser un PByte ou TStream, c'est chiant ces vieilles API de Delphi7 utisant encore du string

    Quel est la raison d'utiliser du WideString, tu veux intégrer cela à un ActiveX, un objet COM que encapsulera ton système de licence ?
    En dehors de l'automation, il n'y pas de raison d'utiliser du WideString
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2016
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    La fonction implémentée decodeString(pkey : AnsiString; const Value : pAnsiString) : AnsiString dans JvXorCipher renvoi un AnsiString.
    C'est cette fonction qui est beuguée au vue du codage de ansistring;
    J'ai essayé de passé par un TStream et utiliser la procedure DecodeStream(pkey: AnsiString; Stream: TStream) avec passage du string en tstream avant , puis tstream en string après mais cela donne un résultat incohérent
    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
    **********************
      bStream := StringToStream(RELCALCommon.CleAnnuelle);
      DecodeReg(bStream ,RELCALCommon.CleGen);
      edDectxt.Text := StreamToString(bStream);
    ********************
     
    function TRELCALChoixSortieFrm.StringToStream(const pString: string): TStream;
    begin
      Result := TStringStream.Create(pString);
    end;
     
    function TRELCALChoixSortieFrm.StreamToString(Stream: TStream): string;
    var
      ms: TMemoryStream;
    begin
      Result := '';
      ms := TMemoryStream.Create;
      try
        ms.LoadFromStream(Stream);
        SetString(Result, PChar(ms.memory), ms.Size);
      finally
        ms.Free;
      end;
    end;
     
    resultat : function TRELCALChoixSortieFrm.StreamToString(Stream: TStream): string;
    var
      ms: TMemoryStream;
    begin
      Result := '';
      ms := TMemoryStream.Create;
      try
        ms.LoadFromStream(Stream);
        SetString(Result, PChar(ms.memory), ms.Size);
      finally
        ms.Free;
      end;
    end;
    suggestion ?

    Merci

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    AnsiString, c'est justement nettement mieux pour gérer une sorte de binaire
    Attention sur le Stream.Size, une chaine "string" en XE7 c'est Size = Length x 2
    Tu risques de récupérer de caractère genre chinois ou russe avec ton SetString

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function TRELCALChoixSortieFrm.StreamToString(Stream: TStream): AnsiString;
    ...
    SetString(Result, PAnsiChar(ms.memory), ms.Size);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2016
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    AnsiString, c'est justement nettement mieux pour gérer une sorte de binaire
    Attention sur le Stream.Size, une chaine "string" en XE7 c'est Size = Length x 2
    Tu risques de récupérer de caractère genre chinois ou russe avec ton SetString

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function TRELCALChoixSortieFrm.StreamToString(Stream: TStream): AnsiString;
    ...
    SetString(Result, PAnsiChar(ms.memory), ms.Size);
    Bonjour, j'ai modifié le code de la procédure
    ************************************
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function TRELCALChoixSortieFrm.StreamToString(Stream: TStream): string;
    var
      ms: TMemoryStream;
    begin
      Result := '';
      ms := TMemoryStream.Create;
      try
        ms.LoadFromStream(Stream);
        SetString(Result, PAnsiChar(ms.memory),(ms.Size)*2);
      finally
        ms.Free;
      end;
    end;
    *****************************
    ci-dessous les lignes de codes avec commentaires

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      edAbonnement.Text := RELCALCOMMON.NomAbonnement;       // Lit le nom de la société abonnée
      bACoder := bYear+ASerial+RELCALCOMMON.NomAbonnement;    // Concatene l'année, le numéro unique du PC, le nom société
      adACoder.Text := bACoder; //Afiche la concaténation avant codage
      bBlocCode := GetGenReg(bACoder, RELCALCommon.CleGen);  //Codage Xor du champs à coder
      EdLiceCode.Text := bBlocCode;  //Affiche le code généré
      EdLicenceLUE.text := bLicTxt;   //Affiche le Code lue dans le fichier txt
      bDecodeString := DecodeReg(bBlocCode,RELCALCommon.CleGen);    //Décode le code généré par le Xor
      edLicenceDec.Text := bDecodeString;  //Affiche le décodage du codage
      bStream := StringToStream(RELCALCommon.CleAnnuelle);  //passage du string du fichier texte en Tstream
      DecodeStreamProc(bStream ,RELCALCommon.CleGen);  //décodage du stream
      edDectxt.Text := StreamToString(bStream); //cast du stream en string
    //////// !!!!!!!!!!! ///////
    Et finallement j'ai toujours la chaine décodée tronquée ( voir image)

    peut-être qu'une autre méthode pour coder décoder serait plus adaptée ? Le besoin final est de controler une licence annuelle sur le soft fourni.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    ce n'est pas un bug de JvXORCipher, et AMHA, je me trompe peut être mais une simple conversion devrait suffire (en supposant qu'il n'y ait pas de caractères non ANSI, sinon il doit être possible de jouer sur le Codepage de l'AnsiString) i.e type W1252String = type AnsiString(1252) .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TRELCALChoixSortieFrm.DecodeReg(pACoder: widestring; pkey: widestring):string;
    begin
      result := JvXORCipher1.DecodeString(AnsiString(pKey),AnsiString(pACoder));
    end;
    ou encore une déclaration différente de decodereg (déjà que je trouve que l'inversion des paramètres est perturbante )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TRELCALChoixSortieFrm.DecodeReg(pkey, pACoder: AnsiString): String;
    begin
      result := JvXORCipher1.DecodeString(pKey,pACoder);
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Pour moi, il y a un problème sur la longueur de la clé.

    Comment est déclaré CleAnnuelle, aussi string[100] comme bLicTxt ?

    En admettant que la clé soit "Andnotor" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bBlocCode := GetGenReg(bACoder, RELCALCommon.CleGen); //Length(bBlocCode) = 8
    DecodeReg(bBlocCode,RELCALCommon.CleGen);             //Décodage sur une clé de 8 caractères
    mais ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DecodeReg(RELCALCommon.CleAnnuelle ,RELCALCommon.CleGen); //Décodage sur une clé de 100 caractères si CleAnnuelle est string[100]
    Même si une chaîne string[100] est chargée avec "Andnotor", sa longueur sera toujours de 100 caractères. Sa représentation en mémoire sera Andnotor#0vdvjdvbjr3le98wduchcb31od8hncl.... Passer cela en paramètre à une widestring n'y changera rien, la widestring fera aussi 100 caractères.

    Afficher ensuite ces deux clés de décodage dans des TEdit est trompeur puisque les chaînes sont tronquées au premier #0. Elles semblent identiques mais ne le sont pas

    pour passer CleAnnuelle sur la longueur réelle (tronquée au #0) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eddectxt.Text := DecodeReg(PChar(RELCALCommon.CleAnnuelle) ,RELCALCommon.CleGen);
    Au niveau SetString, cela devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetString(Result, PChar(ms.memory), ms.Size div SizeOf(Char));
    ou plus simplement (pour autant qu'il y ait un #0 terminal bien sûr) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := PChar(ms.memory);

Discussions similaires

  1. [RegEx] Petit Bug sur Expression Régulière
    Par Delphy113 dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2005, 20h48
  2. [Plugin][VE]Bug sur Eclipse Visual Project Editor
    Par capitaine_choc dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 31/05/2005, 14h51
  3. Bug sur glColor3i !
    Par ZiZouJH dans le forum OpenGL
    Réponses: 23
    Dernier message: 04/06/2004, 10h21
  4. Bug sur la prorpiété required d'un TField avec ADO ???
    Par denrette dans le forum Bases de données
    Réponses: 6
    Dernier message: 04/11/2003, 11h04
  5. Page de rapport de bug sur le site de Sun
    Par piff dans le forum Général Java
    Réponses: 1
    Dernier message: 03/03/2003, 18h12

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