delhpi MD5生成

效果如下图:



    调用单元文件:

   Unit1.pas

[delphi]  view plain copy
  1. unit Unit1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, StdCtrls;  
  8.   
  9. type  
  10.   TForm1 = class(TForm)  
  11.     Button1: TButton;  
  12.     Button2: TButton;  
  13.     Edit1: TEdit;  
  14.     Edit2: TEdit;  
  15.     procedure Button1Click(Sender: TObject);  
  16.   private  
  17.     { Private declarations }  
  18.   public  
  19.     { Public declarations }  
  20.   end;  
  21.   
  22. var  
  23.   Form1: TForm1;  
  24.   
  25. implementation  
  26. uses  
  27.   AMD5;  
  28. {$R *.dfm}  
  29.   
  30. procedure TForm1.Button1Click(Sender: TObject);  
  31. var  
  32.   md5str:string;  
  33. begin  
  34.   md5str:=sMD5.MD5(Edit1.Text,False);  
  35.   Edit2.Text:=md5str;  
  36. end;  
  37.   
  38. end.  
  39.    

    被调用的单元文件:

    AMD5.pas

[delphi]  view plain copy
  1. unit AMD5;  
  2.   
  3. interface  
  4.   
  5.           
  6.         //  文件名 : AMD5.pas                     //  
  7.         //   功能  : 与md5.asp计算结果相同        //  
  8.         //   作者  : 由ScriptBaby改编自md5.asp    //  
  9.         // 完成时间: 2004-07-21                   //  
  10.           
  11.   
  12.               //请转载者保留以上信息,谢谢//  
  13.   
  14. uses  
  15.   SysUtils;  
  16.   
  17. type  
  18.   arrlongword = array of longword;  
  19.   
  20. type  
  21.   sMD5 = class  
  22.     class function RotateLeft(const lValue, Bits: longword): longword;  
  23.     class function MD5(const sMessage: stringconst sType: boolean = false): string;  
  24.     class function ConvToWord(const sMessage: string): arrlongword; overload;  
  25.     class function ConvToWord(const sMessage: WideString): arrlongword; overload;  
  26.     class function WordToHex(const lValue: longword): string;  
  27.   end;  
  28.   
  29. implementation  
  30.   
  31.  const  
  32.   BITS_TO_A_BYTE = 8;  
  33.   BYTES_TO_A_WORD = 4;  
  34.   BITS_TO_A_WORD = 32;  
  35.   
  36.   cAA = $67452301;  
  37.   cBB = $EFCDAB89;  
  38.   cCC = $98BADCFE;  
  39.   cDD = $10325476;  
  40.   
  41.   MODULUS_BITS = 512;  
  42.   CONGRUENT_BITS = 448;  
  43.   
  44. { sMD5 }  
  45.   
  46. class function sMD5.ConvToWord(const sMessage: WideString): arrlongword;  
  47. var  
  48.   lMessageLength,         
  49.   lNumberOfWords,         
  50.   lBytePosition,  
  51.   lByteCount,             
  52.   lWordCount: longword;  
  53.   lWordArray: arrlongword;  
  54.   
  55.   { Function }  
  56.   function Asc(const t: WideChar): Smallint;  
  57.   var  
  58.     s: string;  
  59.     a: Smallint;  
  60.   begin  
  61.      s := t;  
  62.   
  63.      a := Smallint(s[1]);  
  64.      case Length(s) of  
  65.        2:  
  66.        begin  
  67.          a := a shl 8;  
  68.          a := a + Smallint(s[2]);  
  69.        end  
  70.      else ;  
  71.      end;  
  72.   
  73.      Result := a;  
  74.   end;  
  75.   
  76.   
  77.   
  78.   
  79.  begin  
  80.   lMessageLength := Length(sMessage);  
  81.   
  82.   lNumberOfWords := (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) div BITS_TO_A_BYTE)) div (MODULUS_BITS div BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS div BITS_TO_A_WORD);  
  83.   
  84.   SetLength(lWordArray, lNumberOfWords);  
  85.   
  86.   lByteCount := 0;  
  87.   While lByteCount < lMessageLength do begin  
  88.     lWordCount := lByteCount div BYTES_TO_A_WORD;  
  89.     lBytePosition := (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE;  
  90.     lWordArray[lWordCount] := lWordArray[lWordCount] Or longword(Asc(sMessage[lByteCount + 1]) shl lBytePosition);  
  91.     lByteCount := lByteCount + 1;  
  92.   end;  
  93.   
  94.   lWordCount := lByteCount div BYTES_TO_A_WORD;  
  95.   lBytePosition := (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE;  
  96.   
  97.   lWordArray[lWordCount] := lWordArray[lWordCount] or ($80 shl lBytePosition);  
  98.   
  99.   lWordArray[lNumberOfWords - 2] := lMessageLength shl 3;   
  100.   lWordArray[lNumberOfWords - 1] := lMessageLength shr 29;  
  101.   
  102.   Result := lWordArray;  
  103.   
  104. end;  
  105.   
  106. class function sMD5.ConvToWord(const sMessage: string): arrlongword;  
  107. begin  
  108.   Result := ConvToWord(WideString(sMessage));  
  109. end;  
  110.   
  111. class function sMD5.MD5(const sMessage: string;const sType: boolean = false): string;  
  112. const  
  113.   S11 = 7;    
  114.   S12 = 12;   
  115.   S13 = 17;   
  116.   S14 = 22;   
  117.   S21 = 5;    
  118.   S22 = 9;    
  119.   S23 = 14;   
  120.   S24 = 20;   
  121.   S31 = 4;    
  122.   S32 = 11;   
  123.   S33 = 16;   
  124.   S34 = 23;   
  125.   S41 = 6;    
  126.   S42 = 10;   
  127.   S43 = 15;   
  128.   S44 = 21;   
  129.   
  130.   
  131.   
  132. var  
  133.   k: integer;  
  134.   AA, BB, CC, DD, a, b, c, d: longword;  
  135.   x: arrlongword;  
  136.   s: string;  
  137.     
  138.   { functions }  
  139.   
  140.   function md5_F(const x, y, z: longword): longword;   
  141.   begin  
  142.     Result := (x And y) Or ((Not x) And z);  
  143.   end;   
  144.   
  145.   function md5_G(const x, y, z: longword): longword;   
  146.   begin  
  147.     Result := (x And z) Or (y And (Not z));  
  148.   end;   
  149.   
  150.   function md5_H(const x, y, z: longword): longword;   
  151.   begin  
  152.     Result := (x Xor y Xor z);  
  153.   end;   
  154.   
  155.   function md5_I(const x, y, z: longword): longword;   
  156.   begin  
  157.     Result := (y Xor (x Or (Not z)));  
  158.   end;   
  159.   
  160.   procedure md5_FF(var a: longwordconst b, c, d, x, s, ac: longword);  
  161.   begin   
  162.     a := a + md5_F(b, c, d) + x + ac;  
  163.     a := RotateLeft(a, s);  
  164.     a := a + b;  
  165.   end;   
  166.   
  167.   procedure md5_GG(var a: longwordconst b, c, d, x, s, ac: longword);  
  168.   begin   
  169.     a := a + md5_G(b, c, d) + x + ac;  
  170.     a := RotateLeft(a, s);  
  171.     a := a + b;  
  172.   end;  
  173.   
  174.   procedure md5_HH(var a: longwordconst b, c, d, x, s, ac: longword);  
  175.   begin  
  176.     a := a + md5_H(b, c, d) + x + ac;  
  177.     a := RotateLeft(a, s);  
  178.     a := a + b;  
  179.   end;  
  180.   
  181.   
  182.   
  183.   procedure md5_II(var a: longwordconst b, c, d, x, s, ac: longword);  
  184.   begin  
  185.     a := a + md5_I(b, c, d) + x + ac;  
  186.     a := RotateLeft(a, s);  
  187.     a := a + b;  
  188.   end;   
  189.   
  190. begin  
  191.   
  192.   { MD5 }  
  193.   x := ConvToWord(sMessage);  
  194.   
  195.   
  196.   a := cAA;   
  197.   b := cBB;   
  198.   c := cCC;   
  199.   d := cDD;   
  200.   
  201.   k := 0;  
  202.   repeat  
  203.     AA := a;  
  204.     BB := b;  
  205.     CC := c;  
  206.     DD := d;  
  207.   
  208.     md5_FF(a, b, c, d, x[k + 0], S11, $D76AA478);  
  209.     md5_FF(d, a, b, c, x[k + 1], S12, $E8C7B756);   
  210.     md5_FF(c, d, a, b, x[k + 2], S13, $242070DB);   
  211.     md5_FF(b, c, d, a, x[k + 3], S14, $C1BDCEEE);   
  212.     md5_FF(a, b, c, d, x[k + 4], S11, $F57C0FAF);   
  213.     md5_FF(d, a, b, c, x[k + 5], S12, $4787C62A);   
  214.     md5_FF(c, d, a, b, x[k + 6], S13, $A8304613);   
  215.     md5_FF(b, c, d, a, x[k + 7], S14, $FD469501);   
  216.     md5_FF(a, b, c, d, x[k + 8], S11, $698098D8);   
  217.     md5_FF(d, a, b, c, x[k + 9], S12, $8B44F7AF);   
  218.     md5_FF(c, d, a, b, x[k + 10], S13, $FFFF5BB1);  
  219.     md5_FF(b, c, d, a, x[k + 11], S14, $895CD7BE);  
  220.     md5_FF(a, b, c, d, x[k + 12], S11, $6B901122);  
  221.     md5_FF(d, a, b, c, x[k + 13], S12, $FD987193);  
  222.     md5_FF(c, d, a, b, x[k + 14], S13, $A679438E);  
  223.     md5_FF(b, c, d, a, x[k + 15], S14, $49B40821);  
  224.   
  225.     md5_GG(a, b, c, d, x[k + 1], S21, $F61E2562);  
  226.     md5_GG(d, a, b, c, x[k + 6], S22, $C040B340);  
  227.     md5_GG(c, d, a, b, x[k + 11], S23, $265E5A51);  
  228.     md5_GG(b, c, d, a, x[k + 0], S24, $E9B6C7AA);   
  229.     md5_GG(a, b, c, d, x[k + 5], S21, $D62F105D);   
  230.     md5_GG(d, a, b, c, x[k + 10], S22, $2441453);   
  231.     md5_GG(c, d, a, b, x[k + 15], S23, $D8A1E681);  
  232.     md5_GG(b, c, d, a, x[k + 4], S24, $E7D3FBC8);   
  233.     md5_GG(a, b, c, d, x[k + 9], S21, $21E1CDE6);   
  234.     md5_GG(d, a, b, c, x[k + 14], S22, $C33707D6);  
  235.     md5_GG(c, d, a, b, x[k + 3], S23, $F4D50D87);   
  236.     md5_GG(b, c, d, a, x[k + 8], S24, $455A14ED);   
  237.     md5_GG(a, b, c, d, x[k + 13], S21, $A9E3E905);  
  238.     md5_GG(d, a, b, c, x[k + 2], S22, $FCEFA3F8);   
  239.     md5_GG(c, d, a, b, x[k + 7], S23, $676F02D9);   
  240.     md5_GG(b, c, d, a, x[k + 12], S24, $8D2A4C8A);  
  241.   
  242.   
  243.   
  244.   
  245.     md5_HH(a, b, c, d, x[k + 5], S31, $FFFA3942);   
  246.     md5_HH(d, a, b, c, x[k + 8], S32, $8771F681);   
  247.     md5_HH(c, d, a, b, x[k + 11], S33, $6D9D6122);  
  248.     md5_HH(b, c, d, a, x[k + 14], S34, $FDE5380C);  
  249.     md5_HH(a, b, c, d, x[k + 1], S31, $A4BEEA44);   
  250.     md5_HH(d, a, b, c, x[k + 4], S32, $4BDECFA9);   
  251.     md5_HH(c, d, a, b, x[k + 7], S33, $F6BB4B60);   
  252.     md5_HH(b, c, d, a, x[k + 10], S34, $BEBFBC70);  
  253.     md5_HH(a, b, c, d, x[k + 13], S31, $289B7EC6);  
  254.     md5_HH(d, a, b, c, x[k + 0], S32, $EAA127FA);   
  255.     md5_HH(c, d, a, b, x[k + 3], S33, $D4EF3085);   
  256.     md5_HH(b, c, d, a, x[k + 6], S34, $4881D05);   
  257.     md5_HH(a, b, c, d, x[k + 9], S31, $D9D4D039);   
  258.     md5_HH(d, a, b, c, x[k + 12], S32, $E6DB99E5);  
  259.     md5_HH(c, d, a, b, x[k + 15], S33, $1FA27CF8);  
  260.     md5_HH(b, c, d, a, x[k + 2], S34, $C4AC5665);   
  261.   
  262.     md5_II(a, b, c, d, x[k + 0], S41, $F4292244);   
  263.     md5_II(d, a, b, c, x[k + 7], S42, $432AFF97);   
  264.     md5_II(c, d, a, b, x[k + 14], S43, $AB9423A7);  
  265.     md5_II(b, c, d, a, x[k + 5], S44, $FC93A039);   
  266.     md5_II(a, b, c, d, x[k + 12], S41, $655B59C3);  
  267.     md5_II(d, a, b, c, x[k + 3], S42, $8F0CCC92);   
  268.     md5_II(c, d, a, b, x[k + 10], S43, $FFEFF47D);  
  269.     md5_II(b, c, d, a, x[k + 1], S44, $85845DD1);   
  270.     md5_II(a, b, c, d, x[k + 8], S41, $6FA87E4F);   
  271.     md5_II(d, a, b, c, x[k + 15], S42, $FE2CE6E0);  
  272.     md5_II(c, d, a, b, x[k + 6], S43, $A3014314);   
  273.     md5_II(b, c, d, a, x[k + 13], S44, $4E0811A1);  
  274.     md5_II(a, b, c, d, x[k + 4], S41, $F7537E82);   
  275.     md5_II(d, a, b, c, x[k + 11], S42, $BD3AF235);  
  276.     md5_II(c, d, a, b, x[k + 2], S43, $2AD7D2BB);   
  277.     md5_II(b, c, d, a, x[k + 9], S44, $EB86D391);   
  278.   
  279.     a := a + AA;  
  280.     b := b + BB;  
  281.     c := c + CC;  
  282.     d := d + DD;  
  283.   
  284.   k := k + 16;  
  285.   until k > High(x);  
  286.     
  287.   if sType then  
  288.   begin  
  289.     s := WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d)  
  290.   end  
  291.   else  
  292.   begin  
  293.     s := WordToHex(b) + WordToHex(c);  
  294.   end;  
  295.   
  296.   Result := StrLower(PAnsiChar(s));  
  297. end;  
  298.   
  299. class function sMD5.RotateLeft(const lValue, Bits: longword): longword;  
  300. begin  
  301.   Result := (lValue shl Bits) Or (lValue shr (32 - Bits));  
  302. end;  
  303.   
  304. class function sMD5.WordToHex(const lValue: longword): string;  
  305. var  
  306.   s: string;  
  307. begin  
  308.   s := inttohex(lValue, 8);  
  309.   Result := s[7]+s[8]+s[5]+s[6]+s[3]+s[4]+s[1]+s[2];  
  310. end;  
  311.   
  312. end.  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值