delrama
Messages postés1Date d'inscriptionsamedi 10 mai 2008StatutMembreDernière intervention27 juillet 2008
-
27 juil. 2008 à 00:43
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 2022
-
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 //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.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 28 juil. 2008 à 14:44
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;
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 27 juil. 2008 à 11:23
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...]);
// 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...]);
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 28 juil. 2008 à 18:45
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 ...