首页  编辑  

加密图像

Tags: /超级猛料/Picture.图形图像编程/图片处理/   Date Created:

procedure EncryptBMP(const BMP: TBitmap; Key: Integer);

var

 BytesPorScan: Integer;

 w, h: integer;

 p: pByteArray;

begin

 try

   BytesPorScan := Abs(Integer(BMP.ScanLine[1]) -

     Integer(BMP.ScanLine[0]));

 except

   raise Exception.Create('Error');

 end;

 RandSeed := Key;

 for h := 0 to BMP.Height - 1 do

 begin

   P := BMP.ScanLine[h];

   for w := 0 to BytesPorScan - 1 do

     P^[w] := P^[w] xor Random(256);

 end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

 EncryptBMP(Image1.Picture.Bitmap, 623);

 Image1.Refresh;

end;

*****************************************************

下面的代码,可以把字符串隐藏到一个BitMap中!因此非常有用的噢!原理是利用人眼无法分辨微小色彩的变化:

第一个是源文件,第二个是加密后的文件,第三个是利用计算机判断出来的不同的数据点,这些点三面带有加密信息。

加密的信息,存储在每一个像素的最低一个字节上面。

// Do the actual encryption of the message inside the picture.

procedure TForm1 . btnEncryptClick ( Sender : TObject );

var

 x , y , i , j         : Integer ;

 PixelData         : TColor ;

 CharMask , CharData : Byte ;

begin

  // Assign the original picture to both the target encrypted image

  // and delta image. Also make sure thier resolution is sufficient to

  // indicate the change in the LSB.

 imgTarget . Picture . Assign ( imgOrig . Picture );

 imgDelta . Picture . Assign ( imgOrig . Picture );

 imgTarget . Picture . Bitmap . PixelFormat := pf32bit ;

 imgDelta . Picture . Bitmap . PixelFormat := pf32bit ;

 x := 0 ;

 y := 0 ;

  // The letter 'c' is identified by the binary representation of '10000011'

  // for each '1' in this number change the current pixel's LSB value.

  with imgTarget . Picture . Bitmap do

    for i := 1 to Length ( sourceMessage . Text ) do

    begin

     CharMask := $80 ;

      // 8 bytes for every letter to be encrypted.

      for j := 1 to 8 do

      begin

        // See if the current byte in the character is either '1' or '0'.

       CharData := Byte ( sourceMessage . Text [ i ]) and CharMask ;

        //Data is not zero - change the LSB of the current pixel.

        if ( CharData <> 0 ) then

        begin

          // Xor the LSB value - hence change its value.

         PixelData := Canvas . Pixels [ x , y ] xor $1 ;

          // Store the changed pixel color back in the Pixels array.

         Canvas . Pixels [ x , y ] := PixelData ;

        end ;

        // Move to the next pixel.

       x := ( x + 1 ) mod Width ;

        if ( x = 0 ) then

        begin

         Inc ( y );

        end ;

        // Move the mask to be applied to the current character to the

        // right, hence will now examine the next bit in the binary

        // representation of the current letter to be encrypted.

       CharMask := CharMask shr 1 ;

      end ;

    end ;

  // Show the difference in the Delta image.

  for y := 0 to imgOrig . Picture . Bitmap . Height - 1 do

    for x := 0 to imgOrig . Picture . Bitmap . Width - 1 do

      // Check for difference, the difference will show in the LSB of every

      // pixel in the original and target images.

      if ( imgOrig . Picture . Bitmap . Canvas . Pixels [ x , y ] <>

       imgTarget . Picture . Bitmap . Canvas . Pixels [ x , y ]) then

       imgDelta . Picture . Bitmap . Canvas . Pixels [ x , y ] := clYellow ;

end ;

// Decryption ( by Lemy )

procedure TForm1 . btnDecryptClick ( Sender : TObject );

var

 x , y               : integer ;

 mask , ch           : byte ;

begin

 sourceMessage . Clear ;

 mask := $80 ;

 ch := 0 ;

  for y := 0 to imgOrig . Picture . Bitmap . Height - 1 do

  begin

    for x := 0 to imgOrig . Picture . Bitmap . Width - 1 do

    begin

      // if the pixel is different then set related bit

      if ( imgOrig . Picture . Bitmap . Canvas . Pixels [ x , y ] <>

       imgTarget . Picture . Bitmap . Canvas . Pixels [ x , y ]) then

       ch := ch or mask ;

      // shift the bit to the rigtht

     mask := mask shr 1 ;

      // if the mask is 0 then the dexryption of a char is completed

      // so add to the Text and rest the highest bit

      if mask = 0 then

      begin

       sourceMessage . Text := sourceMessage . Text + char ( ch );

       mask := $80 ;

       ch := 0 ;

      end ;

    end ;

  end ;

end ;

img_28466.bmp (450.8KB)