⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 screencryptjpeg.pas

📁 jpeg文件的加密解密
💻 PAS
字号:
// efg, 12 December 1999
// www.efg2.com/Lab

unit ScreenCryptJPEG;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, ExtDlgs, JPEG;

type
  TFormCrypt = class(TForm)
    ButtonLoadJPG: TButton;
    ImageOriginal: TImage;
    ImageEncrypted: TImage;
    ImageDecrypted: TImage;
    ButtonEncrypt: TButton;
    ButtonDecrypt: TButton;
    ButtonSaveBIN: TButton;
    EditSeedEncrypt: TEdit;
    LabelSeedEncrypt: TLabel;
    CheckBoxStretch: TCheckBox;
    LabelSeedDecrypt: TLabel;
    EditSeedDecrypt: TEdit;
    LabelLab1: TLabel;
    LabelLab2: TLabel;
    OpenPictureDialog: TOpenPictureDialog;
    SaveDialog: TSaveDialog;
    ButtonLoadBIN: TButton;
    OpenDialog: TOpenDialog;
    procedure FormDestroy(Sender: TObject);
    procedure ButtonLoadJPGClick(Sender: TObject);
    procedure ButtonEncryptClick(Sender: TObject);
    procedure ButtonDecryptClick(Sender: TObject);
    procedure CheckBoxStretchClick(Sender: TObject);
    procedure EditSeedEncryptChange(Sender: TObject);
    procedure EditSeedDecryptChange(Sender: TObject);
    procedure LabelLab2Click(Sender: TObject);
    procedure EditNumericKeyPress(Sender: TObject; var Key: Char);
    procedure ButtonSaveBINClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ButtonLoadBINClick(Sender: TObject);
  private    
    JPEGOriginalBinary :  TMemoryStream; // Cannot be directly displayed in TImage
    JPEGEncryptedBinary:  TMemoryStream; // Cannot be directly displayed in TImage

    PROCEDURE DecryptImage;
    PROCEDURE EncryptImage;
  public
    { Public declarations }
  end;

var
  FormCrypt: TFormCrypt;

implementation
{$R *.DFM}

  USES
    ShellAPI;  // ShellExecute

  // Create pf24bit "noise" image using random numbers
  FUNCTION CreateNoiseImage(CONST Width, Height:  INTEGER):  TBitmap;
    VAR
      i  :  INTEGER;
      j  :  INTEGER;
      row:  pByteArray;
  BEGIN
    RESULT             := TBitmap.Create;
    RESULT.Width       := Width;
    RESULT.Height      := Height;
    RESULT.PixelFormat := pf24bit;

    FOR j := 0 TO Height-1 DO
    BEGIN
      row := RESULT.Scanline[j];
      FOR i := 0 TO 3*Width-1 DO   // 3 bytes per pixel
      BEGIN
        row[i] := Random(256)
      END
    END
  END {CreateNoiseImage};


  // Encrypt bytes in JPEGOriginalBinary TMemoryStream to give JPEGEncryptedBinary
  PROCEDURE TFormCrypt.EncryptImage;
    VAR
      BitmapDisplay:  TBitmap;
      i            :  INTEGER;
      pIn          :  pByte;
      pOut         :  pByte;
      RandomValue  :  BYTE;
  BEGIN
    TRY
      RandSeed := StrToInt(EditSeedEncrypt.Text)
    EXCEPT
      RandSeed := 67547  // use this prime number if entry is invalid
    END;

    IF   Assigned(JPEGEncryptedBinary)
    THEN JPEGEncryptedBinary.Free;

    JPEGEncryptedBinary := TMemoryStream.Create;

    // Encrypted version same size as the original version
    JPEGEncryptedBinary.Size := JPEGOriginalBinary.Size;

    pIn  := JPEGOriginalBinary.Memory;
    pOut := JPEGEncryptedBinary.Memory;
    FOR i := 1 TO JPEGOriginalBinary.Size DO
    BEGIN
      RandomValue := Random(256);       //  0..255
      pOut^ := pIn^ XOR RandomValue;
      INC(pIn);
      INC(pOut)
    END;

    // JPEGEncryptedBinary cannot be displayed as an image.  So, let's just
    // create a "noise" bitmap to display instead.  The "seed" for this noise
    // image will be the RandSeed left over from the JPEG encryption, so the
    // same noise image will be created for a given JPEG.

    BitmapDisplay := CreateNoiseImage(ImageEncrypted.Width,
                                      ImageEncrypted.Height);
    TRY
      ImageEncrypted.Picture.Graphic := BitmapDisplay;
    FINALLY
      BitmapDisplay.Free
    END;

    DecryptImage;

    ButtonDecrypt.Enabled := TRUE;
    ButtonSaveBIN.Enabled := TRUE

  END {EncryptImage};


  PROCEDURE TFormCrypt.DecryptImage;
    VAR
      BitmapDisplay      :  TBitmap;
      i                  :  INTEGER;
      JPEGDecrypted      :  TJPEGImage;
      JPEGDecryptedBinary:  TMemoryStream;
      pIn                :  pByte;
      pOut               :  pByte;
      RandomValue        :  BYTE;
  BEGIN
    TRY
      RandSeed := StrToInt(EditSeedDecrypt.Text)
    EXCEPT
      RandSeed := 67547  // use this prime number if entry is invalid
    END;

    JPEGDecryptedBinary := TMemoryStream.Create;
    TRY

      // Decrypted version same size as the encrypted version
      JPEGDecryptedBinary.Size := JPEGEncryptedBinary.Size;

      pIn  := JPEGEncryptedBinary.Memory;
      pOut := JPEGDecryptedBinary.Memory;
      FOR i := 1 TO JPEGEncryptedBinary.Size DO
      BEGIN
        RandomValue := Random(256);       //  0..255
        pOut^ := pIn^ XOR RandomValue;
        INC(pIn);
        INC(pOut)
      END;

      // At this point the decrypted JPEG binary stream is in the
      // JPEGDecryptedBinary stream.  Load this memory stream into the
      // JPEGDecrypted TJPEGImage.
      JPEGDecrypted := TJPEGImage.Create;
      TRY
        TRY
          JPEGDecrypted.LoadFromStream(JPEGDecryptedBinary);
          ImageDecrypted.Picture.Graphic := JPEGDecrypted;
        EXCEPT
          // If any error occurs in the conversion, just show a noise image
          BitmapDisplay := CreateNoiseImage(ImageEncrypted.Width, ImageEncrypted.Height);
          TRY
            ImageDecrypted.Picture.Graphic := BitmapDisplay;
          FINALLY
            BitmapDisplay.Free
          END;
        END
      FINALLY
        JPEGDecrypted.Free
      END
    FINALLY
      JPEGDecryptedBinary.Free
    END;

    EditSeedDecrypt.Enabled := TRUE;
  END {DecryptImage};


procedure TFormCrypt.FormDestroy(Sender: TObject);
begin
  JPEGOriginalBinary.Free;
  JPEGEncryptedBinary.Free
end;


procedure TFormCrypt.ButtonLoadJPGClick(Sender: TObject);
  VAR
    JPEGOriginal:  TJPEGImage;
begin
  IF   OpenPictureDialog.Execute
  THEN BEGIN

    // Load JPEG Image for Display
    JPEGOriginal := TJPEGImage.Create;
    TRY
      JPEGOriginal.LoadFromFile(OpenPictureDialog.Filename);
      ImageOriginal.Picture.Graphic := JPEGOriginal
    FINALLY
      JPEGOriginal.Free
    END;

    // Load JPEG Image as Binary Stream
    IF   Assigned(JPEGOriginalBinary)
    THEN JPEGOriginalBinary.Free;
    JPEGOriginalBinary := TMemoryStream.Create;
    JPEGOriginalBinary.LoadFromFile(OpenPictureDialog.Filename);

    ButtonEncrypt.Enabled := TRUE;
    EditSeedEncrypt.Enabled := TRUE;
  END
end;


procedure TFormCrypt.ButtonEncryptClick(Sender: TObject);
begin
  EncryptImage
end;


procedure TFormCrypt.ButtonDecryptClick(Sender: TObject);
begin
  DecryptImage
end;


procedure TFormCrypt.CheckBoxStretchClick(Sender: TObject);
begin
  ImageOriginal.Stretch  := CheckBoxStretch.Checked;
  ImageEncrypted.Stretch := CheckBoxStretch.Checked;
  ImageDecrypted.Stretch := CheckBoxStretch.Checked
end;


procedure TFormCrypt.EditSeedEncryptChange(Sender: TObject);
begin
  EncryptImage
end;


procedure TFormCrypt.EditSeedDecryptChange(Sender: TObject);
begin
  DecryptImage
end;


procedure TFormCrypt.LabelLab2Click(Sender: TObject);
begin
  ShellExecute(0, 'open', pchar('http://www.efg2.com/lab'),
               NIL, NIL, SW_NORMAL)
end;


// Make sure only valid numeric characters are present
procedure TFormCrypt.EditNumericKeyPress(Sender: TObject;
  var Key: Char);

  CONST
    Backspace  = #$08;
begin
  IF   NOT (Key IN [Backspace, '0'..'9'])
  THEN Key := #$00
end;


procedure TFormCrypt.ButtonSaveBINClick(Sender: TObject);
begin
  IF   SaveDialog.Execute
  THEN JPEGEncryptedBinary.SaveToFile(SaveDialog.Filename)
end;

procedure TFormCrypt.FormCreate(Sender: TObject);
begin
  SaveDialog.InitialDir := ExtractFilePath( ParamStr(0) )
end;


procedure TFormCrypt.ButtonLoadBINClick(Sender: TObject);
  VAR
    BitmapDisplay:  TBitmap;
begin
  IF   OpenDialog.Execute
  THEN BEGIN
    // Load JPEG Image as Binary Stream
    IF   Assigned(JPEGEncryptedBinary)
    THEN JPEGEncryptedBinary.Free;
    JPEGEncryptedBinary := TMemoryStream.Create;
    JPEGEncryptedBinary.LoadFromFile(OpenDialog.Filename);

    // Create "noise" bitmap to display since encrypted file cannot be
    // directly displayed (actually we don't even know if it's a valid
    // JPEG yet).
    BitmapDisplay := CreateNoiseImage(ImageEncrypted.Width, ImageEncrypted.Height);
    TRY
      ImageEncrypted.Picture.Graphic := BitmapDisplay;
    FINALLY
      BitmapDisplay.Free
    END;

    DecryptImage
  END;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -