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 :

Crypter / Décrypter du texte


Sujet :

Delphi

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut Crypter / Décrypter du texte
    salut

    je suis à la recherche d'un moyen de crypter / décrypter du texte (des phrases, variable string) de façon efficace

    je sais bien que rien est inviolable, quand je dis efficace, j'entends fiable (difficile à décrypter)

    j'ai besoin de conseil, car j'ai pensé à utiliser 2 méthodes différentes afin de rendre la chose plus difficile à "casser"

    est ce un bon moyen ? ou pas nécessaire ?

    j'ai trouvé des fonctions de crypt sur google, la plupart utilisait un XOR

    mon application interagit avec mon site web, j'aimerais pouvoir utiliser donc cette méthode en delphi et en php

    donc dans vos propositions sachez qu'il faudrait qu'on puisse traduire en php sans trop de difficulté :/

    merci d'avance à ceux qui me liront

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    tu peux utilise BlowFish dont on trouve des implémentations en Delphi.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    Salut,

    Mes réponses dans le texte.


    j'ai besoin de conseil, car j'ai pensé à utiliser 2 méthodes différentes afin de rendre la chose plus difficile à "casser"
    est ce un bon moyen ? ou pas nécessaire ?
    Pour moi, ce n'est pas nécessaire... Maintenant, libre à toi


    j'ai trouvé des fonctions de crypt sur google, la plupart utilisait un XOR
    C'est en effet d'une efficacité redoutable et c'est très pratique.
    Efficace car le mot de passe n'est pas embarqué dans le code, et pratique car Xor(Xor(a))=a
    Donc, la même procédure crypte et décrypte : c'est marrant

    mon application interagit avec mon site web, j'aimerais pouvoir utiliser donc cette méthode en delphi et en php
    Xor est une fonction qui est dispo en Delphi et Php, donc, pas de problème...

    De quoi as-tu besoin ? D'un morceau de procédure ? D'un algo supplémentaire ?

    Autrement, tu as aussi le md5 dont tu peux trouver les sources en php et Delphi... Par contre, le md5 ne crypte pas mais 'hache', c'est à dire que deux chaînes différentes peuvent aboutir à la même chaîne md5... Ceci dit, vu la longueur de la chaîne md5, il est pratiquement impossible que tu tombes sur ce cas...

    Il te faut des sources ?

    Th.

  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 263
    Points
    3 263
    Par défaut
    Bonjour,

    car j'ai pensé à utiliser 2 méthodes différentes afin de rendre la chose plus difficile à "casser"
    ... Tout d'abord il convient de jouer avec le fait qu'un "casseur" ne s'attaque à "casser" un fichier que s'il sait qu'il s'agit d'un fichier crypté, donc en sauvant le fichier crypté avec une extension du type *.dat par exemple on détourne déjà l'attention du "casseur" en direction d'autres fichiers.

    A propos de "2 méthodes différentes" : voici un truc assez simple à coder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    const
     Crypt1 : 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:;<=>?' +
                    '@ABCDERGHIJKLMNOPQFSTUVWXYZ[\]^_'+
                    '`abcdefghijklmnopqrstuvwxyz{|}~'#127 +
                    '€'#129'‚ƒ„…†‡ˆ‰S‹Œ'#141'Ž'#143#144'''""•--˜™s›œ'#157'zY' +
                    #160'¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿' +
                    'AAAAAAÆCEEEEIIIIDNOOOOO×ØUUUUYÞß' +
                    'aaaaaaæceeeeiiiidnooooo÷øuuuuyþy';
    
    Decrypt1 : array[Char] of Char
                 =  #0#1# ...... y';
    ... pour commencer on crée deux constantes Crypt1 et Decrypt1 comme ci-dessus et dans Crypt1 on embrouille l'ordre de la table des caractères en les permutant deux par deux et en mémorisant dans la constante Decrypt1 la position du caractère de remplacement pour le décryptage.
    ... dans la constante Crypt1 j'éviterais, pour ma part de modifier le #0 et les caractères #13 et #10 (fin de ligne) ainsi que le marqueur de fin de fichier.

    ... pour compliquer le boulot du "casseur", au lieu de ne créer qu'une seule paire de Crypt1-Decrypt1 on peut en créer plusieurs et on applique chaque paire de CryptJ-DecryptJ lorsque Indice_De_Ligne modulo X = 0. (on peut également appliquer chaque paire lorsque l'indice i de Text[i] modulo K = 0)

    ... et pour finir, au-lieu de sauver les lignes du texte crypté dans l'ordre croissant on peut les sauver la tête en-bas.

    ... et s'il s'agit de crypter un échange de correspondances du type e-mail on peut également modifier le cryptage en fonction, par exemple, de la position de la Lune (ou de Mars) le jour du cryptage et Y heures avant ou après la création du fichier crypté (et pour le décryptage on se basera sur la date-heure qui apparaîtra en clair dans la date de création du fichier) : ça donnerait un cryptage qui changerait toutes les heures et ça ne laisserait au "casseur" que le temps de se casser les dents pour rien.

    A+.

    P.S : La constante Crypt1 ci-dessus n'est rien d'autre que la table qui permet de convertir un texte accentué en un texte sans accents dans laquelle je n'ai permuté que la position du 'R' et du 'F'.

    EDIT : Tu peux trouver ici du code qui permet de convertir un texte accentué en texte non accentué donc de convertir un texte non crypté en texte crypté en modifiant la constante et pour le décryptage on fait l'inverse http://www.developpez.net/forums/d37...lever-accents/
    Le code le plus simple et le plus rapide est celui de Paul Toth.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    en fait pour décrypter des données le plus simple est encore de décoder le code qui décrypte...XOR ça tient disons 10 lignes d'assembleur, on a donc vite fait d'isoler le code et d'identifier la méthode

    avec BlowFish il faudra identifier que c'est cet algo qui est utilisé (éviter d'avoir un composant TBlowFish dans les DFM !), ensuite il faudra retrouver la clé puisque l'algorithme lui est connu

    quoi qu'il en soit, rien ne résiste à un hacker déterminé muni de suffisamment de coca et de pizzas
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut

    Voila je poste ce petit code écrit en Vbscript trouvé ici dans ce lien juste pour enrichir la discussion et de partager les idées concernant le Cryptage et le Décryptage.Je sais que ça n'a rien avoir ici dans le forum de Delphi mais il se peut qu'il nous donne d'autres visions surtout dans l'écriture de l'algorithme de Cryptage et de Décryptage.

    Code en Vbscript:
    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
     '------------------------------- Scramble -------------------------------'
     ' strText = String to encrypt\decrypt '
     ' lngSeed = Long number for the random seed (key) '
     ' Returns a string '
     
     ' To Encrypt:- Send the plain text with a positive seed number (1-2147483647)'
     ' To Decrypt:- Send the encrypted text with the same number but negative '
     
     Function Scramble (strText, lngSeed)
         Dim L,intRand,bytASC
         Rnd(-1) : Randomize ABS(lngSeed)
         For L = 1 To Len(strText)
             bytASC=Asc(Mid(strText, L))
             If bytASC=126 then bytASC=34
             intRand = bytASC + ((Int(Rnd(1) * 160) - 80) * SGN(lngSeed)) 
             If intRand <= 31 Then 
                 intRand = 125 - (31 - intRand)
             ElseIf intRand >= 126 Then
                 intRand = 32 + (intRand - 126)
             End If
             If intRand=34 then intRand=126
             Scramble = Scramble & Chr(intRand)
         Next
     End Function
    Et voici l'application de test,Il suffit juste de la sauvegarder comme par exemple "Crypt&Decrypt.HTA"
    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
    61
    62
    63
    64
    65
    66
    67
    68
     
     <HTML><HEAD><HTA:APPLICATION /></HEAD>
     <BODY SCROLL="no" STYLE="font-size:16;margin:0px" BGCOLOR="buttonface">
         Seed (1 to 2147483647)<br><INPUT ID="Text4" TYPE="TEXT" SIZE=16 VALUE="1"/><br>
         Text to encrypt<br><INPUT ID="Text1" TYPE="TEXT" SIZE="88" STYLE="Font-Family:Courier new" />
         <INPUT TYPE="button" ID="Button1" VALUE="Encode" /><br>
         Encrypted text<br><INPUT ID="Text2" TYPE="TEXT" SIZE="88" STYLE="Font-Family:Courier new"/>
         <INPUT TYPE="button" ID="Button2" VALUE="Decode" /><br>
         Decrypted text<br><INPUT ID="Text3" TYPE="TEXT" SIZE="88" STYLE="Font-Family:Courier new"/><br>
     </BODY>
     <SCRIPT LANGUAGE="VBScript">
     
     Self.ResizeTo 800,220
     Text3.ReadOnly = true
     
     '---- Encrypted HTA title ----'
     Document.Title = Scramble ("pO25|YBG.C7]Sz~gO% ZwyHeIZne|ayWTM~b9IsG",-2010)
     
     '---- Test encrypt button ----'
     Sub Button1_OnClick()
         Text2.value = Scramble (Text1.value,  Text4.value)
         Text3.value = ""
     End Sub
     
     '---- Test decrypt button ----'
     Sub Button2_OnClick()
         Text3.value = Scramble (Text2.value, -Text4.value)
     End Sub
     
     '---- Scramble ----'
     Function Scramble (strText, lngSeed)
         Dim L,intRand,bytASC
     
         '---- Force seeded random mode 
         Rnd(-1)
     
         '---- Set (positive) seed 
         Randomize ABS(lngSeed)
     
         '---- Scan through string
         For L = 1 To Len(strText)
     
             '---- Get ASC of char
             bytASC=Asc(Mid(strText, L))
     
             '---- Fix for quotes (tilde to quote)
             If bytASC=126 then bytASC=34
     
             '---- Add a random value from -80 to 80, encode\decode is decided by the seed's sign
             intRand = bytASC + ((Int(Rnd(1) * 160) - 80) * SGN(lngSeed)) 
     
             '---- Cycle char between 32 and 125 (with carry)
             If intRand <= 31 Then 
                 intRand = 125 - (31 - intRand)
             ElseIf intRand >= 126 Then
                 intRand = 32 + (intRand - 126)
             End If
     
             '---- Fix for quotes (quote to tilde)
             If intRand=34 then intRand=126
     
             '---- Output string
             Scramble = Scramble & Chr(intRand)
         Next
     End Function
     
     </SCRIPT>
     </HTML>

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    tout d'abord un grand merci à tous les participants de ce poste pour avoir donné leur avis, j'apprécie


    Paul TOTH :

    blowfish j'ai connu lorsque je fréquentais des salons irc crypté, j'ai déjà essayé par le passé, mais j'avais laissé tombé car ce que je cryptais / décryptais n'avais rien à voir avec ce qui apparaissait sur le salon

    (j'utilisais un compo à l'époque)

    j'ai réussi en utilisant une fonction se trouvant dans une dll (je me rappel plus ou je l'avais choppé) mais dans ce projet j'aimerais éviter les dll



    Ziginou :

    pourquoi utiliser 2 cryptages ? un premier avec une clé que j'aurais choisi et le second avec une clé aléatoire à chaque fois; donc là je crypt la chaine crypté

    je pense que si je passe par cette méthode j'aurais pas trop de mal à trouver l'équivalent en php

    le md5 n'est pas efficace dans mon projet car il faut que je puisse crypter et décrypter la chaine, or md5 ne sert qu'à crypter non ?



    Gilbert Geyer :

    dsl mais je n'ai pas compris ton idée avec les 2 constantes, j'ai vu que tu parlais de fichier .dat, et de fichier à crypter, mais en faite ce n'est qu'un texte que je dois crypter ...



    Paul TOTH :

    je pense que le cracker va chercher parmi les algo les plus utilisé (xor, blowfish, md5, ect)

    mais le problème c'est quoi finalement ? lui cacher la méthode utilisé ? ou faire en sorte qu'il ne trouve pas la clé de cryptage ? ou alors les 2 ?



    hackoofr : merci à toi pour tes précisions

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Coussati Voir le message
    mais le problème c'est quoi finalement ? lui cacher la méthode utilisé ? ou faire en sorte qu'il ne trouve pas la clé de cryptage ? ou alors les 2 ?
    les 2 c'est le plus efficace, comme je l'ai dit quand on connait l'algorithme il ne reste plus qu'à trouver la clé qui se trouve quelque part dans le programme...quand on n'a pas idée de l'encodage utilisé il faut en plus le déterminer.

    après tout dépend de l'important que tu accordes au cryptage, une autre méthode très simple est d'utiliser XOR et Random

    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
     
    procedure Crypt(var Data; Size: Integer; Seed: Cardinal);
    var
      p : PByte;
      i : Integer;
    begin
      RandSeed := Seed; // initialiser le générateur de nombres aléatoires
      p := @Data;
      for i := 0 to Size - 1 do
      begin
        p^ := p^ xor Random(255);
        Inc(p);
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      s: string;
    begin
      s := 'Hello World';
      Crypt(s[1], Length(s) * SizeOf(Char), 456);
      ShowMessage(s);
      Crypt(s[1], Length(s) * SizeOf(Char), 456);
      ShowMessage(s);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    bonjour,
    la toute 1ère question à se poser, c'est l'adéquation des moyens de chiffrement avec les besoins identifiés à savoir valeur du contenu à protéger et nature de la menace.
    autrement dit, la liste des cadeaux de noël ne sera pas protégée des regards du petit neveu de la même façon que les préparatifs d'un attentat à la bombe au cobalt de la curiosité de la NSA
    ça a l'air tout c*n mais on voit souvent des aberrations dans ce domaine et ce dans les deux sens
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    pourquoi utiliser 2 cryptages ? un premier avec une clé que j'aurais choisi et le second avec une clé aléatoire à chaque fois; donc là je crypt la chaine crypté

    je pense que si je passe par cette méthode j'aurais pas trop de mal à trouver l'équivalent en php
    Ca se tient... Ceci dit, ce n'est pas inviolable non plus car comme l'a dit un intervenant, le plus pratique est de casser le code en assembleur et de zapper le test... Comme on (pronom indéfini) l'a dit, à partir du moment où il y a du coca et de la volonté, tu peux mettre autant de cryptage différent, que ça ne déboutera pas quelqu'un de motivé

    le md5 n'est pas efficace dans mon projet car il faut que je puisse crypter et décrypter la chaine, or md5 ne sert qu'à crypter non ?
    Effectivement, md5 ne sert qu'à crypter... Ceci dit, pourquoi décrypter la chaîne ? Tu te sers de cette chaîne décryptée autrement que pour valider l'accès à l'application ? Dans l'affirmative, effectivement md5 ne te servira pas, par contre, dans la négative, md5 ne coûte pas cher et est très efficace...

    Th.

  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 263
    Points
    3 263
    Par défaut
    Bonjour,

    A Coussati :
    Gilbert Geyer : dsl mais je n'ai pas compris ton idée avec les 2 constantes, j'ai vu que tu parlais de fichier .dat, et de fichier à crypter, mais en faite ce n'est qu'un texte que je dois crypter ...
    J'ai parlé de sauver le fichier *.txt en lui collant une extension *.dat uniquement pour détourner l'attention du "casseur" vers des fichiers portant une extension attirant davantage son intérêt.

    Ensuite, pour mieux piger l'idée avec les 2 constantes, voici un bout de code qui n'utilise qu'une seule paire de constantes :
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    unit uCryptDecrypt;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Buttons, StdCtrls, ComCtrls;
     
    type
      TForm1 = class(TForm)
        bCrypter: TSpeedButton;
        bDecrypter: TSpeedButton;
        RichEdit1: TRichEdit;
        procedure bCrypterClick(Sender: TObject);
        procedure bDecrypterClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
     
    const  Crypt : 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:;<=>?' +     // ' ' -> é
                    '@NRIETUHDXKLMAOPQBSFGVWJYZC[\]^_'+       // '@ABCD... A -> N
                    '`nrietuhdxklmaopqbsfgvwjyzc{|}~'#127 +   // '`abcd... a -> n
                    '€'#129'‚ƒ„…†‡ˆ‰S‹Œ'#141'Ž'#143#144'‘’“”•–—˜™s›œ'#157'zY' +
                    #160'¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿'+
                    'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß'+
                    'àáâãäåæçè êëìíîïðñòóôõö÷øùúûüýþÿ';      // é -> ' '
     
     
    const  Decrypt : 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:;<=>?' +
                   '@MQZHDSTGCWJKLANOPBREFUVIXY[\]^_'+       // N -> A
                   '`mqzhdstgcwjklanopbrefuvixy{|}~'#127 +   // n -> a
                    '€'#129'‚ƒ„…†‡ˆ‰S‹Œ'#141'Ž'#143#144'‘’“”•–—˜™s›œ'#157'zY' +
                    #160'¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿'+
                    'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß'+
                    'àáâãäåæçè êëìíîïðñòóôõö÷øùúûüýþÿ';
     
    var      Texte, TxtCrypte, TxtDecrypte : string;
     
    function Crypt1(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^:=Crypt[p^];
              inc(p);
             end;
    end;
     
    function DeCrypt1(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^:=Decrypt[p^];
              inc(p);
             end;
    end;
     
     
    procedure TForm1.bCrypterClick(Sender: TObject);
    begin     texte:='Bonne et heureuse année : santé, pognon, et le reste...'+#13#10+'Ouille, on a encore tous veilli d''une année de plus !';
              RichEdit1.Lines.Add('TEXTE NON CRYPTE = '+texte);
              RichEdit1.Lines.Add('-------------------------------------');
              TxtCrypte:=Crypt1(Texte);
              RichEdit1.Lines.Add('TEXTE CRYPTE = '+TxtCrypte);
              RichEdit1.Lines.Add('-------------------------------------');
    end;
     
     
    procedure TForm1.bDecrypterClick(Sender: TObject);
    begin     TxtDecrypte:=DeCrypt1(TxtCrypte);
              RichEdit1.Lines.Add('TEXTE DECRYPTE = '+TxtDecrypte);
    end;
     
    end.
    Et voici un exemple de résultats :

    TEXTE NON CRYPTE = Bonne et heureuse année : santé, pognon, et le reste...
    Ouille, on a encore tous veilli d'une année de plus !
    -------------------------------------
    TEXTE CRYPTE = Rpootétgédtvstvfténoo té:éfnog ,éqphopo,étgémtéstfgt...
    Pvxmmt,époénétoipstégpvféwtxmmxée'voténoo téetéqmvfé!
    -------------------------------------
    TEXTE DECRYPTE = Bonne et heureuse année : santé, pognon, et le reste...
    Ouille, on a encore tous veilli d'une année de plus !
    Bien entendu, pour l'utiliser il faudra tout d'abord personnaliser les deux constantes en permutant l'ordre des caractères de la table différemment des miennes.

    Ensuite si tu veux compliquer davantage la vie au "casseur" tu peux t'inspirer des autres idées que j'ai suggérées (plusieurs paires de constantes, ... position de la Lune, etc) et qui sont faciles à coder.

    J'ajoute que s'il s'agit de crypter une correspondance avec un collègue il faudra que tous les deux vous disposiez du même *.exe pour le cryptage/décryptage.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  12. #12
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    une des difficultés qu'on peut opposer au décryptage éventuel est :
    - de ne pas crypter de la même manière des portions identiques (à condition que l'ensemble diffère ; crypter différemment le même texte est pê plus délicat...) ; on peut faire "rouler" la clef, par exemple
    - d'ajouter du sel : pourquoi pas un "header" qui "s'incrémente" au fur et à mesure du nombre d'échanges
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  13. #13
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    Paul TOTH : merci pour ton exemple, j'essaierai de l'analyser; et juste une question sans avoir testé le code, tu n'aurais pas oublier le type de la variable "data" dans le prototype de ta procédure ?


    omen999 : sans entrer dans un débat, quelques soit la manière d'encoder, il y aura toujours quelqu'un capable de contourner; mais bon dans mon projet, je cherche quelque chose de pas très difficile à mettre en place (pour pas me prendre la tête car justement mes données ne risque pas de changer le monde lol) mais efficace afin de ne pas permettre au premier venu de faire ce qu'il veut


    Ziginou : oui je sais, comme je l'explique plus haut, je doute d'une fiabilité à 100 % mais mon idée du double cryptage était de donner plus de fil à retorde, avec dans 2 types de clés à découvrir ^^ en ce qui concerne le md5 oublions car il me faudra décrypter ensuite :/


    Gilbert Geyer merci également pour ton code, je jetterai un oeil


    tourlourou : ce que tu dis est très important, j'ai déjà vu des mots de passe crypté de cette manière ! un "a" devient "u" en première position et "e" lorsqu'il est en dernière position par exemple ? bien qu'il suffit de faire jouer son imagination je ne met pas résolu encore dans le topic, pour permettre aux autres de donner leur point de vu s'ils le désirent

  14. #14
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Coussati Voir le message
    Paul TOTH : merci pour ton exemple, j'essaierai de l'analyser; et juste une question sans avoir testé le code, tu n'aurais pas oublier le type de la variable "data" dans le prototype de ta procédure ?
    non ! je te laisse chercher pourquoi
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  15. #15
    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
    Pourquoi se casser la tête à ce point ?
    autant utiliser CryptEncrypt fourni par Windows pour faire un AES, j'ai fait un petit test par curiosité dans le sujet AES via CryptAPI après avoir tente le MD5 de CryptAPI dans le sujet WebSocket HTML5 et Delphi

    En PHP, il y a l'équivalent mcrypt_decrypt

    Les deux s'utilisent a peu près de la même façon, définition du contexte, choix de l'algo, définition des clés et des buffers, encodage\décodage !
    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

  16. #16
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Pour ne pas générer le même texte chiffré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      S:= 'ttttt';
      s := Format('%s%s%0.4d',[RandomText , S,Length(RandomText));
      Crypt(S[1], Length(s) * SizeOf(Char), 456);
    .....
      Crypt(S[1], Length(s) * SizeOf(Char), 456);
      D:= StrtoInt(Copy(S,Lenth(S)-4,4));
      S:= Copy(S,D,Lenth(S)-4));

  17. #17
    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
    Il faut penser que si il y une clé variable, il faudrait soit que les algos de réception et d'émission utilisent la même !

    il existe les clés RSA SecurID qui utilisent un nombre pseudo aléatoire !
    C'est pour le cas, ou l'on doit avoir un mot de passe qui changent régulièrement !

    En HTTPS, par exemple, lors de la mise en place de la connexion sécurisée, il y a un échange de clé aléatoire entre le client et le serveur !

    Sinon la terminoligie,
    MD5 c'est pour un fonction de hachage, c'est sans retour !
    AES c'est du Chiffrement et donc déchiffrement.

    les termes de cryptage et décryptage sont équivalent de Chiffrement\déchiffrement, dans mon ancien taf, les 2 premiers étaient bannis !

    La solution de Gilbert Geyer, c'est une solution de chiffrement par substitution, des variantes connues comme le "Code César" ou Enigma !

    Dans une simple substitution de l'alphabet, une analyse statistique permet de retrouver les lettres les plus utilisées, si l'on connait la langue du texte, il est facile de retrouver le e pour le français et les autres lettres et de casser l'Alphabet utilisé pour la substitution !

    Sinon un XOR sur une clé assez grande couplé à une substitution compliquera le cassage !

    Enfin, une petit encodage en Base64 pour que le buffer échangé reste en mode texte, le XOR pouvant générer un binaire qui peut être pénible à envoyer en requête HTTP par exemple

    mcrypt_decrypt en AES_256, sera plus fiable, et surtout rien à coder ! ça existe déjà !
    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

  18. #18
    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 263
    Points
    3 263
    Par défaut
    Bonjour,

    A Paul Toth :
    procedure Crypt(var Data; Size: Integer; Seed: Cardinal);
    ... ... et pour Décrypter on fait comment ??? Car il faudrait qu'au moins le crypteur puisse décrypter.

    A+.

    EDIT : Oups, autant pour moi, je n'avais pas remarqué que la procédure Crypt servait à la fois pour crypter et pour décrypter !!!
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  19. #19
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    évidemment la fonction Random de PHP ne donnera pas le même résultat...mais tu peux définir ta propre fonction
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  20. #20
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Points : 82
    Points
    82
    Par défaut
    Tu peux utiliser ROT13/ROT47, c'est simple à mettre en place.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://delphi.xcjc.net/viewthread.php?tid=44121
    Beny

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/04/2012, 15h12
  2. Crypter / Décrypter chaine de caractère
    Par buxbux dans le forum Général Java
    Réponses: 2
    Dernier message: 30/10/2009, 16h09
  3. un simple xor pour crypter décrypter
    Par Montor dans le forum Contribuez
    Réponses: 0
    Dernier message: 24/09/2009, 17h40
  4. crypter/décrypter un URL
    Par mbounou dans le forum Langage
    Réponses: 3
    Dernier message: 23/07/2009, 16h53
  5. Réponses: 2
    Dernier message: 18/03/2009, 14h16

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