segunda-feira, 26 de setembro de 2016

DELPHI - Criptografar e Decriptografar String (AES-256) - Encrypt and Decrypt String (AES-256)

Segue Unit para Encriptar ou Decriptar String.

unit uCriptografia;

interface

uses
  uTPLb_CryptographicLibrary, uTPLb_Codec, //Componentes LockBox
  System.SysUtils //FreeAndNil
  ;

const
  Key = 'ValorChave'; //Valor chave para Encriptar e Decriptar(Use um seu)


  function encriptar(const Valor :String):String;
  function decriptar(const Valor :String):String;

implementation

function encriptar(const Valor :String):String;
var
  CryptoLib: TCryptographicLibrary;
  Codec: TCodec;
begin
  Result := '';
  CryptoLib := TCryptographicLibrary.Create(nil);
  Codec := TCodec.Create(nil);
  try
    Codec.CryptoLibrary := CryptoLib;
    Codec.StreamCipherId := 'native.StreamToBlock';
    Codec.BlockCipherId := 'native.AES-256'; //Encriptação AES 256 bits
    Codec.ChainModeId := 'native.CBC';

    Codec.Reset;
    Codec.Password := Key; //Atribuindo a chave para a Criptografia
    Codec.EncryptString(Valor, Result, TEncoding.UTF8);
  finally
    FreeAndNil(CryptoLib);
    FreeAndNil(Codec);
  end;
end;

function decriptar(const Valor :String):String;
var
  CryptoLib: TCryptographicLibrary;
  Codec: TCodec;
begin
  Result := '';
  CryptoLib := TCryptographicLibrary.Create(nil);
  Codec := TCodec.Create(nil);
  try
    Codec.CryptoLibrary := CryptoLib;
    Codec.StreamCipherId := 'native.StreamToBlock';
    Codec.BlockCipherId := 'native.AES-256'; //Encriptação AES 256 bits
    Codec.ChainModeId := 'native.CBC';

    Codec.Reset;
    Codec.Password := Key; //Atribuindo a chave para Decriptografia
    Codec.DecryptString(Result, Valor, TEncoding.UTF8);
  finally
    FreeAndNil(CryptoLib);
    FreeAndNil(Codec);
  end;
end;

end.

Para usar é só declarar a Unit(uCriptografia) nas Uses do projeto e chamar as funções diretamente.

7 comentários:

  1. Boa tarde,
    adicionei o componente LockBox 3.1.3 ao projeto.
    Ao compilar retorna erros no trecho:
    "Codec.EncryptString(Valor, Result, TEncoding.UTF8);"

    E2033 Types of actual and formal var parameters must be identical
    W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
    E2034 Too many actual parameters


    Tens alguma idéia ou então a versão do componente que utilizastes?

    ResponderExcluir
    Respostas
    1. Boa tarde!

      Você pode mudar a tipo da variável (Valor e/ou Result) de String para AnsiString ou então utiliza o lockbox 3.5.1 o qual eu testei.

      Segue abaixo o link do projeto ja feito, e também do componente caso precise.

      Projeto: https://drive.google.com/file/d/0ByS4MXm_g-hFRlVUcjF6d3RJdWs/view?usp=sharing

      LockBox 3.5.1: https://github.com/TurboPack/LockBox3/

      Excluir
  2. É possível informar a Key e IV que o TCodec deve se basear para gerar minha criptografia?

    ResponderExcluir
    Respostas
    1. Boa noite Fábio!
      Desculpe-me pela demora!

      É possível sim. No exemplo acima eu criei uma constante com a KEY na linha 10 e 11.

      E na linha 34 e 57 eu atribuir key para o TCodec.

      Você pode substituir a key na constante ou atribuir uma string diretamente para Codec.Password := 'aqui sua key';

      Valeu!

      Excluir
  3. Saudações, desejo uma informação, aonde posso baixar esse componente para versão do Delphi Berlin Update 2?

    ResponderExcluir
    Respostas
    1. Antônio,

      Boa noite!

      Componente para Berlin Update 2.

      LockBox 3.5.1: https://github.com/TurboPack/LockBox3/

      Excluir
  4. É possível informar a Key e IV que o TCodec deve se basear para gerar minha criptografia?
    Eu tentei sem passar e tá dando erro de "No mapping for the Unicode character exists in the target multi-byte code page."

    ResponderExcluir