转换哈希 sha256 中的字符串
Convert string in hash sha256
我想使用 DCPCrypt 转换 sha256 哈希中的字符串。
表单包含输入字符串的编辑、转换字符串的按钮和显示输出 sha256 哈希的另一个编辑。
我写了这段代码:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, DCPsha256, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
DCP_sha256_1: TDCP_sha256;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
function getsha256(S: String): String;
var
Hash: TDCP_sha256;
Digest: array[0..31] of byte; // sha256 produces a 256bit digest (32bytes)
Source: string;
i: integer;
str1: string;
begin
Source:= S; // here your string for get sha256
if Source <> '' then
begin
Hash:= TDCP_sha256.Create(nil); // create the hash
Hash.Init; // initialize it
Hash.UpdateStr(Source);
Hash.Final(Digest); // produce the digest
str1:= '';
for i:= 0 to 31 do
str1:= str1 + IntToHex(Digest[i],2);
//form1.Edit2.Text:= s; // display the digest in lower case
Form1.Edit2.Text:=UpperCase(str1); // display the digest in capital letter
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
getsha256(Edit1.Text); // show the sha256 of string in edit1
end;
end.
有效。问题是我收到来自 lazarus 的警告和提示。
- 警告:局部变量“Digest”似乎没有被初始化;
- 警告:函数结果似乎未设置。
第一个警告是误报。编译器不知道 Hash.Final()
会填入 Digest
,而且你没有事先自己初始化它。对 FillByte()
(or even FillDWord()
) 的简单调用就足够了:
FillByte(Digest, SizeOf(Digest), 0);
//FillDWord(Digest, SizeOf(Digest) div 4, 0);
不过,第二个警告是正确的。您的 getsha256()
函数声明为 return a String
,但您根本没有设置函数的 Result
。您应该更改此行:
Form1.Edit2.Text:=UpperCase(str1);
改为:
Result:=UpperCase(str1);
然后在 TForm1.Button1Click()
中,更改此行:
getsha256(Edit1.Text);
改为:
Edit2.Text:=getsha256(Edit1.Text);
我想使用 DCPCrypt 转换 sha256 哈希中的字符串。 表单包含输入字符串的编辑、转换字符串的按钮和显示输出 sha256 哈希的另一个编辑。 我写了这段代码:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, DCPsha256, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
DCP_sha256_1: TDCP_sha256;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
function getsha256(S: String): String;
var
Hash: TDCP_sha256;
Digest: array[0..31] of byte; // sha256 produces a 256bit digest (32bytes)
Source: string;
i: integer;
str1: string;
begin
Source:= S; // here your string for get sha256
if Source <> '' then
begin
Hash:= TDCP_sha256.Create(nil); // create the hash
Hash.Init; // initialize it
Hash.UpdateStr(Source);
Hash.Final(Digest); // produce the digest
str1:= '';
for i:= 0 to 31 do
str1:= str1 + IntToHex(Digest[i],2);
//form1.Edit2.Text:= s; // display the digest in lower case
Form1.Edit2.Text:=UpperCase(str1); // display the digest in capital letter
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
getsha256(Edit1.Text); // show the sha256 of string in edit1
end;
end.
有效。问题是我收到来自 lazarus 的警告和提示。
- 警告:局部变量“Digest”似乎没有被初始化;
- 警告:函数结果似乎未设置。
第一个警告是误报。编译器不知道 Hash.Final()
会填入 Digest
,而且你没有事先自己初始化它。对 FillByte()
(or even FillDWord()
) 的简单调用就足够了:
FillByte(Digest, SizeOf(Digest), 0);
//FillDWord(Digest, SizeOf(Digest) div 4, 0);
不过,第二个警告是正确的。您的 getsha256()
函数声明为 return a String
,但您根本没有设置函数的 Result
。您应该更改此行:
Form1.Edit2.Text:=UpperCase(str1);
改为:
Result:=UpperCase(str1);
然后在 TForm1.Button1Click()
中,更改此行:
getsha256(Edit1.Text);
改为:
Edit2.Text:=getsha256(Edit1.Text);