如何使用Delphi的标准函数进行ASCII字符串的单向散列? [英] How to do one-way hashing of an ASCII string using standard functions of Delphi?
本文介绍了如何使用Delphi的标准函数进行ASCII字符串的单向散列?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在Delphi中是新的,我试图使一个 ASCII字符串的单向散列。有没有办法加密ASCII字符串而不添加Indy或任何其他Cryptography库到项目只是通过标准函数?
I'm new in Delphi.I'm trying to make a one-way hashing of an ASCII string. Is there any way to encrypt ASCII string without adding Indy or any other Cryptography library to the project And just by standard functions ?
如果有任何方式使用Windows API,我可以这样做吗?
if there is any way to use windows API , How i can do that ?
如果可以的话请给我一个例子。
if it is possible , please give me an example.
推荐答案
可以使用Windows Cryptography库。例如,这是计算MD5哈希值的最小单位:
You can use the Windows Cryptography library for this. For instance, here's a minimal unit to calculate MD5 hashes:
unit MD5;
interface
uses
SysUtils, Math, Windows, Classes;
type
TMD5Hash = array [0..15] of Byte;
function MD5Hash(Stream: TStream): TMD5Hash; overload;
function MD5Hash(const Bytes: TBytes): TMD5Hash; overload;
function MD5Hash(const Str: RawByteString): TMD5Hash; overload;
function MD5ToString(const Hash: TMD5Hash): string;
implementation
type
HCRYPTPROV = type NativeUInt;
HCRYPTKEY = type NativeUInt;
HCRYPTHASH = type NativeUInt;
ALG_ID = Cardinal;
const
PROV_RSA_FULL = 1;
CRYPT_VERIFYCONTEXT = $F0000000;
ALG_CLASS_HASH = 4 shl 13;
ALG_TYPE_ANY = 0;
ALG_SID_MD5 = 3;
CALG_MD5 = ALG_CLASS_HASH or ALG_TYPE_ANY or ALG_SID_MD5;
HP_HASHVAL = $0002;
function CryptAcquireContextW(
out phProv: HCRYPTPROV;
pszContainer: PWideChar;
pszProvider: PWideChar;
dwProvType: DWORD;
dwFlags: DWORD
): BOOL; stdcall; external 'Advapi32.dll';
function CryptReleaseContext(
hProv: HCRYPTPROV;
dwFlags: DWORD
): BOOL; stdcall; external 'Advapi32.dll';
function CryptCreateHash(
hProv: HCRYPTPROV;
Algid: ALG_ID;
hKey: HCRYPTKEY;
dwFlags: DWORD;
out phHash: HCRYPTHASH
): BOOL; stdcall; external 'Advapi32.dll';
function CryptDestroyHash(
hHash: HCRYPTHASH
): BOOL; stdcall; external 'Advapi32.dll';
function CryptHashData(
hHash: HCRYPTHASH;
pbData: Pointer;
dwDataLen: DWORD;
dwFlags: DWORD
): BOOL; stdcall; external 'Advapi32.dll';
function CryptGetHashParam(
hHash: HCRYPTHASH;
dwParam: DWORD;
pbData: Pointer;
var pdwDataLen: DWORD;
dwFlags: DWORD
): BOOL; stdcall; external 'Advapi32.dll';
function MD5Hash(Stream: TStream): TMD5Hash;
const
BuffSize = 1024;
var
hProv: HCRYPTPROV;
hHash: HCRYPTHASH;
Buff: array [0..BuffSize] of Byte;
BytesLeft: Int64;
BytesToRead: Integer;
HashSize: DWORD;
begin
Win32Check(CryptAcquireContextW(hProv, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT));
try
Win32Check(CryptCreateHash(hProv, CALG_MD5, 0, 0, hHash));
try
BytesLeft := Stream.Size-Stream.Position;
while BytesLeft>0 do begin
BytesToRead := Min(BytesLeft, BuffSize);
Stream.ReadBuffer(Buff, BytesToRead);
Win32Check(CryptHashData(hHash, @Buff, BytesToRead, 0));
dec(BytesLeft, BytesToRead);
end;
HashSize := SizeOf(Result);
Win32Check(CryptGetHashParam(hHash, HP_HASHVAL, @Result, HashSize, 0));
finally
Win32Check(CryptDestroyHash(hHash));
end;
finally
Win32Check(CryptReleaseContext(hProv, 0));
end;
end;
function MD5Hash(const Str: RawByteString): TMD5Hash;
var
Stream: TStringStream;
begin
Stream := TStringStream.Create(Str);
try
Result := MD5Hash(Stream);
finally
Stream.Free;
end;
end;
function MD5Hash(const Bytes: TBytes): TMD5Hash;
var
Stream: TBytesStream;
begin
Stream := TBytesStream.Create(Bytes);
try
Result := MD5Hash(Stream);
finally
Stream.Free;
end;
end;
function MD5ToString(const Hash: TMD5Hash): string;
begin
SetLength(Result, SizeOf(Hash)*2);
BinToHex(Pointer(@Hash)^, PChar(Result), SizeOf(Hash));
end;
end.
这篇关于如何使用Delphi的标准函数进行ASCII字符串的单向散列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文