delphi10.2的散列单元hash.pas

这是一个从数据生成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;


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤独的学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值