unit mainF;

{$mode objfpc}{$H+}

interface

uses
  Classes, BlowFish, SysUtils, FileUtil, DividerBevel, Forms, Controls,
  Graphics, Dialogs, StdCtrls, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    btnCifrar: TButton;
    btnDescifrar: TButton;
    DividerBevel1: TDividerBevel;
    DividerBevel2: TDividerBevel;
    edClave: TEdit;
    lblClave: TLabel;
    mClaro: TMemo;
    mCifrado: TMemo;
    procedure btnCifrarClick(Sender: TObject);
    procedure btnDescifrarClick(Sender: TObject);
  private
    sOriginal, sCifrado: TStringStream;
    clave: string;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.btnCifrarClick(Sender: TObject);
var bfCif: TBlowFishEncryptStream;
begin
  if mClaro.Lines.Count = 0 then Exit;
  clave:= edClave.Text;
  // Creamos una instancia de TStringStream vacía
  sOriginal:= TStringStream.Create(EmptyStr);
  {Iniciamos el cifrado al vuelo
  según escribimos el texto claro en el flujo}
  bfCif:= TBlowFishEncryptStream.Create(clave, sOriginal);
  bfCif.WriteAnsiString(mClaro.Text);
  { liberamos recursos y  mostramos el contenido del flujo en memo}
  bfCif.Free;
  mCifrado.Text:= sOriginal.DataString;
  mClaro.Text:= '';


end;

procedure TForm1.btnDescifrarClick(Sender: TObject);
var bfDes: TBlowFishDeCryptStream;
begin
  //Creamos instancia con el contenido cifrado
  sCifrado:= TStringStream.Create(sOriginal.DataString);
  // y desciframos el flujo de datos
  bfDes:= TBlowFishDeCryptStream.Create(clave, sCifrado);
  // para mostrar su contenido en el memo
  mClaro.Text:= bfDes.ReadAnsiString;
  mCifrado.Text:='';
  // liberamos toda la memoria
  bfDes.Free;
  sCifrado.Free;
  sOriginal.Free;
end;

end.

