델파이 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을 이용한다. 위와 같이 키를 입력 받아 암복호화를 할 수 있고 키 파일을 읽어서 할 수도 있다. 전자의 방법이 더 간단하다.