delphi 64位MD5算法

本文提供了一个在64位环境中计算MD5值正确的Delphi函数,该函数从 Indy 的MD5代码修改而来,适用于处理TStream、TBytes和String类型的数据。代码包括了MD5算法的核心过程及轮数处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看到网上有人说indy的md5在64位下计算结果与32位下不一致。我测试了一下,确实如此,因此把自己用的64位计算结果正确的md5函数代码发出来。

说明1:这个单元的代码是从indy的md5代码修改而来的。

说明2:计算TBytes和String的MD5值可以使用TBytesStream或TStringStream。

说明3:计算结果转换为HEX字符的代码请自行编写。

 

unit BambooMD5;

interface

uses
  SysUtils,
  Classes;

function BambooMD5Stream(aStream: TStream): TBytes;

implementation

uses
  Math;

type
  T4x4LongWordRecord = array [0 .. 3] of LongWord;
  T16x4LongWordRecord = array [0 .. 15] of LongWord;

function ROL(const AVal: LongWord; AShift: Byte): LongWord; assembler;
asm
  {$IFDEF CPUX64}
  mov  eax, ecx
  {$ELSE}
  {$ENDIF !CPUX64}
  mov  cl, dl
  rol  eax, cl
end;

const
  MD4_INIT_VALUES: T4x4LongWordRecord = ($67452301, $EFCDAB89, $98BADCFE, $10325476);

  MD5_SINE: array [1 .. 64] of LongWord = (
    { Round 1. }
    $D76AA478, $E8C7B756, $242070DB, $C1BDCEEE, $F57C0FAF, $4787C62A, $A8304613, $FD469501, $698098D8, $8B44F7AF, $FFFF5BB1, $895CD7BE, $6B901122, $FD987193, $A679438E, $49B40821,
    { Round 2. }
    $F61E2562, $C040B340, $265E5A51, $E9B6C7AA, $D62F105D, $02441453, $D8A1E681, $E7D3FBC8, $21E1CDE6, $C33707D6, $F4D50D87, $455A14ED, $A9E3E905, $FCEFA3F8, $676F02D9, $8D2A4C8A,
    { Round 3. }
    $FFFA3942, $8771F681, $6D9D6122, $FDE5380C, $A4BEEA44, $4BDECFA9, $F6BB4B60, $BEBFBC70, $289B7EC6, $EAA127FA, $D4EF3085, $04881D05, $D9D4D039, $E6DB99E5, $1FA27CF8, $C4AC5665,
    { Round 4. }
    $F4292244, $432AFF97, $AB9423A7, $FC93A039, $655B59C3, $8F0CCC92, $FFEFF47D, $85845DD1, $6FA87E4F, $FE2CE6E0, $A3014314, $4E0811A1, $F7537E82, $BD3AF235, $2AD7D2BB, $EB86D391);
{$Q-}

procedure MDCoder(const FCBuffer: TBytes; var FState: T4x4LongWordRecord);
var
  A, B, C, D: LongWord;
  i: Integer;
  X: T16x4LongWordRecord;
begin
  A := FState[0];
  B := FState[1];
  C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值