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 Delphi Discussion :

Crypter un fichier byte par byte


Sujet :

Langage Delphi

  1. #21
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Je viens de trouver une autre solution mais que je n'arrive pas à utiliser pour le moment. Apparemment l'unité IOUtils permettrait d'appeler l'API Windows Crypt.

    System.IOUtils.TFile.Encrypt

    J'ai essayé la chose suivante (avec XE2):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    program EncryptDecrypt;
     
    {$APPTYPE CONSOLE}
     
    uses
      IOUtils;
     
    begin
      TFile.Encrypt('fichier.txt');
    end.
    D'abord j'ai eu une exception "opération non prise en charge". J'ai exécuté mon programme en tant qu'administrateur (ce qui est assez fastidieux mais bon) : là j'ai un message d'erreur de Windows "EncryptDecrypt.exe a cessé de fonctionner". Si quelqu'un pouvait m'indiquer la solution...
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #22
    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,

    Roland Chastain: Apparemment l'unité IOUtils permettrait d'appeler l'API Windows Crypt. ... (avec XE2)
    Désolé sous Delphi 6 cette unité n'existe pas :

    [Erreur fatale] uCryptDecrypt.pas(13): Fichier non trouvé : 'IOUtils.dcu'
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #23
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    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 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans la définition Delphi de la classe TFile, il n'y a pas de class function Encrypt !

    A noter sa présence dans le code c++ de la même page : oubli, souci ?
    Delphi 5 Pro - Delphi 10.4 Rio 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 !

  4. #24
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Effectivement. Bien vu, Yves ! Cependant le code se compile.

    Autrement j'ai retravaillé mon petit programme. Il fonctionne correctement, sauf lorsque je l'ai essayé avec un fichier contenant des accents et encodé en UTF8.
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #25
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    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 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Que se passe-t-il en transformant les chemins avec ShortPathName (si je n'écorche pas son nom...) ?
    Delphi 5 Pro - Delphi 10.4 Rio 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 !

  6. #26
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Que se passe-t-il en transformant les chemins avec ShortPathName (si je n'écorche pas son nom...) ?
    Bonne idée. Je ne connaissais pas cette fonction. Mais non, ça ne fonctionne toujours pas.

    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
    program EncryptDecrypt;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses
      System.SysUtils, System.IOUtils;
     
    const
      F = 'C:\Users\Roland\Documents\RAD Studio\Fichiers\IOUtils\fichier.txt';
     
    begin
      WriteLn(FileExists(F));
      WriteLn(ExtractShortPathName(F));
      WriteLn(FileExists(ExtractShortPathName(F)));
      {
      TRUE
      C:\Users\Roland\DOCUME~1\RADSTU~1\Fichiers\IOUtils\fichier.txt
      TRUE
      }
     
      TFile.Encrypt(ExtractShortPathName(F));
     
      ReadLn;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  7. #27
    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,

    Remarque à propos de mon message du 30/08/2014, 11h47

    Ayant modifié mon code d'utilisation comme suit sur la copie d'écran où au lieu d'afficher le crypté dans le RichEdit je l'envoie sur disque, en plaçant des ShowMessage
    entre les lignes, puis utilisé avec la clef CleVer64 := 'abcdefgh',
    j'ai pu constater que tout se passe bien y compris l'affichage du ShowMessage('ici 3 '+NomFi) mais ensuite il se déclenche une V.A. entre ce ShowMessage et le suivant comme si la ligne Tp2.Position := 0
    en était la cause : bizarre. Autre bizarrerie ici j'ai une V.A. alors que le 30/08 c'était un débordement de pile !!!???.
    Donc il semble que CrypteEtCopy n'en soit pas la cause mais cette bizarrerie incompréhensible qui se produit chez moi.

    Ce serait sympa que quelqu'un d'autre teste le bon fonctionnement du code de Rekin85 vu les performances annoncées.

    A+.
    Images attachées Images attachées  
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  8. #28
    Membre actif

    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2009
    Messages : 128
    Points : 203
    Points
    203
    Par défaut Pour Gilbert
    Salut Gilbert

    Je pense qu'avec ce bout de code, tu fais une opération invalide sur des pointeurs. Tu appelles la routine de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CrypteEtCopy(BufMess, Tp2, CleVer64, BufMess.Size);
    Or, elle attend des pointer sur le premier octet de chacun des TMemoryStream :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CrypteEtCopy(BufMess.Memory, Tp2.Memory, CleVer64, BufMess.Size);

  9. #29
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 930
    Points : 1 959
    Points
    1 959
    Par défaut
    Citation Envoyé par Rekin85 Voir le message
    Je pense qu'avec ce bout de code, tu fais une opération invalide sur des pointeurs. Tu appelles la routine de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CrypteEtCopy(BufMess, Tp2, CleVer64, BufMess.Size);
    Or, elle attend des pointer sur le premier octet de chacun des TMemoryStream :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CrypteEtCopy(BufMess.Memory, Tp2.Memory, CleVer64, BufMess.Size);

    Exact, je me suis permis de faire le test et cela fonctionne très bien !

  10. #30
    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,

    Mille fois merci à Rekin85 et à Free07 : je viens également de tester ainsi et ça fonctionne à merveille.

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

  11. #31
    Membre actif

    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2009
    Messages : 128
    Points : 203
    Points
    203
    Par défaut
    Merci les amis pour vos essais-tests. Cela tourne impeccable...

    Cette petite discussion sur les cryptages tombe à pic avec l'actualité : des grosses vedettes américaines se sont fait pirater des photos affriolantes sur le icloud...

  12. #32
    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 à tous et salut René,

    Rekin85 : Cette petite discussion sur les cryptages tombe à pic avec l'actualité : des grosses vedettes américaines se sont fait pirater des photos affriolantes sur le icloud...
    Méfiance avec les Cloud's : rien ne les empêche, même les Cloud's qui disent "crypter les données hébergées" avec leur algo de cryptage d'y introduire quelques lignes de code pour capturer la clef de dé-cryptage.

    J'ai fait quelques tests de vitesse ce matin, vu que tu avais écrit :
    CrypteEtCopy ... Cette routine va donc "à la vitesse de la lumière"
    Résultats pour le cryptage d'une grosse image de 43,9 Mo :
    - par Substitution : mis 78 millisecondes,
    - avec Vigenère : mis 141 millisecondes,
    - avec CrypteEtCopy : mis 47 millisecondes (3 fois plus rapide que Vigenère)

    A+.

    EDIT : Rectification : j'ai écrit ci-dessus que ce fichier-image fait 43,9 Mo (c'est ce que m'a affiché PaintShopPro utilisé pour vérifier le bon dé-cryptage !!!???) alors que Windows m'affiche 30001 Ko c'est à dire 29,297 Mo et vérification faite avec BufMess.Size c'est bien un fichier de 29,297 Mo.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  13. #33
    Membre actif

    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2009
    Messages : 128
    Points : 203
    Points
    203
    Par défaut
    Est-il nécessaire de copier le fichier pour pouvoir le crypter ? N'est-il pas utile d'avoir une routine qui crypte directement le tampon mémoire dans lequel se trouve le fichier ? Si bien sûr... Voilà donc la routine correspondante :
    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
    // Crypte un Tampon par un double Vernam avec Clé de 64 bits
    procedure CrypteV64(Tp: pointer; Key: String; Size: longWord); register;
    var Al1,Al2 : longInt;
        procedure Alea;
        asm
            xor     eax,eax
            dec     eax
            imul    edx,Al1,$08088405
            inc     edx
            mov     Al1,edx
            mul     edx
            mov     ebx,edx
            xor     eax,eax
            dec     eax
            imul    edx,Al2,$08088405
            inc     edx
            mov     Al2,edx
            mul     edx
            mov     eax,edx
         end;
    asm
        push     ebx
        push     esi
        mov      esi,eax
        mov      eax,Dword ptr[edx]
        mov      Al1,eax
        mov      eax,Dword ptr[edx+4]
        mov      Al2,eax
        push     ecx
        shr      ecx,$3
        jz       @Reste
        @XorQWords:
              call   Alea
              xor    DWord ptr[esi],ebx
              add    esi,$4
              xor    DWord ptr[esi],eax
              add    esi,$4
              loop   @XorQWords
        @Reste:
        pop      ecx
        and      ecx,$7
        jz       @Fin
        call     Alea
        @XorBytes:
              xor    Byte ptr[esi],al
              inc    esi
              mov    al,bl
              shr    ebx,$8
              ror    eax,$8
              loop   @XorBytes
        @Fin:
        pop      esi
        pop      ebx
    end;
    Pour bien l'utiliser, il convient de :
    1/ Charger le fichier à crypter dans un TMemorySteram
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonStream:=MemoryStream.Create;
    MonStream.LoadFromFile(MonFic);
    2/ Créer une clé alphanumérique d'au moins 8 caractères et crypter le Stream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaCle:='cleZZX12';
    CrypteV64(MonStream.Memory,MaCle,MonStream.Size);
    3/ Sauver le fichier crypté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonStream.Savetofile(MonFicCrypté);
    MonStream.free;
    Pour décrypter, on fait les mêmes opérations sur le fichier crypté en fournissant la même clé exactement.

  14. #34
    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,

    Rekin85: Est-il nécessaire de copier le fichier pour pouvoir le crypter ? N'est-il pas utile d'avoir une routine qui crypte directement le tampon mémoire dans lequel se trouve le fichier ? Si bien sûr... Voilà donc la routine correspondante :
    Génial car non seulement ça permet de crypter des fichiers deux fois plus gros mais en plus, testé, c'est 1,5 fois plus rapide !!!

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

  15. #35
    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,

    Résultats de tests comparatifs de vitesse pour le cryptage d'un fichier-image 50 Mo (BitMap de 5120x2560x16MillionsDeCouleurs) :
    - avec Vigenère : mis 203 millisecondes,
    - par Substitution : mis 109 millisecondes,
    - avec le XOR simple de Paul Toth cité au début : mis 46 millisecondes
    - avec CrypteV64 de Rekin85 : mis 31 millisecondes.

    Et 31 ms pour 50 Mo ça donne une vitesse de cryptage de 50*1000/(31*1024) = 1,575 Go/seconde : ça décoiffe.
    A cette vitesse on peut facilement crypter en rafale dans une boucle le contenu d'un dossier voire d'un disque entier !!!

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

  16. #36
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Bonjour Gilbert !

    Petite parenthèse : pour le chiffrement par substitution, je me suis demandé s'il s'agissait du programme que j'avais posté ou d'un autre, car j'étais étonné qu'on puisse s'en servir pour traiter des bitmaps (et non pas seulement des fichiers-texte). Dans le doute, j'ai fait l'essai et j'ai constaté que ça fonctionnait. Un fichier bitmap peut donc être lu dans une chaîne de caractères ? Je tombe des nues.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  17. #37
    Membre actif

    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2009
    Messages : 128
    Points : 203
    Points
    203
    Par défaut
    Quelques précisions pour les puristes. Comme en cryptage, il faut rendre à César ce qui appartient à César, la routine proposée par Paul Toth est la base du cryptage XOR avec des pseudo aléatoires.

    Donc, dans la routine CrypteV64, l'idée de base est exactement la même avec les particularités suivantes :
    Le générateur de pseudo aléatoires n'est pas celui de Delphi mais est double et en interne (donc pas d'interférence possible) et au lieu d'effectuer le xor byte à byte, elle fait l'opération sur 2x32 bits en QWords. C'est un petit poil plus rapide avec une redondance des générateurs très très longue.

    Le gros inconvénient de la méthode byte à byte est que la "graine" du générateur est forcément un byte donc 256 possibilités maximum de clés : en brute force il ne faut pas longtemps pour "casser". En 64 bits (8 bytes), c'est déjà une autre affaire...

  18. #38
    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,

    Roland Chastain : Petite parenthèse : pour le chiffrement par substitution, je me suis demandé s'il s'agissait du programme que j'avais posté ou d'un autre, car j'étais étonné qu'on puisse s'en servir pour traiter des bitmaps (et non pas seulement des fichiers-texte).
    Ce n'était pas le programme posté mais une variante perso dans laquelle le truc à crypter est chargé dans un TMemoryStream.

    Dans le doute, j'ai fait l'essai et j'ai constaté que ça fonctionnait. Un fichier bitmap peut donc être lu dans une chaîne de caractères ? Je tombe des nues.
    Bin c'est pas trop étonnant vu qu'une image c'est des bytes et du texte c'est aussi des bytes.

    Rekin85: Le gros inconvénient de la méthode byte à byte est que la "graine" du générateur est forcément un byte donc 256 possibilités maximum de clés : en brute force il ne faut pas longtemps pour "casser".
    Là il y a un truc qui me chagrine : J'étais persuadé qu'avec le XOR de Paul Toth et une Clef de 26 caractères on a 26^26 = 6 156 119 580 207 157 310 796 674 288 400 203 776 clefs possibles. Oui/Non ???

    A+.

    EDIT : Erreur ce n'est pas le XOR de Paul de Toth qui permet d'utiliser des clefs de N caractères mais le XOR de Rekin85 ( CryDecryptXOR) cité plus loin.
    A noter de plus qu'avec une Clef de 26 caractères on a 26^26 clefs possibles si on se contente de la former à partir de l'alphabet en majuscules ou minuscules non accentuées,
    mais comme on peut utiliser la quasi-totalité des caractères de la table le nombre de clefs possibles tend vers 26^256 = 171071270401117046474021258979311754959578850909434192734281218208041739279454906850302786111764310960364752841610433302089048925884603868468216639694025869503513956291020854554677358942886865467099565322891877906437779229289260234700208260350455533044530945505480506398028859212262679220313892936616222926189193913651301818362385516908978469107259185390237515776
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  19. #39
    Membre actif

    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2009
    Messages : 128
    Points : 203
    Points
    203
    Par défaut
    Salut Gilbert,
    Nous ne sommes peut-être pas sur la même longueur d'onde. Moi je parlais de la méthode Paul Toth suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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;
    Le paramètre Seed passé en graine pour RandSeed de Delphi est bien un 32 bits, le cryptage qui suit se fait sur une valeur d'un byte. Mais comme le générateur est calé sur 32 bits, j'ai fait une erreur en disant que la clé n'avait que 256 valeurs possibles...
    Ou alors, on ne parle pas de la même méthode ?

  20. #40
    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,

    Citation Envoyé par Rekin85
    : Ou alors, on ne parle pas de la même méthode ?
    Oups, autant pour moi, vérification faite le XOR que j'ai en fait utilisé lors des tests comparatifs de vitesse d'hier était celui-ci, et comme c'est de l'ASM il vient de toi, et on peut l'utiliser avec une clef de longueur variable dont la clef de 26 caractères que j'évoquais tout à l'heure : (donc ce n'est pas celui de Paul Thoth)

    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
    procedure CryDecryptXOR(var Data: tMemoryStream; const Clef: tMemoryStream);
    var LData, LClef: longInt; AdrData, AdrClef: pointer;
    begin
      LData := Data.Size; LClef := Clef.Size and $FFFFFFFC; // mult de 4
      AdrData := Data.Memory; AdrClef := Clef.Memory;
      asm
           push   ebx             // ebx conteneur des DWords Clef
           push   esi
           mov    esi,AdrData     // esi pointe Data
           push   edi
           mov    edi,AdrClef     // edi pointe la clef
           xor    edx,edx         // edx compteur des Dwords clef
           @DWords: // traitement des Dwords
           mov    ecx,lData
           shr    ecx,$2          // Nombre de DWords entiers
           jz     @Bytes
           @RConvDWords:          // boucle de xorisation des DWords
                  cmp   edx,LClef
                  jne   @SRW
                  xor   edx,edx
                  @SRW:
                  mov   eax,DWord ptr[esi]
                  mov   ebx,DWord ptr[edi]+edx
                  xor   eax,ebx
                  mov   Dword ptr[esi],eax
                  add   esi,$4
                  add   edx,$4
           loop   @RConvDWords
           @Bytes: // traitement des bytes restants en Data
           mov    ecx,LData
           and    ecx,$3        // LData mod 4
           jz     @fin
           @RConvBytes:         // boucle de xorisation des bytes restants
                  cmp  edx,LClef
                  jne  @SRB
                  xor  edx,edx
                  @SRB:
                  mov  al,Byte ptr[esi]
                  mov  bl,Byte ptr[edi]+edx
                  xor  al,bl
                  mov  Byte ptr[esi],al
                  inc  esi
                  inc  edx
           loop   @RConvBytes
           @fin:
           pop    edi
           pop    esi
           pop    ebx
      end;
    end;
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

Discussions similaires

  1. Crypter un fichier byte à byte : Epilogue 2
    Par Rekin85 dans le forum Contribuez
    Réponses: 11
    Dernier message: 30/10/2014, 14h41
  2. Lire byte par byte avec QHttp
    Par looclooc dans le forum Débuter
    Réponses: 1
    Dernier message: 04/08/2009, 09h17
  3. Fichier image to Byte[]
    Par Mengué georges dans le forum Langage
    Réponses: 2
    Dernier message: 10/06/2009, 21h43
  4. Lecture fichier, retour en byte[]
    Par ArnaudDev dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 20/04/2009, 17h14
  5. [VB.NET] Fichier text et byte()
    Par nmerydem dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/11/2004, 18h28

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