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 :

Brouiller une chaine texte


Sujet :

Delphi

  1. #1
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut Brouiller une chaine texte
    J'ai beau chercher ... il m'est impossible de retrouver la methode de cacul de clefs circulaires a base XOR avec un maximum de valeur avant de boucler ?

    Le but etant de brouiller une chaine texte de maniere un peu plus sofistiquee qu'un simple XOR a clef unique. Si je peux changer la permutation de la clefs a chaques caracteres ca serait cool.

    Tout autre algo (leger) dans le genre sera le bienvenu

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 190
    Points : 218
    Points
    218
    Par défaut
    bonjour

    euh j'ai pas tout compris a ta question pour moi un xor c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function CryptageXor(Cle,StrIn:string):string;//wn030825
    var
      i,loCle:integer;
      strOut:string;
    begin
      strOut:='';
      for i:=1 to Length(StrIn) do begin
        strOut:=strOut+chr(ord(strin[i]) xor ord(cle[(i mod length(cle))+1]));
      end;
      Result:=strOut;
    end;

  3. #3
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Oui, effectivement.
    La tu utilise une succession circulaire de clefs de 1 octets definie par la veritable clef.

    si tu transmet une cle composée de 10 caracteres, tu bouclera donc sur 10 clefs successives.

    C'est ce que je cherche a faire, mais j'ai entendu parler d'une formule qui genere automatiquement les clefs successifes.

    Exemple :
    out[1] = in[1] XOR key; key = next(key);
    out[2] = in[2] XOR key; key = next(key);
    out[3] = in[3] XOR key; key = next(key);
    ...

    Next(key) permet de calculer la clef suivante selon une formule que je recherche : decalage de bits + reintroduction d'un XOR sur certains bits.
    Mais je ne la retrouve plus
    Cette formule serait (a ce qu'il parrait) capable de genere une grande quantité (256 ?) de valeur avant de boucler.

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Le but etant de brouiller une chaine texte de maniere un peu plus sofistiquee qu'un simple XOR a clef unique...Tout autre algo (leger) dans le genre sera le bienvenu.
    ... si c'est juste pour crypter une chaîne voiçi un code provenant de Paul THOT et qui dans son état actuel remplace les caractères accentués d'une chaîne par des caractères non accentués mais on peut y modifier la constante SansAccents : array[Char] of Char de sorte que la conversion obtenue brouille le texte d'origine (en y remplaçant par exemple le 'A' par ':', le 'Z' par 'ù' et ainsi de suite, à l'exception peut-être du #0 et du #8). Ensuite il suffit de créer les routines homologues pour décrypter dans le sens inverse.
    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
     
    const SansAccents : array[Char] of Char
                 =  #0#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 +
                    ' !"#$%&''()*+,-./0123456789:;<=>?' +
                    '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'+
                    '`abcdefghijklmnopqrstuvwxyz{|}~'#127 +
                    '€'#129'‚ƒ„…†‡ˆ‰S‹Œ'#141'Ž'#143#144'‘’“”•–—˜™s›œ'#157'zY' +
                    #160'¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿' +
                    'AAAAAAÆCEEEEIIIIDNOOOOO×ØUUUUYÞß' +
                    'aaaaaaæceeeeiiiidnooooo÷øuuuuyþy';
     
    function EnleveAccentsPThot2(const AText : String) : string;
    var
     i:integer;
     p:pchar;
    begin
     Result:=AText;
     if Result='' then EXIT;  //<<<
     p:=@Result[1];
     for i:=1 to Length(Result) do begin
      p^:=SansAccents[p^];
      inc(p);
     end;
    end;
    A+

  5. #5
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Bonne suggestion, mais peu differente d'un simple tableau de bytes definissant "a la main" une succession de XOR.
    C'est d'ailleur peut etre ce que je devrais faire .... en changeant l'id d'entree dans le tableau ....

  6. #6
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    La fonction est de Paul Thot, mais la constante est de moi, ah mais !

    Pis j'avais fait une version assembleur il me semble.

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-Bonjour,
    CapJack a écrit:
    La fonction est de Paul Thot, mais la constante est de moi, ah mais !
    Pis j'avais fait une version assembleur il me semble.
    ... tout à fait exact et voiçi la dernière version de ta fonction CJ9 qui appelle ta fonction CJ9Buff en assembleur dans laquelle MNA désigne l'homologue de la constante SansAccents évoquée dans mon message précédent :
    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
     
    const MNA : array[Char] of Char
                 =  #0#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 +
                    ' !"#$%&''()*+,-./0123456789:;<=>?' +
                    '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_' +
                    '`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~'#127 +
                    '€'#129'‚ƒ„…†‡ˆ‰S‹Œ'#141'Z'#143#144'''""•–—˜™S›Œ'#157'ZY' +
                    #160'¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿' +
                    'AAAAAAÆCEEEEIIIIDNOOOOO×OUUUUYÞß' +
                    'AAAAAAÆCEEEEIIIIDNOOOOO÷OUUUUYÞY';
     
    function CJ9Buff(const Source,Dest:PAnsiChar;const Len:Integer):PAnsiChar;register;
    asm
            PUSH    ESI // Sauvegarde ESI par nécesssité technique
            PUSH    EDI // Sauvegarde EDI par nécesssité technique
            PUSH    EBX // Sauvegarde EBX par nécesssité technique
            PUSH    EAX
     
            CLD
            XOR     EBX,EBX   // EBX := 0
            CMP     ECX,EBX   // Len <= 0 ?
            JLE     @Out      // Si oui, sauter
     
            MOV     ESI,EAX   // Adresse de la source chaîne dans ESI
            MOV     EDI,EDX   // Adresse de la destination dans EDI
            LEA     EBX,MNA   // Adresse de MNA dans EBX
     
    @Loop:
            LODSB             // AL <- [ESI] ; Inc(ESI)
            XLAT              // AL <- [EBX + AL]
            STOSB             // [EDI] <- AL ; Inc(EDI)
            DEC     ECX       // On décrémente le compteur
            JNE     @Loop     // si pas fini, boucle
     
    @Out:
            POP     EAX       // renvoie dans Result l'adresse de la chaîne
            POP     EBX
            POP     EDI
            POP     ESI
    end;
     
    function CJ9(const S:string):string;
    var
      Len: Integer;
    begin
      if S = '' then Result := '' else
       begin
        Len := Length(S);
        SetLength(Result, Len);
        CJ9Buff(PAnsiChar(S), PAnsiChar(Result), Len);
       end;
    end;
    ... et comme avec la constante SansAccents il suffit de modifier l'ordre du contenu de la constante MNA pour obtenir une conversion de cryptage et de faire des routines similaires pour le décryptage dans le sens inverse.

    A+

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Petite question :
    Quel est le role de la partie assembleur ? et pourquoi ne pas l'ecrire en code pascal ?

    Sinon pour ma part, je cherchais quelque chose de plus simple. Mais j'ai modulé mes solutions en m'inspirant de quelques details de celle ci.

    En fait je vais me creer un outils de generation d'un ensemble aleatoire et non redondant de 255 bytes qui me servira de successions de clefs.

    La fonction de cryptage sera un simple XOR du caractere avec la Nieme clef.

    Je voulais juste que mes chaines 'apparaissent pas en clair dans l'exe
    et eventuelement rendre illisible directement certaines ressources 'images notement) .....

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    en fait tu peut utiliser n'importe qu'elle methode de criptage
    exemple le code de vigenere

    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
    FUNCTION CodeVigenere(S,Clef:STRING):STRING;
    VAR S2:STRING;
        LClef,L,i,j,k,n:BYTE;
    BEGIN
      LClef:=LENGTH(Clef);
      IF LClef=0 THEN EXIT;
      L:=LENGTH(S);
      S2:='';
      FOR i:=1 TO L DO
      BEGIN
        j:=1+(i-1) mod LClef;
        k:=ord(Clef[j])-1;
        n:=ord(S[i]);
        S2:=S2+char(1+(n+k-1) MOD 256);
      END;
     result := S2;
    END;
     
    FUNCTION DecodeVigenere(S,Clef:STRING):STRING;
    VAR S2:STRING;
        LClef,L,i,j,k,n:BYTE;
    BEGIN 
      LClef:=LENGTH(Clef);
      IF LClef=0 THEN EXIT;
      L:=LENGTH(S); 
      S2:='';
      FOR i:=1 TO L DO
      BEGIN
        j:=1+(i-1) mod LClef;
        k:=ord(Clef[j])-1;
        n:=ord(S[i]);
        S2:=S2+Char(1+(256+n-k-1) MOD 256);
      END;
      result:=S2
    END;
    @+ Phil

  10. #10
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    effectivement j'ai entendu parler du code de Vigiere .... mais j'etait axé sur XOR.

    Je vais le prendre aussi. Je me monte une lib de cryptage et cela peut etre interessant a avoir.

    Quand a savoir quelle methode j'utiliserais ... je vais tester les 2

    Pour le moment je laisse tomber des methodes plus complexes telles que DES, AES, etc ... car trop cela me semble un peu lourd pour coder/decoder de simples chaines ...

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Clorish a demandé :
    Petite question :
    Quel est le role de la partie assembleur ? et pourquoi ne pas l'ecrire en code pascal ?
    ... le rôle de la partie assembleur est d'accélérer les conversions de textes : la fonction de CapJack s'est avérée être environ deux fois plus rapide que celle de Paul Thot pour des textes multilignes à condition de lui transmettre la totalité des lignes du texte sous forme d'une chaine unique car si, pour un même texte, on ne lui transmet qu'une ligne de texte après l'autre par des appels répétitifs via un boucle elle est au contraire environ deux fois plus lente que celle de Paul Thot. La fonction de Paul Thot ne présente pas cet inconvénient le temps d'exécution reste à peu près le même qu'on lui transmette le texte en une seule chaine ou ligne par ligne depuis une boucle.
    A+

  12. #12
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    ok

    Merci pour ces infos ....
    Decidement, il faudra vraiement qu'un jour je me mette a l'assembleur

Discussions similaires

  1. traitement d'une chaine texte
    Par aghilass dans le forum Développement
    Réponses: 5
    Dernier message: 05/06/2013, 16h03
  2. Traiter une chaine texte
    Par johweb dans le forum Débuter
    Réponses: 2
    Dernier message: 15/07/2008, 11h52
  3. PhpMyAdmin recherche de caractere dans une chaine text
    Par dalsim59 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 18/06/2008, 11h15
  4. Longueur d'une chaine Text sur l'écran
    Par GSXRider dans le forum C#
    Réponses: 2
    Dernier message: 20/02/2008, 09h23
  5. [IO]Récupérer une chaine texte dans un flux HTTP
    Par elitost dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 16/03/2005, 10h39

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