티스토리 뷰

반응형

델파이로 통신용 프로그램을 개발하다보면,

패킷에 적용할 기본적인 함수들이 많이 필요합니다.

 

그 중 제가 사용하는 암호화, 인코딩 및 디코딩 함수입니다.

 

델파이11에서 이미 사용중인 함수이기에 검증이 완료된 함수이다.

제 PC에서는 잘 동작되고 있지만,

다른 PC에서는 잘 모르겠습니다.

오동작 또는 보완 사항이 있으시면 댓글 남겨 주세요.

 


[ 함수 정의 ]

// Encrypt : 상수형 키값을 받아 암호화
function Encrypt(const S: AnsiString; Key: Word): AnsiString;

// Decrypt : 상수형 키값을 받아 복호화
function Decrypt(const S: AnsiString; Key: Word): AnsiString;

// EncryptRC4 : Word형 키값을 받아 RC4 유형으로 암호화
function EncryptRC4(S: string): string;

// DecryptRC4 : Word형 키값을 받아 RC4 유형으로 복호화
function DecryptRC4(S: string): string;

// Base64Encode : Base64 인코딩하여 반환
function Base64Encode(s : string) : string;

// Base64Decode : Base64 디코딩하여 반환
function Base64Decode(s : string) : string;

 

▶ C1, C2 값을 미리 정수형 상수로 정의하자

 RC4 함수의 KetStr은 미리 문자열 상수로 정의하자.

 

[ 함수 본문 ] 상수형 키값을 받아 암호화

//
//
//
function Encrypt(const S: AnsiString; Key: Word): AnsiString;
var
   i: integer;
   FirstResult: AnsiString;
begin
   SetLength(FirstResult, Length(S));
   for i := 1 to Length(S) do
   begin
      FirstResult[i] := Ansichar(byte(S[i]) xor (Key shr 8));
      Key := (byte(FirstResult[i]) + Key) * C1 + C2;
   end;
   Result := ValueToHex(FirstResult);
end;

 

[ 함수 본문 ] 상수형 키값을 받아 복호화

//
//
//
function Decrypt(const S: AnsiString; Key: Word): AnsiString;
var
   i: integer;
   FirstResult: AnsiString;
begin
   FirstResult := HexToValue(S);
   SetLength(Result, Length(FirstResult));
   for i := 1 to Length(FirstResult) do
   begin
      Result[i] := Ansichar(byte(FirstResult[i]) xor (Key shr 8));
      Key := (byte(FirstResult[i]) + Key) * C1 + C2;
   end;
end;

 

[ 함수 본문 ] Word형 키값을 받아 RC4 유형으로 암호화

//
// DCP 콤포넌트를 이용한 암호화
//
function EncryptRC4(S: string): string;
var
  Cipher: TDCP_rc4;
begin
  Result := '';
  if (S = '') or (S = 'NULL') then Exit;
  Cipher := TDCP_rc4.Create(application);
  Cipher.InitStr(KeyStr, TDCP_sha1); // initialize the cipher with a hash of the passphrase
  Result := Cipher.EncryptString(S);
  Cipher.Burn;
  Cipher.Free;
end;


[ 함수 본문 ] Word형 키값을 받아 RC4 유형으로 복호화

//
// DCP 콤포넌트를 이용한 복호화
//
function DecryptRC4(S: string): string;
var
  Cipher: TDCP_rc4;
begin
  Result := '';
  if (S = '') or (S = 'NULL') then Exit;
  Cipher := TDCP_rc4.Create(application);
  Cipher.InitStr(KeyStr, TDCP_sha1); // initialize the cipher with a hash of the passphrase
  Result := Cipher.DecryptString(S);
  Cipher.Burn;
  Cipher.Free;
end;


[ 함수 본문 ] Base64 인코딩하여 반환

function Base64Encode(s : string) : string;  //base64
var base64 : TIdEncoderMIME;
    tmpBytes : TBytes;
begin
  base64 := TIdEncoderMIME.Create(nil);
  try
    base64.FillChar := '=';
    tmpBytes := TEncoding.UTF8.GetBytes(s);
    Result := base64.EncodeBytes(TIdBytes(tmpBytes));
  finally
    base64.Free;
  end;
end;


[ 함수 본문 ] Base64 디코딩하여 반환

function Base64Decode(s : string) : string;  //base64
var base64 : TIdDeCoderMIME;
    tmpBytes : TBytes;
begin
  Result := s;
  base64 := TIdDecoderMIME.Create(nil);
  try
    base64.FillChar := '=';
    tmpBytes := TBytes(base64.DecodeBytes(s));
    Result := TEncoding.UTF8.GetString(tmpBytes);
  finally
    base64.Free;
  end;
end;



반응형
댓글