본문 바로가기
Delphi, RadStudio

[개발/Delphi] WinCrypt API32 로 문자열 MD5 암호화 하기

by SB리치퍼슨 2012. 5. 23.

MD5 암호화를 찾아보면서...

MD5 암호화 리턴값이 다른 경우가 꽤나 있다. 그래서 windows에서 제공하는 WinAPI32 를 사용하기로 했다.

WinCrypt API를 사용하기로 했다.

그리고, 값이 제대로 나오는 방법을 찾아서 구현했다.


또, 아래 사이트가 내가 구현한 것과 거의 유사하다.


아래 소스가 공유가 많이 되었으면 좋겠다. 동일한 md5 암호화 값이 나오게




[개발/Delphi] WinCrypt API32 로 문자열 MD5 암호화 하기



출처: http://www.scalabium.com/faq/dct0173.htm


function MD5(const Value: string): string;
var
  hCryptProvider: HCRYPTPROV;
  hHash: HCRYPTHASH;
  bHash: array[0..$7F] of Byte;
  dwHashLen: dWord;
  i: Integer;
begin
  dwHashLen := 16;
  if (Value = '') then
  begin
    Result := 'd41d8cd98f00b204e9800998ecf8427e';
    exit;
  end
  else
    Result := '';

  {get context for crypt default provider}
  if CryptAcquireContext(@hCryptProvider, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT or CRYPT_MACHINE_KEYSET) then
  begin
    {create hash-object MD5}
    if CryptCreateHash(hCryptProvider, CALG_MD5, 0, 0, @hHash) then
    begin
      {get hash from password}
      if CryptHashData(hHash, @Value[1], Length(Value), 0) then
      begin
        if CryptGetHashParam(hHash, HP_HASHVAL, @bHash[0], @dwHashLen, 0) then
        begin
          for i := 0 to dwHashLen-1 do
            Result := Result + IntToHex(bHash[i], 2);
        end;
      end;
      {destroy hash-object}
      CryptDestroyHash(hHash);
    end;
    {release the context for crypt default provider}
    CryptReleaseContext(hCryptProvider, 0);
  end;

  Result := AnsiLowerCase(Result);
end;

반응형

댓글