这是一个从数据生成MD5哈希值(Hash)的单元,广泛用于加密领域
type
/// <summary> Hash(哈希/散列)相关异常 </summary>
EHashException = class(Exception);
/// <summary> 将通用函数记录到所有哈希函数</summary>
THash = record
/// <summary>将一个摘要转换成一个整数,如果它的长度是4</summary>
class function DigestAsInteger(const ADigest: TBytes): Integer; static;
/// <summary>将一个摘要转换为十六进制值字符串</summary>
class function DigestAsString(const ADigest: TBytes): string; static;
/// <summary>将一个摘要转换成一个GUID,如果它的长度是16</summary>
class function DigestAsStringGUID(const ADigest: TBytes): string; static;
/// <summary> 得到一个带有给定长度的随机字符串</summary>
class function GetRandomString(const ALen: Integer = 10): string; static;
/// <summary> 得到BigEndian的一个cardinal值的内存表示</summary>
class function ToBigEndian(AValue: Cardinal): Cardinal; overload; static; inline;
/// <summary> 得到一个UInt64值的BigEndian内存表示</summary>
class function ToBigEndian(AValue: UInt64): UInt64; overload; static; inline;
end;
/// <summary> 记录从数据生成MD5哈希值。存储过程的内部状态</summary>
THashMD5 = record
private type
TContextState = array [0..15] of Cardinal;
TContextBuffer = array [0..63] of Byte;
private
FPadding: TContextBuffer;
FContextState: array [0..3] of Cardinal;
FContextCount: array [0..1] of Cardinal;
FContextBuffer: TContextBuffer;
FFinalized: Boolean;
procedure Transform(const ABlock: PByte; AShift: Integer);
procedure Decode(const Dst: PCardinal; const Src: PByte; Len: Integer; AShift: Integer);
procedure Encode(const Dst: PByte; const Src: PCardinal; Len: Integer);
procedure FinalizeHash;
procedure Update(const AData: PByte; ALength: Cardinal); overload;
function GetDigest: TBytes;
public
/// <summary> 创建一个用于生成MD5哈希的实例</summary>
class function Create: THashMD5; static; inline;
/// <summary> 把产生器的状态机放在它的初始状态。</summary>
procedure Reset;
/// <summary> 用所提供的字节更新散列</summary>
procedure Update(const AData; ALength: Cardinal); overload;
procedure Update(const AData: TBytes; ALength: Cardinal = 0); overload; inline;
procedure Update(const Input: string); overload; inline;
/// <summary> 返回这个散列实例的块大小</summary>
function GetBlockSize: Integer; inline;
/// <summary> 返回这个散列实例的HashSize</summary>
function GetHashSize: Integer; inline;
/// <summary> 将散列值作为TBytes返回</summary>
function HashAsBytes: TBytes; inline;
/// <summary> 将散列值作为字符串返回</summary>
function HashAsString: string; inline;
/// <summary> 散列给定的字符串,并返回它的散列值为TBytes</summary>
class function GetHashBytes(const AData: string): TBytes; overload; static;
/// <summary> 散列给定的字符串,并返回它的散列值为string</summary>
class function GetHashString(const AString: string): string; overload; static; inline;
/// <summary> 散列给定的流, 并返回它的散列值为TBytes</summary>
class function GetHashBytes(const AStream: TStream): TBytes; overload; static;
/// <summary> 散列给定的流, 并返回它的散列值为string</summary>
class function GetHashString(const AStream: TStream): string; overload; static; inline;
/// <summary> 用给定的文件名散列文件,并返回它的散列值为TBytes</summary>
class function GetHashBytesFromFile(const AFileName: TFileName): TBytes; static;
/// <summary> 用给定的文件名散列文件,并返回它的散列值为string</summary>
class function GetHashStringFromFile(const AFileName: TFileName): string; static; inline;
/// <summary>获取与HMAC身份验证相关联的字符串</summary>
class function GetHMAC(const AData, AKey: string): string; static; inline;
/// <summary>获取与HMAC身份验证相关联的摘要</summary>
class function GetHMACAsBytes(const AData, AKey: string): TBytes; overload; static;
class function GetHMACAsBytes(const AData: string; const AKey: TBytes): TBytes; overload; static;
class function GetHMACAsBytes(const AData: TBytes; const AKey: string): TBytes; overload; static;
class function GetHMACAsBytes(const AData, AKey: TBytes): TBytes; overload; static;
end;
/// <summary> 记录从数据中生成的SHA1散列值</summary>
THashSHA1 = record
private
FHash: array[0..4] of Cardinal;
FBitLength: Int64;
FBuffer: array [0..63] of Byte;
FIndex: Integer;
FFinalized: Boolean;
procedure Initialize;
procedure CheckFinalized;
procedure Compress;
procedure Finalize;
function GetDigest: TBytes;
procedure Update(const AData: PByte; ALength: Cardinal); overload;
public
/// <summary>初始化用于计算SHA1散列的记录</summary>
class function Create: THashSHA1; static; inline;
/// <summary> 将生成器的状态机置于初始状态。</summary>
procedure Reset; inline;
/// <summary> 使用给定的数据更新散列值。 </summary>
procedure Update(const AData; ALength: Cardinal); overload;
procedure Update(const AData: TBytes; ALength: Cardinal = 0); overload; inline;
procedure Update(const Input: string); overload; inline;
/// <summary> 为这个hash实例返回块大小 </summary>
function GetBlockSize: Integer; inline;
/// <summary> Returns the HashSize for this hash instance</summary>
function GetHashSize: Integer; inline;
/// <summary> 以TBytes的形式返回散列值</summary>
function HashAsBytes: TBytes; inline;
/// <summary> 将散列值作为字符串返回g</summary>
function HashAsString: string; inline;
/// <summary> 散列给定的字符串,并返回它的散列值为TBytes</summary>
class function GetHashBytes(const AData: string): TBytes; overload; static;
/// <summary> 散列给定的字符串,并返回它的散列值为string</summary>
class function GetHashString(const AString: string): string; overload; static; inline;
/// <summary> 散列给定的流, 并返回它的散列值为TBytes</summary>
class function GetHashBytes(const AStream: TStream): TBytes; overload; static;
/// <summary> 散列给定的流, 并返回它的散列值为string</summary>
class function GetHashString(const AStream: TStream): string; overload; static; inline;
/// <summary> 用给定的文件名散列文件,并返回它的散列值为TBytes</summary>
class function GetHashBytesFromFile(const AFileName: TFileName): TBytes; static;
/// <summary> 用给定的文件名散列文件,并返回它的散列值为string</summary>
class function GetHashStringFromFile(const AFileName: TFileName): string; static; inline;
/// <summary>获取与HMAC身份验证相关联的字符串</summary>
class function GetHMAC(const AData, AKey: string): string; static; inline;
/// <summary>获取与HMAC身份验证相关联的摘要</summary>
class function GetHMACAsBytes(const AData, AKey: string): TBytes; overload; static;
class function GetHMACAsBytes(const AData: string; const AKey: TBytes): TBytes; overload; static;
class function GetHMACAsBytes(const AData: TBytes; const AKey: string): TBytes; overload; static;
class function GetHMACAsBytes(const AData, AKey: TBytes): TBytes; overload; static;
end;
/// <summary> 记录从数据中生成SHA2散列值</summary>
THashSHA2 = record
public type
TSHA2Version = (SHA224, SHA256, SHA384, SHA512, SHA512_224, SHA512_256);
private const
CBuffer32Length = 64;
CBuffer64Length = 128;
private
FBuffer: array [0..127] of Byte;
FBitLength: UInt64;
FIndex: Cardinal;
FFinalized: Boolean;
procedure Initialize(AVersion: TSHA2Version);
procedure CheckFinalized; inline;
procedure Compress; inline;
procedure Compress32;
procedure Compress64;
procedure Finalize; inline;
procedure Finalize32;
procedure Finalize64;
function GetDigest: TBytes;
procedure Update(const AData: PByte; ALength: Cardinal); overload;
public
/// <summary>初始化用于计算SHA2散列的记录</summary>
class function Create(AHashVersion: TSHA2Version = TSHA2Version.SHA256): THashSHA2; static; inline;
/// <summary> 将生成器的状态机置于初始状态。</summary>
procedure Reset; inline;
/// <summary>使用给定的数据更新散列值。</summary>
procedure Update(const AData; ALength: Cardinal); overload;
procedure Update(const AData: TBytes; ALength: Cardinal = 0); overload; inline;
procedure Update(const Input: string); overload; inline;
/// <summary> 为这个hash实例返回块大小</summary>
function GetBlockSize: Integer; inline;
/// <summary>返回这个散列实例的HashSize</summary>
function GetHashSize: Integer; inline;
/// <summary> 返回散列值为TBytes</summary>
function HashAsBytes: TBytes; inline;
/// <summary> 返回散列值为string</summary>
function HashAsString: string; inline;
/// <summary> 散列给定的字符串,并返回它的散列值为integer</summary>
class function GetHashBytes(const AData: string; AHashVersion: TSHA2Version = TSHA2Version.SHA256): TBytes; overload; static;
/// <summary> 散列给定的字符串,并返回它的散列值为string</summary>
class function GetHashString(const AString: string; AHashVersion: TSHA2Version = TSHA2Version.SHA256): string; overload; static; inline;
/// <summary> 散列给定的流, 并返回它的散列值为TBytes</summary>
class function GetHashBytes(const AStream: TStream; AHashVersion: TSHA2Version = TSHA2Version.SHA256): TBytes; overload; static;
/// <summary> 散列给定的流, 并返回它的散列值为string</summary>
class function GetHashString(const AStream: TStream; AHashVersion: TSHA2Version = TSHA2Version.SHA256): string; overload; static; inline;
/// <summary> 用给定的文件名散列文件,并返回它的散列值为TBytes</summary>
class function GetHashBytesFromFile(const AFileName: TFileName; AHashVersion: TSHA2Version = TSHA2Version.SHA256): TBytes; static;
/// <summary> 用给定的文件名散列文件,并返回它的散列值为string</summary>
class function GetHashStringFromFile(const AFileName: TFileName; AHashVersion: TSHA2Version = TSHA2Version.SHA256): string; static; inline;
/// <summary>获取与HMAC身份验证相关的字符串</summary>
class function GetHMAC(const AData, AKey: string; AHashVersion: TSHA2Version = TSHA2Version.SHA256): string; static; inline;
/// <summary>获得与HMAC认证相关的摘要</summary>
class function GetHMACAsBytes(const AData, AKey: string; AHashVersion: TSHA2Version = TSHA2Version.SHA256): TBytes; overload; static;
class function GetHMACAsBytes(const AData: string; const AKey: TBytes; AHashVersion: TSHA2Version = TSHA2Version.SHA256): TBytes; overload; static;
class function GetHMACAsBytes(const AData: TBytes; const AKey: string; AHashVersion: TSHA2Version = TSHA2Version.SHA256): TBytes; overload; static;
class function GetHMACAsBytes(const AData, AKey: TBytes; AHashVersion: TSHA2Version = TSHA2Version.SHA256): TBytes; overload; static;
private
case FVersion: TSHA2Version of
TSHA2Version.SHA224,
TSHA2Version.SHA256: (FHash: array[0..7] of Cardinal);
TSHA2Version.SHA384,
TSHA2Version.SHA512,
TSHA2Version.SHA512_224,
TSHA2Version.SHA512_256: (FHash64: array[0..7] of UInt64);
end;
/// <summary> 记录从数据中生成BobJenkins散列值。存储过程的内部状态</summary>
THashBobJenkins = record
private
FHash: Integer;
function GetDigest: TBytes;
class function HashLittle(const Data; Len, InitVal: Integer): Integer; static;
public
/// <summary>初始化用于计算BobJenkins散列的记录</summary>
class function Create: THashBobJenkins; static;
/// <summary> 将生成器的状态机置于初始状态。</summary>
procedure Reset(AInitialValue: Integer = 0);
/// <summary> 使用给定的数据更新散列值。</summary>
procedure Update(const AData; ALength: Cardinal); overload; inline;
procedure Update(const AData: TBytes; ALength: Cardinal = 0); overload; inline;
procedure Update(const Input: string); overload; inline;
/// <summary> 返回散列值为TBytes</summary>
function HashAsBytes: TBytes;
/// <summary>返回散列值为integer</summary>
function HashAsInteger: Integer;
/// <summary>返回散列值为string</summary>
function HashAsString: string;
/// <summary> 散列给定的字符串,并返回它的散列值为TBytes</summary>
class function GetHashBytes(const AData: string): TBytes; static;
/// <summary>散列给定的字符串,并返回它的散列值为string</summary>
class function GetHashString(const AString: string): string; static;
/// <summary> 散列给定的字符串,并返回它的散列值为integer</summary>
class function GetHashValue(const AData: string): Integer; overload; static; inline;
/// <summary> 散列给定的数据,并返回它的散列值为integer</summary>
class function GetHashValue(const AData; ALength: Integer; AInitialValue: Integer = 0): Integer; overload; static; inline;
end;