begin process at 2010 02 10 09:48:24
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Sécurité

 > DÉCRYPTER LES FICHIERS IMAGE JPG (VOUS AVEZ ÉGARÉ LA CLÉ)

DÉCRYPTER LES FICHIERS IMAGE JPG (VOUS AVEZ ÉGARÉ LA CLÉ)


 Information sur la source

Note :
8,11 / 10 - par 9 personnes
8,11 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Sécurité Classé sous :cryptage, xor, fichier, écriture, lecture Niveau :Débutant Date de création :23/10/2003 Date de mise à jour :22/08/2006 21:37:45 Vu :27 119

Auteur : japee

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note


 Description

Certains fichiers jpg cryptés nécessitent une clé pour être visionnés. L'algorythme de cryptage est basé sur l'utilisation de Xor. Il est très facile de le trouver...

J'ai adapté ce code en Delphi à partir d'une source en VB parue en février 2002 dans l'excellent magazine "Pirates Mag" (n° 10), dans le cadre d'un article traitant précisément du décryptage de ces JPG.

Donc, si vous avez égaré la clé de décryptage que vous aviez payée la peau des fesses, tout n'est pas perdu...
Vous pourrez à nouveau visionner ces images de rêve représentant des paysages sublimes, les fonds marins, la faune et la flore de notre planète, etc... ;)

Le code qui suit lit et écrit byte par byte directement dans les fichiers. Il n'est donc pas des plus rapides, et je travaille sur une version utilisant TFileSteam.
J'en avais fait un programme avec progression, temps restant estimé, tout ça, mais il faut que je le reprenne.

Je joindrai bientôt un zip pour la mise en oeuvre, je n'ai pas le temps pour l'instant.

A suivre, donc...

ATTENTION : si vous utilisez la première méthode (sans passer par TFileStream), et que vous travaillez à partir de fichiers en lecture seule (ReadOnly), n'oubliez pas de passer par une procédure qui enlève cette propriété. Voir en Annexe ci-dessous (mise à jour: 06/11/03, code précédent faux).

Pour la mise en application, voir ici :

http://www.delphifr.com/code.aspx?ID=17510

Source

  • { Byte par byte }
  • procedure DecodeFile(const FromFileName, ToFileName: string);
  • var
  • FCod, FDeCod: file of Byte;
  • Tmp, Key: Byte;
  • begin
  • AssignFile(FCod, FromFileName);
  • try
  • Reset(FCod);
  • Read(FCod, Tmp);
  • Key := Tmp xor 255; // calcul de la clé de cryptage
  • Seek(FCod, 0);
  • AssignFile(FDeCod, ToFileName);
  • try
  • ReWrite(FDeCod);
  • while not EOF(FCod) do
  • begin
  • Read(FCod, Tmp);
  • Tmp := Tmp xor Key;
  • Write(FDeCod, Tmp);
  • end;
  • finally
  • CloseFile(FDeCod);
  • end;
  • finally
  • CloseFile(FCod);
  • end;
  • end;
  • { Avec TFileSteam }
  • procedure DecodeFileStream(const FromFileName, ToFileName: string);
  • var
  • FSCod, FSDeCod: TFileStream;
  • Tmp, Key: Byte;
  • i: Integer;
  • begin
  • FSCod := TFileStream.Create(FromFileName, fmOpenRead);
  • try
  • FSCod.Read(Key, 1);
  • Key := Key xor 255; // calcul de la clé de cryptage
  • FSCod.Seek(0, 0);
  • FSDeCod := TFileStream.Create(ToFileName, fmCreate);
  • try
  • for i := 0 to FSCod.Size - 1 do
  • begin
  • FSCod.Read(Tmp, 1);
  • Tmp := Tmp xor Key;
  • FSDeCod.Write(Tmp, 1);
  • end;
  • finally
  • FSDeCod.Free;
  • end;
  • finally
  • FSCod.Free;
  • end;
  • end;
  • {
  • Supprimer la propriété ReadOnly d'un fichier
  • (mise à jour: 06/11/03, code précédent faux)
  • }
  • var Attribut: Integer;
  • FichierEnco_D: String; // le fichier à lire
  • begin
  • Attribut := FileGetAttr(FichierEnco_D); // récupère attributs
  • if Attribut and faReadOnly <> 0 then // si lecture seule...
  • FileSetAttr(FichierEnco_D, Attribut and not faReadOnly); // ...supprime ReadOnly
  • end;
{ Byte par byte }

procedure DecodeFile(const FromFileName, ToFileName: string);
var
  FCod, FDeCod: file of Byte;
  Tmp, Key: Byte;
begin
  AssignFile(FCod, FromFileName);
  try
    Reset(FCod);
    Read(FCod, Tmp);
    Key := Tmp xor 255;  // calcul de la clé de cryptage
    Seek(FCod, 0);
    AssignFile(FDeCod, ToFileName);
    try
      ReWrite(FDeCod);
      while not EOF(FCod) do
      begin
        Read(FCod, Tmp);
        Tmp := Tmp xor Key;
        Write(FDeCod, Tmp);
      end;
    finally
      CloseFile(FDeCod);
    end;
  finally
    CloseFile(FCod);
  end;
end;

{ Avec TFileSteam }

procedure DecodeFileStream(const FromFileName, ToFileName: string);
var
  FSCod, FSDeCod: TFileStream;
  Tmp, Key: Byte;
  i: Integer;
begin
  FSCod := TFileStream.Create(FromFileName, fmOpenRead);
  try
    FSCod.Read(Key, 1);
    Key := Key xor 255;   // calcul de la clé de cryptage
    FSCod.Seek(0, 0);
    FSDeCod := TFileStream.Create(ToFileName, fmCreate);
    try
      for i := 0 to FSCod.Size - 1 do
      begin
        FSCod.Read(Tmp, 1);
        Tmp := Tmp xor Key;
        FSDeCod.Write(Tmp, 1);
      end;
    finally
      FSDeCod.Free;
    end;
  finally
    FSCod.Free;
  end;
end;


{
Supprimer la propriété ReadOnly d'un fichier 
(mise à jour: 06/11/03, code précédent faux)
}

var Attribut: Integer;
    FichierEnco_D: String; // le fichier à lire
begin
  Attribut := FileGetAttr(FichierEnco_D);  // récupère attributs
  if Attribut and faReadOnly <> 0 then   // si lecture seule...
    FileSetAttr(FichierEnco_D, Attribut and not faReadOnly); // ...supprime ReadOnly
end;


 Conclusion

Voila, j'ai balancé tout ça un peu vite, en réponse à une question du forum.
J'espère qu'il n'y a pas trop de bêtises, sinon, n'hésitez pas... hein ?


 Historique

22 août 2006 21:37:45 :
Le code précédent était vraiment trop laid. Les blocs try finally sont enfin à leur place...

 Sources du même auteur

Source avec Zip Source avec une capture DEPLACER LES ITEMS D'UNE LISTBOX VERS UNE AUTRE PAR DRAG AND...
Source avec Zip Source avec une capture DÉMINEUR UTILISANT UNE TDRAWGRID ET AVEC LEQUEL ON PEUT TRIC...
Source avec Zip Source avec une capture SIGNIFICATION DES CODES D'ERREUR DE L'API WIN32 - UTILISATIO...
Source avec Zip Source avec une capture CONVERSION LITTÉRALE D'UN NOMBRE ENTIER OU FLOTTANT
Source avec Zip Source avec une capture TPULSEBUTTON - RÉPÉTITION PROGRESSIVE D'UN EVENT PENDANT ONK...

 Sources de la même categorie

Source avec Zip Source avec une capture GOLDEN PASSWORDS - STOCKEZ VOS MOTS DE PASSE ! par Bacterius
Source avec Zip Source avec une capture LEA EN MODE CHIFFREMENT (SEA) par Bacterius
Source avec Zip Source avec une capture DELPHI : SHA-1 EN MODE CHIFFREMENT (SHACAL) par FENETRES
Source avec Zip SECUSB ; LOGICIEL D'EFFACEMENT SÉCURISÉ POUR CLEF USB par ludodelphi
Source avec Zip PROTECTION COPIE CD, OU PROGRAMME SUR DONGLE USB par Huugooo

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture GOLDEN PASSWORDS - STOCKEZ VOS MOTS DE PASSE ! par Bacterius
Source avec Zip Source avec une capture SOUNDCRYPT par craftsystem
Source avec Zip Source avec une capture CRYPTEUR / DÉCRYPTEUR DE FICHIERS par Romano58
Source avec Zip Source avec une capture CRYPTAGE (SIMPLE) AVEC CLE ALEATOIRE ET INTEGRE par elguevel
Source avec Zip Source avec une capture LECTURE/ÉCRITURE FICHIER SÉQUENTIEL par luc lacroix

Commentaires et avis

Commentaire de Delphiprog le 24/10/2003 00:06:54 administrateur CS

Alors comme çà, la protection est limitée à une simple opération logique XOR ?
Trouve nous vite une solution pour accélérer le décodage.
Je suis sur que ça va en intéresser plus d'un !

NB : le positionnement des mots réservés Try et  Finally ne me semble pas judicieux et approprié. Deux instructions try qui se suivent l'une derrière l'autre...ne peuvent que se ressembler.
Dans le cas présent, si un erreur se produit en voulant lire le premier fichier, tu essaies de fermer les deux alors que le deuxième n'est pas encore assigné. Gag !
Cette remarque vaut aussi bien pour la procédure Decrypte que DecodeFichier.

Et puis, si c'est si long, pourquoi ne pas mettre tout celà dans un thread séparé ?
Bon courage Japee, le plus dur est déjà fait. ;o)

Commentaire de japee le 24/10/2003 00:36:50 administrateur CS

Oui, Delphiprog, je suis sur que ça va en intéresser plus d'un(e) ;)

Le positionnement de mes blocs try..except et try..finally me semblait logique... il faut que j'étudie ça à tête reposée.

Le thread, c'est prévu, et pourquoi pas plusieurs threads qui se partageraient le travail (ouh la la, la complication... :( )

J'avais déjà fait un programme tout à fait fonctionnel, mais le code me fait un peu honte, maintenant. Je crois que je vais m'y remettre, c'est un bon exercice de programmation.

Merci pour tes conseils et encouragements Delphiprog :)

Commentaire de kimmelf2 le 24/10/2003 23:51:30

et puis une petite option toute simple mais ca fais toujours un + : l'application du decryptage a plusieurs images, voire a tout un dossier ...

:-D

Commentaire de japee le 25/10/2003 00:14:20 administrateur CS

Que tu es impatient, kimmelf2 !

Mets donc un OpenDialog avec la propriété multiselect, en attendant...
Ou une recherche récursive de tous les fichiers comportant l'extension .jpg se trouvant dans un répertoire sélectionné.

Sinon, patiente, comme dit plus haut, j'y reviendrai, mais j'ai pas trop le temps...

Ah, quand les hormones nous travaillent... mdr :)

Commentaire de kimmelf2 le 27/10/2003 03:04:56

bah pas speciallement, c'etais + un conseil, car c'est un pgm pour decrypter des images jpg, lesquelles sont generallement fournies par paquets. alors si il faut lancer le pgm pour chaque image, on s'en sort pas donc le pgm n'est pas completement adapte au "probleme" de base, donc des points en moin ! :-D

Franchement, je te dis qd meme bravo car moi je suis qu'un ultra-mini-debutant en delphi, et j'aurais pas reussi a faire juste la fonction de base du decodage alors ...

Commentaire de japee le 27/10/2003 03:36:29 administrateur CS

Je constate que tu es un couche-tard, kimmelf2 !

Attention, comme disait ma grand-mère, jeunesse qui veille et vieillesse qui dort sont tous deux près de la mort ;)
C'est comme ça que j'ai décidé de ne plus dormir ! ptdrrrrr :))))))))

Ce bout de code, j'essayais de te l'expliquer, est destiné à être mis dans une boucle qui va s'occuper des fichiers à décrypter, de manière automatique.

Merci pour ton "bravo", j'en conclus que ça fonctionne, hein ? (manquerait plus que ça marche pas...)

Ultra-mini-débutant deviendra grand, t'en fais pas !

Bonne prog', faut pas mollir !!!!

Commentaire de lenine le 27/10/2003 10:11:30

Je suis débutant dans la prog aussi, j'ai couplé ton code avec un autre code présant sur le site qui recherchait des fichiers sur le disque dur, et ton programme a quasiment tout décrypté, j'en reviens pas! c'est fantastique, on a souvent des jpg livrés sur des cds qu'on achète avec des magasines .
Bravo encore!

Commentaire de japee le 27/10/2003 16:45:16 administrateur CS

Bravo, lenine! Exactement ce qu'il fallait faire en attendant que j'aie pondu un exécutable mettant ce code en oeuvre... pffff, j'arrive pas à me motiver, mais ça va me prendre d'un coup, c'est sûr.

Quand je vous dit que ça marche, hein ?

Surtout en utilisant la procedure avec TFileStream, qui élimine les problèmes de fichier en lecture seule copiés sur le disque dur (j'ai jamais trop bien compris pourquoi ça posait problème...)

Commentaire de kimmelf2 le 27/10/2003 23:08:27

japee&gt;
ben si tu coche "lecture seule", c'est que tu veux pas que le fichier soit modifie, donc windows et les IDEs, dans leurs extreme generosite, bloque l'acces a ce type de fichier lorsqu'il y a un risque d'ecriture.

par ex, en C, les 3 lignes suivantes (et derivees) ne sont pas autorisees a acceder a un fic en lecture seule car le mode d'acces laisse suppose que le prog peu avoir besoin d'ecrire dans le fichier:
f = fopen("nom_du_fichier.ext" , "rw")
f = fopen("nom_du_fichier.ext" , "w")
f = fopen("nom_du_fichier.ext" , "a")

alors que la ligne suivante est acceptee car "r" signifie un acces au fichier en n'ayant besoin que de la lecture donc ca ne pose pas de probleme ....
f = fopen("nom_du_fichier.ext" , "r")



japee&gt;
Ben le bravo, c'est + pour le fait que tu ai adapte le pgm original que pour son exec car .... j'ai plus delphi (formattage en prevision, donc nettoyage pour mieux retrouver ce que je doit graver avant de "debugguer" windows (ben oui, qd windows bug, pour corriger, on format non ???)) donc j'ai pas pu essayer !  mais je me ralie au autre posteurs : si ils disent que ca marche, c'est que ca marche ...

j'adore les operations logiques moi ... :-D :-D :-D

Commentaire de japee le 28/10/2003 17:42:41 administrateur CS

Merci pour tes explications, kimmelf, les problèmes d'accès aux fichiers sous Windows sont effectivement communs à tous les langages, et je n'ai en principe pas de difficulté à en comprendre la logique ;)
Ce qui est difficilement compréhensible, c'est qu'un fichier en lecture seule est (apparemment ?) impossible à lire (j'ai bien dit à lire), du moins byte par byte, s'il est situé sur le disque dur ???
C'est du moins le cas ici en lisant le fichier (byte par byte), en modifiant ce byte, et en copiant le byte obtenu dans un fichier cible.
Alors que cela ne pose pas de problème (et là on retrouve la logique) s'il est lu à partir d'un support CD-Rom...
Mais bon, le problème ne se pose plus si l'on utilise TFileStream (conseillé !), alors... (d'autant plus que c'est 2 fois plus rapide).
Bon courage avec ta réinstallation, paraît que XP plante moins, mais on aime ou pas... et puis c'est dur de suivre l'évolution, on n'a pas forcément les moyens financiers de changer de système d'exploitation tous les 2 ans !
Il faudrait avoir le courage de migrer vers Linux ! ;)
Enfin, en réinstallant Win98 SE tous les ans, j'arrive à ne pas trop galérer :(
Bon courage, à + (et reviens vite à Delphi !) ;)

Commentaire de kimmelf2 le 29/10/2003 01:00:32

nan je vais plutot installer palladium !

NAANNNNNN PAS TAPER !!!!!!!!

j'rigole

je me tate entre un bon vieux 2000 et XP. perso j'aime pas le nouveau style de XP. parais qu'on peux choisir d'avoir un style d'interface classique, mais j'estime que 2 interfaces dont 1 que j'aime pas = gaspillage de place sur le DD

et puis en plus simple, j'ai pas les moyens de payer un XP pour l'essayer et voire si j'aime

Commentaire de jbanety le 30/10/2003 08:23:29


ça me rappelle quand j'avais trouvé une source pour décoder la clé de cryptage des cd DCOD, les petit cd's de cul pour les cochons :)

Enfin bon j'ai essayé et excellent boulot !

Commentaire de darkstorm le 02/11/2003 00:33:22

Salut,

En gros si j'ai bien compris, leur cryptage bidon qu'on inverse le premier byte du fichier (ben oui si on xor 255 c'est équivalent à un not()), ce qui nous donne la clé, ensuite on l'utilise pour décrypter le reste du fichier... mais est-ce que la clé est utilisée pour décrypter le 1er byte ou on le laisse tel quel?

Commentaire de japee le 03/11/2003 15:16:01 administrateur CS

Oui, darkstorm, on se sert du premier byte pour déterminer la clé, car on sait que le premier byte d'un fichier jpg "normal" (non crypté) est "FF" (facile à voir avec un éditeur hexadécimal), et 5A pour un fichier crypté.
On peut supposer que l'opérateur logique xor est utilisé, coup de bol, c'est le cas !
En partant du principe que ByteCodé xor ByteDécodé = Clé, et que ByteCodé xor Clé = ByteDécodé, reste plus qu'à appliquer...
Comme ils se sont pas foulés, en calculant la clé sur le premier octet et en l'appliquant à tous les bytes du fichier (y compris le premier bien sûr), on obtient le fichier décrypté.
On pourrait se dispenser de chercher la clé à chaque fois, car il semblerait que ce soit toujours la même, donc ça ferait gagner un peu de temps...
Bon, mais s'il leur venait à l'idée de changer la clé, hein ?
Ou alors ne calculer qu'une seule fois, sur un fichier, en partant du principe que la même clé sera utilisée pour toute la série d'image cryptées...
Tout est envisageable, il ne s'agit ici que du principe, à chacun de voir pour améliorer la rapidité, il semble qu'il y ait des possibilités ! ;)

Commentaire de darkstorm le 03/11/2003 23:59:27

Merci de la précision, en gros un xor avec une clé de 1 caractère ils se sont pas trop foulés mais d'un côté il faut déjà avoir l'idée de comparer le fichier avec un modèle et de tomber sur la SEULE fonction symétrique :-), bravo à toi et bon travail !

Vito

Commentaire de deep69 le 16/05/2004 13:48:47

Salut,

yep excelent avec filestream,hélas j'ai le PCMag n°147 et

l'image ne ce decrypte pas :-(

voici les 4 premiers octets que j'obtient ÿåóö au lieu de ÿØÿà





Commentaire de kimmelf2 le 16/05/2004 22:54:16

ca n'aurais pas ete plus simple de donner les codes hexa ???? :-)

Commentaire de Fulminex le 11/08/2005 02:43:54

J'ai écrit ce code en Turbo Pacal à l'époque... Si ton code est lent, c'est parce-qu'il lit octet par octet... Une lecture par bloc et un traitement séparé du bloc en mémoire, ça accélère "achment"! ^^

Commentaire de cirec le 23/08/2006 15:57:13 administrateur CS

Salut,

j'ai fait un teste (eh oui j'ai aussi des images cryptées ;-))

et ma procedure est ~ 10 fois plus rapide que DecodeFileStream et ~ 15 fois plus que DecodeFile :

{ Avec TFileSteam Bloc par Bloc}

procedure DecodeFileStreamBlock(const FromFileName, ToFileName: string);
var
  FSCod, FSDeCod: TFileStream;
  Key: Byte;
  Buffer    : Array[1..1024] of Byte;
  NbALire, NbLu, TotalLu : LongInt;
  i: Integer;
begin
  FSCod := TFileStream.Create(FromFileName, fmOpenRead);
  FSDeCod := TFileStream.Create(ToFileName, fmCreate);
  try
    FSCod.Read(Key, 1);
    Key := Key xor 255; // calcul de la clé de cryptage
(*
    { TStream seek origins }
      soFromBeginning = 0;
      soFromCurrent = 1;
      soFromEnd = 2;
*)
    FSCod.Seek(0, SoFromBeginning);
    // Initialisation  des Variables
    TotalLu := 0;
    NbALire := SizeOf(Buffer);
    Repeat  // boucle qui lis par bloc de 1024 mais pas plus que la taille initiale du fichier d'origine
      If (TotalLu + NbALire) > FSCod.Size Then NbALire := FSCod.Size - TotalLu;
      NbLu := FSCod.Read(Buffer, NbALire);
      For I:= 1 to NbLu do
        Buffer[I] := Buffer[I] Xor Key;
      FSDeCod.WriteBuffer(Buffer, NbLu); // on écris dans le fichier de sortie par Bloc
      TotalLu := TotalLu + NbLu;    // on fait les comptes
    Until TotalLu >= FSCod.Size;
  finally
    FSDeCod.Free;
    FSCod.Free;
  end;
end;

Japee, pour répondre à ton problème de lecture, il faut changer le FileMode :

Var OldFileMode : Integer;
begin    
  OldFileMode:= FileMode;// On memorise le FileMode afin de le restituer à la fin
  FileMode := fmOpenRead; // On le change en Lecture Seul
  AssignFile(FCod, FromFileName);
// ... traitement
  FileMode := OldFileMode; // On restitue le FileMode

Pour les Stream c'est normal que le problème soit résolut puisque tu ouvres le fichier directement avec le bon paramètre :
  FSCod := TFileStream.Create(FromFileName, fmOpenRead);

Voilà c'est tout
Bon testes ;-)
@+
Cirec





Commentaire de japee le 23/08/2006 16:39:46 administrateur CS

Salut Cirec,

J'ai repris ce code car il était vraiment mal foutu et me faisait honte. Son seul intérêt est de montrer le mécanisme du cryptage par xor.

Quant au problème de la rapidité, il est résolu dans un code posté ultérieurement, grâce à Shining et à TMemoryStream.

Mais ta manière de procéder m'intéresse, elle est en quelque sorte à mi chemin entre BlockRead et FileStream, et je vais l'étudier de plus près.

Sinon, j'en ai deux autres en réserve, il va falloir que je compare les performances...

Une version assez rapide :

procedure DecodeFileBlocks(const FromFileName, ToFileName: string);
var
  OldF, NewF: file;
  Buffer: array[0..1023] of Byte;
  FilePointer: LongInt; // pointeur de position dans le fichier
  BytesRead: Integer;
  i: Integer;
  Key: Byte;
begin
  AssignFile(OldF, FromFileName);
  try
    Reset(OldF, 1);
    BlockRead(OldF, Buffer, SizeOf(Buffer), BytesRead);
    Key := Buffer[0] xor 255;
    Seek(OldF, 0);
    AssignFile(NewF, ToFileName);
    try
      Rewrite(NewF, 1);
      while not Eof(OldF) do
      begin
        FilePointer := FilePos(OldF);
        BlockRead(OldF, Buffer, SizeOf(Buffer), BytesRead);
        for i := 0 to BytesRead - 1 do
          Buffer[i] := Buffer[i] xor Key;
        Seek(NewF, FilePointer);
        BlockWrite(NewF, Buffer, BytesRead);
      end;
    finally
      CloseFile(NewF);
    end;
  finally
    CloseFile(OldF);
  end;
end;

Une version ultra rapide :

procedure DecodeMemoryStream(const FromFileName, ToFileName: string);
var
  Tmp,
  Key,
  PosPointer: LongWord;
  MStream: TMemoryStream;
begin
  MStream := TMemoryStream.Create;
  try
    MStream.LoadFromFile(FromFileName);
    MStream.Seek(0, soFromBeginning);
    MStream.Read(Tmp, 4);
    Key := Tmp xor $E0FFD8FF;
    MStream.Seek(0, soFromBeginning);
    while MStream.Position < MStream.Size do
    begin
      PosPointer := MStream.Position;
      MStream.Read(Tmp, 4);
      Tmp := Tmp xor Key;
      MStream.Position := PosPointer;
      MStream.Write(Tmp, 4);
      MStream.Position := PosPointer + 4;
    end;
    MStream.SaveToFile(ToFileName);
  finally
    MStream.Free;
  end;
end;

Quoi qu'il en soit, voilà un beau catalogue des manières de lire et écrire dans les fichier, c'est presque un tutoriel, lol...

A +
japee

Commentaire de cirec le 23/08/2006 22:35:28 administrateur CS

Ce qui est bizarre c'est que DecodeMemoryStream est plus lent
que la mienne ???

je vais essayer un mix des deux ...
@+
Cirec

Commentaire de cirec le 23/08/2006 23:57:02 administrateur CS

Voilà
cette procedure est vraiment la plus rapide de toutes :

procedure DecodeMemoryStreamBlock(const FromFileName, ToFileName: string);
var
  Key,
  PosPointer: LongWord;
  Buffer    : Array[1..1024] of Byte;
  MStream: TMemoryStream;
  NbALire, NbLu, TotalLu : LongInt;
  i: Integer;
begin
  MStream := TMemoryStream.Create;
  try
    MStream.LoadFromFile(FromFileName);
    MStream.Seek(0, soFromBeginning);
    MStream.Read(Key, 4);
    Key := Key xor $E0FFD8FF;
    MStream.Seek(0, soFromBeginning);
    TotalLu := 0;
    NbALire := SizeOf(Buffer);
    Repeat
      If (TotalLu + NbALire) > MStream.Size Then NbALire := MStream.Size - TotalLu;
      PosPointer := MStream.Position;
      NbLu := MStream.Read(Buffer, NbALire);
     For I:= 1 to NbLu do
        Buffer[I] := Buffer[I] Xor Key;
      MStream.Position := PosPointer;
      MStream.WriteBuffer(Buffer, NbLu);
      TotalLu := TotalLu + NbLu;    
    Until TotalLu >= MStream.Size;
    MStream.SaveToFile(ToFileName);
  finally
    MStream.Free;
  end;
end;


Bonne nuit ;-)
@+
Cirec

Commentaire de japee le 24/08/2006 00:20:07 administrateur CS

Vraiment très intéressant.
Je testerai à fond... plus tard... fatigué...

Ben, euh... fais de beaux rêves, Cirec ^^

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

lecture et écriture dans un fichier .ini [ par finipe ] Bonjour à tous !Je voudrais savoir comment faire pour : - écrire dans un .ini tous les items d'une listbox, de manière à pouvoir les récupérer en lisa Lecture/écriture dans un fichier [ par pablor44 ] Bonjour &#224; tous,alors voil&#224; j'ai un projet en t&#234;te mais je rencontre quelques probl&#232;me quand au comment je vais le r&#233;aliser et Intercepter écriture/lecture fichiers [ par kokonut ] Salut, &#231;a fait un baille que je ne suis pas pass&#233; dans le coin. Ma question est toute b&#232;te et pourtant c'est pas si simple. Je cherch Lecture Fichier [ par ertu7 ] Bonjour tout le monde,&nbsp;&nbsp;&nbsp;Voil&#224; je suis en stage au CETE de l'est et j'ai pour mission de convertir un programme assez ancien &#233 aide lecture fichier xml [ par jeromelef ] bonjour, j'ai un gros oucis avec mon fichier xml. comment dois-je faire pour lire ce fichier ? <dom écriture dans un fichier binaire [ par elementalord ] salut &#224; tous!! je voudrais savoir comment ecrire dans un fichier binaire, j'ai atendu dire que cel&#224; me permetrait aussi d'avoir une taille d Lecture de fichier. Boucle [ par pandaspirit ] Bonjour !J'ai un petit soucis avec la lecture de fichier texte...Sur chaque ligne, entre autres infos, j'ai l'identifiant de la ligne 1,2,3....,nJ'ess Lecture dans un fichier Typé [ par astrosug44 ] Bonjour,Je voudrait savoir comment faire pour récupérer des donnés dans un fichier typé....Par exemple voila ce qu'il y aurait dans "exemple.txt" :12. lecture de fichier pdf [ par philpas ] bonjour, j'ai un soucis avec la lecture de fichiers pdf.J'ai install&#233; dans delphi 6 l'activeX acrobat en suivant la proc&#233;dure de ce sitehttp Lecture d’un fichier [ par e14273 ] Bonjour à tous, Pour lire le contenu d’un fichier j’utilise l’instruction suivante : Readln(ficRom,stg); et ça marche mais ça met dans le string «


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales