用于将文件的部分内容HASH,文件是二进制的,所以不能当字符串处理.求SHA1算法的类或控件.

解决方案 »

  1.   

    http://www.pellesoft.se/communicate/tips/tips.aspx?tid=1442
    http://www.latiumsoftware.com/download/p0020.zip
    uses SHA1, Base64; function GetHashedBiosInfo: string; 
    var 
    SHA1Context: TSHA1Context; 
    SHA1Digest: TSHA1Digest; 
    begin 
    // Get the BIOS data 
    SetString(Result, PChar(Ptr($F0000)), $10000); 
    // Hash the string 
    SHA1Init(SHA1Context); 
    SHA1Update(SHA1Context, PChar(Result), Length(Result)); 
    SHA1Final(SHA1Context, SHA1Digest); 
    SetString(Result, PChar(@SHA1Digest), sizeof(SHA1Digest)); 
    // Return the hash string encoded in printable characters 
    Result := B64Encode(Result); 
    end; 
      

  2.   

    感谢楼上的回帖,这份资料我看过,不是很能搞明白意思,我对SHA1也不了解,另外第二个连接找不到服务器,能讲解一下怎么用吗?
      

  3.   

    Google可以找到Cipher包的,有SHA1,MD5等算法的,还有Demo的http://lysoft.7u7.net
      

  4.   

    感谢楼上的朋友回复,已经好几天没人回复了.事实上我已经得到了您所说的那个包,还拿到过另一个类,应该说是一个组件包.编译安装没有问题,但是拖放到窗体上以后,再编译就会出错,先是找到VER.INC,我找了好久才找到这个文件,放入文件夹后,接下来的问题是找不到变量的定义,因为不清楚工作原理,我不敢乱改.但非常奇怪的是包所带的DEMO程序是可以通过编译的,我尝试USES所有DEMO中引用的类,但是还是会出现找不到变量声明的问题,找了很久都没找到原因,如果您使用过这个组件包的话,还望指点迷津.哦,有一点在意的地方是我拿到的包最高只支持D5(另一个包只支持D4),而且其中用了大量{$IF}判断Delphi的版本.再次感谢您的回复.
      

  5.   

    直接用Crypto很简单的,给你一个例子。
    crypto的接口可以从delphi-jedi.org下到,ftp://delphi-jedi.org/api/CryptoAPI2.zip
    procedure TForm1.Button1Click(Sender: TObject);
    var
      B: array [0..1023] of Byte;
      HashResult: array [0..19] of Byte;
      HashLen: DWORD;
      hProv: HCRYPTPROV;
      hHash: HCRYPTHASH;
      I: Integer;
    begin
      for I := 0 to 1023 do B[I] := Trunc(Random(256));
      if not CryptAcquireContext(@hProv, nil, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET) then Exit;
      try
        if not CryptCreateHash(hProv, CALG_SHA1, 0, 0, @hHash) then Exit;
        try
          if not CryptHashData(hHash, @B[0], 1024, 0) then Exit;
          HashLen := 20;
          if not CryptGetHashParam(hHash, HP_HASHVAL, @HashResult[0], @HashLen, 0) then Exit;    finally
          CryptDestroyHash(hHash);
        end;
      finally
        CryptReleaseContext(hProv, 0);
      end;
    end;
      

  6.   

    非常感谢楼上的朋友的回复,我已经下载了那个Crypto,正在根据您给的例子测试,或者说是研究,因为我还不是很了解您给出的例子中的各函数的作用,如果您有空的话,能解释一下吗?万分感谢.
      

  7.   

    到www.openssl.cn注册一个用户,哪里有一个CryptoAPI的中文说明,虽然不是很全,但是前面用到的几个函数都有,首页上就可以找到
      

  8.   

    TO 开心汪汪:
    非常感谢,我在OPENSSL的下载中心里找到了这份文档,是个PDF,我仔细研究一下,另外您对我的留言中所提到的问题有任何见解吗?就是调用CryptAcquireContext函数时出错,用GETLASTERROR得到以后对照MSDN上的错误代码(MSDN上也有这个类库的介绍,我自己找到的),错误为NO_MEMORY,不知何故,所以我仍然不能使用这个库,我使用2003/D7编译.
      

  9.   

    seems that SHA1/MD5 is NO longer safe, professor Wang from Shandong University, China, has found some way to crash this two.
      

  10.   

    这个错误信息我也不知道。这段程序我在XP+Delphi6下调试通过的