델파이 cng를 이용한 암호화와 복호화

윈도우즈를 설치하면 CryptoAPI와 CNGcryptography api: next generation라는 암호화/복호화cryptography 라이브러리를 이용할 수 있다. CryptoAPI는 오래 전에 나온 거로 crypt32.dll을 이용하면 되고 cng는 그 이름에서 알 수 있듯이 차세대 라이브러리로 마이크로소프트가 현재 밀고 있는 거다. bcrypt.dll과 ncrypt.dll을 이용하면 되며 이들 모두 windows/system32 폴더에 있다.

cng의 bcrypt는 바이너리 암복호화에 이용되고 ncrypt는 서버와 클라이언트 사이의 메시지 암복호화에 이용된다. cng는 다양한 앨거리듬을 임포트하여 이용할 수 있게 되어 있다. 마이크로소프트가 제공하는 c++ 소스코드를 델파이 코드로 바꾼 게 기트허브에 Crypt4Delphi라는 이름으로 공개되어 있다. 여기에는 많은 파일들이 있지만 CNGCrypt.Core.pas와 CNGCrypt.WinAPI.pas만 프로젝트에 추가하면 아래와 같이 간단하게 이용할 수 있다.

procedure TForm1.Encrypt();
var
  cngCrypt: TCNGCrypt;
  encryptedBytes: TBytes;
  binaryWriter: TBinaryWriter;
begin
  cngCrypt := TCNGCrypt.Create;
  binaryWriter := TBinaryWriter.Create('test');

  cngCrypt.Password := '1234';

  cngCrypt.Encrypt(TEncoding.UTF8.GetBytes('to be encrypted'), encryptedBytes);

  binaryWriter.Write(encryptedBytes);

  binaryWriter.Free;
  cngCrypt.Free;
end;

procedure TForm1.Decrypt();
var
  cngCrypt: TCNGCrypt;
  binaryReader: TBinaryReader;
  encryptedBytes: TBytes;
  decryptedBytes: TBytes;
begin
  cngCrypt := TCNGCrypt.Create; // CNGCrypt.Core
  binaryReader := TBinaryReader.Create('test');

  cngCrypt.Password := '1234';

  encryptedBytes := binaryReader.ReadBytes(100); // should be larger than actual count

  cngCrypt.Decrypt(encryptedBytes, decryptedBytes);

  Caption := TEncoding.UTF8.GetString(decryptedBytes); // to be encrypted

  binaryReader.Free;
  cngCrypt.Free;
end;

crypt4delphi는 BCRYPT_AES_ALGORITHM을 이용한다. 위와 같이 키를 입력 받아 암복호화를 할 수 있고 키 파일을 읽어서 할 수도 있다. 전자의 방법이 더 간단하다.