Cryptage d'images pixel par pixel [Résolu]

Messages postés
1
Date d'inscription
samedi 10 mai 2008
Dernière intervention
27 juillet 2008
- - Dernière réponse : Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 30 juil. 2008 à 14:22
bonjour,
je veux  crypte une image pixel par pixel, l'utilise la librairie lockbox, alors j'ai cree le code suivant:
.
.
.
.procedure TMainForm.btncptClick(Sender: TObject);<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

var ImgCpt:TMDIChild;

     Str,StrC:String;

     i,j:Integer;

     P:PByteArray;

     cl:BytePixel;

     R:RealPixel;

 

begin

 //Apparence de l'enfant ImgCpt

ImgCpt:=(ActiveMDIChild as TMDIChild);

 Str:='Image cryptée';

 

 //transfert des pixels de l'image vers la zone memoire

  for j:=0 to ht-1 do

  begin

    for i:=0 to wd-1 do

      begin

        cl:=getrvalue(ImgCpt.Image1.Picture.Bitmap.Canvas.Pixels[i,j]);

        setbyte(cl,Pimt,i+j*wd);

      end;

   end;

 

  //traitement (cryptage de l'image)

  for j:=0 to ht-1 do //ht = hauteur de l'image
  begin

    for i:=0 to wd-1 do //wd= largeur de l'image

      begin

      cl:=getbyte(Pimt,i+j*wd); //balayage de l'image ligne par ligne

      StrC:=IntToStr(cl);      //Contiendra la valeur cryptée  (0…..255)

      StrC:=LbRijndael1.EncryptString(StrC);//cryptage avec la composant AES 

                        //StrC=’ fgC7VcLjPJc05ejq30gOvA==’ pour cl=255 (exemple)

      Edit2.Text:=StrC;   //Pour le test

      ShowMessage('');  //Pour le test

      Cl:=StrtoInt(strc);  //pas efficace ...........(*)

 

     //le text strc=’ fgC7VcLjPJc05ejq30gOvA==’ doit etre converti en integer!!!!! maiiiiiiiis     //comment

 

      setrealtype(cl,Pimt,i+j*wd);

      end;

  end;

 //Affichage

 PointerToBitmap1(Pimt,p,0,ImgCpt,Str);

 ImgCpt.Invalidate;

 

end;

le probleme est dans la ligne (*): je veux convertir le text  strc=’ fgC7VcLjPJc05ejq30gOvA==’
en byte pour ne pas perdre l'information dans la phase de decryptage.

Merci d'avance.
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
3
Merci
Salut,

@Bacterius:
je suis pas certain que ton code crypte réellement quelque chose ^^

Voici un exemple très simple avec un accès 100 fois plus rapide aux pixels qu'avec l'utilisation "Canvas.Pixels"

L'utilisation de RandSeed n'est "normalement" pas conseillé pour le cryptage de données. Grace a RandSeed et à Random on a la possibilité de reproduire la même suite "aléatoire" de nombres à la condition que la valeur passée à RandSeed soit la même et que le code soit compilé avec la même version du compilateur. Comme dans l'exemple ci-dessous ces deux points sont respectés .... par contre toutes les vérifications ne sont pas faites, en particulier sur l'existence de BMPOut dans la procédure CrypteBMPEx ce n'était pas le but recherché

Pour l'exemple il faut :
1 TButton
3 TImage (1 pour afficher l'originale, 2 pour la cryptée, 3 pour la descryptée)
1 OpenPictureDialog

procedure CrypteBMPEx(const BMPIn, BMPOut: TBitmap; const Key: Cardinal);
var
  PData       : PInteger;
  MaxPixels,
  ActualPixel : Integer;
begin
  if not Assigned(BMPIn) then Exit;
  BMPOut.Assign(BMPIn);
  BMPOut.PixelFormat := pf32bit;
  MaxPixels :=  BMPOut.Width * BMPOut.Height;
  ActualPixel := 0;
  PData := BMPOut.ScanLine[BMPOut.Height-1];
  RandSeed := Key;
  Repeat
    PData^ := PData^ xor Random($FFFFFF) ;
    Inc(PData);
    Inc(ActualPixel);
  Until ActualPixel >= MaxPixels;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  if OPD1.Execute then
  begin
    // charge le Bitmap dans Image1
    Image1.Picture.Bitmap.LoadFromFile(OPD1.FileName);
    // Crypte et affiche dans Image2
    CrypteBMPEx(Image1.Picture.Bitmap, Image2.Picture.Bitmap, 235689);
    // descrypte et affiche dans Image3
    CrypteBMPEx(Image2.Picture.Bitmap, Image3.Picture.Bitmap, 235689);
  end;
end;
 
@+
Cirec

<hr siz="" />

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Cirec
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
0
Merci
Bonjour,
tu n'as pas besoin d'utiliser la librairie lockbox ! d'ailleurs pour un algorithme de cryptage il vaut mieux travailler son propre système, sinon ça ne sert à rien ^^

Je te montre un exemple de cryptage simple (a ne pas prendre, faut en trouver un plus hard à casser) :

On récupère les valeurs R,G,B du pixel en cours (on est dans une double boucle, qui scanne et longueur + en hauteur)

R := GetRValue(MonCanvas.Pixels[XDeMonPixEnCours, YDe...]);
G := GetGValue(MonCanvas.Pixels[XDeMonPixEnCours, YDe...]);
B := GetBValue(MonCanvas.Pixels[XDeMonPixEnCours, YDe...]);

R := R + 5;
G := G + 3;
B := R - 2;

MonCanvas.Pixels[XDeMonPixEnCours, YDe...] := rgb(R, G, B);

// On a crypté le pixel

// Pour le decryptage : on prend l'image cryptée :

R := GetRValue(MonCanvas.Pixels[XDeMonPixEnCours, YDe...]);
G := GetGValue(MonCanvas.Pixels[XDeMonPixEnCours, YDe...]);
B := GetBValue(MonCanvas.Pixels[XDeMonPixEnCours, YDe...]);

R := R - 5;
G := G - 3;
B := R + 2;

MonCanvas.Pixels[XDeMonPixEnCours, YDe...] := rgb(R, G, B);

// Et on inverse l'algorithme

Et voila tu as réalisé ton crypteur d'images !
Si tu as des questions, n'hesites-pas à les poser !
Bonne chance pour la suite !

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
0
Merci
Bonjour,

euh ouais ... ouais ... [cherche un truc à répondre] ... hmm attends ... [se rabat sur Delrama] ouais Delrama pense me à mettre réponse acceptée, et préfères la solution de Cirec à la mienne (en changeant l'algorithme sinon Cirec verra toutes tes photos p ... non je me tais -- c'etait tentant).
Et euh bravo Cirec pour cette démonstration de cryptage avec brio !
Et Delrama, oublie les librairies de cryptage, on n'est jamais mieux servi que par soi-même ! (non ce n'est pas un lien ...)

Cordialement, Bacterius !

PS : cette signature devient horripilante ! personne n'a jamais de problème d'envoi avec une signature ?
Il faudrait en toucher deux mots aux webmasters de CS si cela touche beaucoup de monde ...
Commenter la réponse de Bacterius
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
0
Merci
@Delrama:

c'est bien de poser des questions mais c'est mieux quand on prend 5mn pour répondre aux membres qui ont pris le temps de se pencher sur ton problème

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.