Delphi XE 中的 SHA1 哈希

编程入门 行业动态 更新时间:2024-10-28 08:28:24
本文介绍了Delphi XE 中的 SHA1 哈希的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在实施 XML 数字签名.我是从小步骤开始的,所以现在我想解决 SHA-1 散列的问题.

I'm in the process of implementing XML digital signatures. I'm starting with little steps, so right now I want to solve the problem of SHA-1 hashing.

SO 中有很多关于此的问题:

There are lots of questions about this in SO:

  • 使用密码箱对密钥进行数字签名
  • Delphi 加密库
  • 将此 php 数字签名转换为 Delphi
  • Delphi:是否有 LockBox 版本用于德尔福-XE
  • Delphi 2010 密码学库
  • ...可能还有更多.但是,我使用的是 Delphi XE.到目前为止,我已经尝试过 LockBox 2(Songbeamer 和 Sourceforge 版本)、Lock Box 3、DCPCrypto2 和其他一些(Hashes 是一个易于使用的单元,它使用 Windows 加密函数)

    ...and probably more. However, I'm using Delphi XE. So far, I've tried LockBox 2 (both the Songbeamer and Sourceforge versions), Lock Box 3, DCPCrypto2 and some others (Hashes is an easy to use unit which uses Windows crypto functions)

    我准备了一个小型测试台,它给了我以下内容:

    I prepared a small test rig that gives me the following:

    LockBox2

    FAILED: 1 ('abc') Got: '9f04f41a848514162050e3d68c1a7abb441dc2b5' Expected: 'a9993e364706816aba3e25717850c26c9cd0d89d' FAILED: 2 ('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq') Got: '51d7d8769ac72c409c5b0e3f69c60adc9a039014' Expected: '84983e441c3bd26ebaae4aa1f95129e5e54670f1'

    LockBox3

    FAILED: 1 ('abc') Got: '9f04f41a848514162050e3d68c1a7abb441dc2b5' Expected: 'a9993e364706816aba3e25717850c26c9cd0d89d' FAILED: 2 ('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq') Got: '51d7d8769ac72c409c5b0e3f69c60adc9a039014' Expected: '84983e441c3bd26ebaae4aa1f95129e5e54670f1'

    DCPCrypto2

    FAILED: 1 ('abc') Got: '9f04f41a848514162050e3d68c1a7abb441dc2b5' Expected: 'a9993e364706816aba3e25717850c26c9cd0d89d' FAILED: 2 ('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq') Got: '51d7d8769ac72c409c5b0e3f69c60adc9a039014' Expected: '84983e441c3bd26ebaae4aa1f95129e5e54670f1'

    哈希

    Test 1 passes Test 2 passes

    您是否在 Delphi XE 下成功编译了上述库并为其赋予了适当的值?我对 DCPCrypt2 SelfTest 程序特别感兴趣.

    Have you succeeded in compile the mentioned libraries under Delphi XE and make them give the appropriate values? I'm particularly interested in DCPCrypt2 SelfTest procedure.

    编辑:我添加了这个答案 带有固定的源代码.感谢大家的帮助,非常感谢.

    Edit: I've added this answer with the fixed source code. Thank you all for your help, it is most appreciated.

    推荐答案

    Leonardo,我认为您的问题是 UNICODE 当您使用函数散列 string 时您正在传递一个字节数组(缓冲区).因此,当您在 Delphi XE 中传递 abc 字符串时,您正在散列这样的缓冲区 61 00 62 00 63 00(十六进制表示)

    Leonardo, i think which your problem is the UNICODE when you uses a function to hash a string you are passing a array (buffer) of bytes. so when you pass the abc string in Delphi XE, your are hashing a buffer like this 61 00 62 00 63 00 (Hex representation)

    检查这个示例应用程序,它使用 Jwscl 库(JEDI Windows 安全代码库)中的 Windows 加密函数

    check this sample application which uses the Windows crypto functions from the Jwscl library (JEDI Windows Security Code Lib)

    program Jwscl_TestHash; {$APPTYPE CONSOLE} uses JwsclTypes, JwsclCryptProvider, Classes, SysUtils; function GetHashString(Algorithm: TJwHashAlgorithm; Buffer : Pointer;Size:Integer) : AnsiString; var Hash: TJwHash; HashSize: Cardinal; HashData: Pointer; i : Integer; begin Hash := TJwHash.Create(Algorithm); try Hash.HashData(Buffer,Size); HashData := Hash.RetrieveHash(HashSize); try SetLength(Result,HashSize*2); BinToHex(PAnsiChar(HashData),PAnsiChar(Result),HashSize); finally TJwHash.FreeBuffer(HashData); end; finally Hash.Free; end; end; function GetHashSHA(FBuffer : AnsiString): AnsiString; begin Result:=GetHashString(haSHA,@FBuffer[1],Length(FBuffer)); end; function GetHashSHA_Unicode(FBuffer : String): String; begin Result:=GetHashString(haSHA,@FBuffer[1],Length(FBuffer)*SizeOf(Char)); end; begin try Writeln(GetHashSHA('abc')); Writeln(GetHashSHA('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq')); Writeln(GetHashSHA_Unicode('abc')); Writeln(GetHashSHA_Unicode('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq')); Readln; except on E:Exception do begin Writeln(E.Classname, ':', E.Message); Readln; end; end; end.

    这次回归

    abc AnsiString

    abc AnsiString

    A9993E364706816ABA3E25717850C26C9CD0D89D

    A9993E364706816ABA3E25717850C26C9CD0D89D

    abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq AnsiString

    abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq AnsiString

    84983E441C3BD26EBAAE4AA1F95129E5E54670F1 用于

    84983E441C3BD26EBAAE4AA1F95129E5E54670F1 for

    abc unicode

    9F04F41A848514162050E3D68C1A7ABB441DC2B5

    9F04F41A848514162050E3D68C1A7ABB441DC2B5

    abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq Unicode

    51D7D8769AC72C409C5B0E3F69C60ADC9A039014

    51D7D8769AC72C409C5B0E3F69C60ADC9A039014

    更多推荐

    Delphi XE 中的 SHA1 哈希

    本文发布于:2023-11-29 17:48:41,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1647144.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:XE   Delphi   哈希

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!