delphi – DCPcrypt哈希德国Umlauts
我使用DCPcrypt和SHA512来排列字符串.
我正在使用Warren Postma https://bitbucket.org/wpostma/dcpcrypt2010的版本 工作正常然而,它与德国的变音乐像?,?,ü以及其他unicodes一样失败. 我正在使用图书馆: function TForm1.genhash(str: string): string; var Hash : TDCP_sha512; Digest: array[0..63] of byte; i: integer; s: string; begin s:= ''; hash := TDCP_sha512.Create(nil); if hash<>nil then begin try Hash.Init; Hash.UpdateStr(str); Hash.Final(Digest); for i:= 0 to length(Digest)-1 do s:= s + IntToHex(Digest[i],2); finally hash.free; end; end; Result := s; end; 当我输入字母?我希望输出为:
我检查了这些网站: 但是我得到:
所以我的问题是: 解决方法
这必须是人们通过散列和加密所造成的最常见的错误.这些algos操作二进制数据,但您正在传递文本.某处某处将该文本编码为二进制.应该使用什么编码.您如何知道您的图书馆与在线工具相同?你没有
所以,这是你遵循的规则.从不哈希文本.只是不要这样做使用明确定义的明确选择的编码将文本编码为二进制.和哈希.我建议你编码为UTF-8和哈希.所以,TEncoding.UTF8.GetBytes(…)是你的朋友. 现在看这里的实际细节,你叫这个方法: procedure UpdateStr(const Str: RawByteString); RawByteString参数,表示您的Unicode文本正在转换为ANSI字符串,并带有默认的系统代码页.我相信这不是你打算发生的事情.实际上,编译器说:
所以编译器告诉你你做错了什么你真的必须注意编译器的消息. 现在,您可以调用UpdateUnicodeStr而不是UpdateStr.但是,再一次,你怎么知道使用什么编码?它恰好是本地内部编码,UTF-16LE. 但是,我们遵循从未对文本进行编码的规则. {$APPTYPE CONSOLE} uses SysUtils,Classes,DCPsha512; function genhash(str: string): string; var Bytes: TBytes; Hash: TDCP_sha512; Digest: array[0..63] of byte; begin Bytes := TEncoding.UTF8.GetBytes(str); // encode text as UTF-8 bytes hash := TDCP_sha512.Create(nil); try Hash.Init; Hash.Update(Pointer(Bytes)^,Length(Bytes)); Hash.Final(Digest); finally hash.Free; end; // convert the digest to a hex hash string SetLength(Result,Length(Digest)*2); BinToHex(Digest,PChar(Result),Length(Digest)); end; begin Writeln(genhash('?')); Readln; end. 产量
请注意,我以其他方式简化了代码.我删除了本地的字符串变量,并直接使用Result.我从Classes单元中使用BinToHex来进行十六进制转换的摘要.我也改了这个代码: hash := TDCP_sha512.Create(nil); if hash<>nil then .... 去除不需要的if语句.如果构造函数失败,则会引发异常. 请遵循我的规则永远不要哈希文本.这将为您服务! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |