3

我已经设法使用以下代码对输入的密码进行简单加密,然后在标签标题中显示加密的密码,

procedure TfrmLogin.edtAddPasswordClick(Sender: TObject);
var
  NormalPassword, EncryptedPassword: string;
  PasswordChar: Char;
  EncryptedCharValue: string;
  CharPtr: Integer;
  Ptr, n: Integer;
begin
  NormalPassword := Edit1.text;
  EncryptedPassword := '';
  for CharPtr := 1 to Length(NormalPassword) do
  begin
    PasswordChar := NormalPassword[CharPtr];
    EncryptedCharValue := IntToStr (Ord(PasswordChar) * 5 + 14);
    EncryptedPassword := EncryptedPassword + EncryptedCharValue;
    Label1.Caption := EncryptedPassword;
  end;
end;

问题是我想通过单击另一个按钮将 label1.caption 中显示的加密密码转换回其原始形式,但我无法弄清楚如何做到这一点。有什么建议么?

4

5 回答 5

6

与其创建自己的算法来散列(或加密)密码,不如尝试使用经过良好测试且可靠的算法,如 SHA1、MD5 等。

回到您将加密值转换为原始值的问题,您所要做的就是反转您的算法,试试这个示例。

var
  NormalPassword, EncryptedPassword: String;
  PasswordChar : char;
  EncryptedCharValue : String;
  CharPtr : Integer;
begin
  NormalPassword    :='';
  EncryptedPassword := Label1.Caption; //here is stored the encrypted password
  CharPtr := 1;
  while CharPtr< length(EncryptedPassword) do
    Begin
      EncryptedCharValue:=Copy(EncryptedPassword, CharPtr, 3);
      Inc(CharPtr, 3);
      PasswordChar     := Chr((StrToint(EncryptedCharValue)-14) div 5);
      NormalPassword  :=NormalPassword+ PasswordChar;
    end;
    Label2.Caption := NormalPassword; 
end;
于 2012-04-09T20:31:07.793 回答
4

我知道这是为了家庭作业,想法是获取逆向代码,其他人为此目的提供了太多细节,但我需要给出这个作为答案,因为它的概念太重要了,无法在注释中说明:

如果你真的在谈论密码,那么你不能让密码可逆。用户希望他们的密码安全可靠且不可撤销。

如果您要这样做的原因是因为您想在他们忘记密码时向他们发送密码,那么答案是不要

当一个人丢失或忘记了他们的密码时,您不应该其还给他们,因为这证明它是不安全的。相反,正确的做法是,在确保他们是注册用户(通过电子邮件地址或其他方式)之后,允许他们输入他们选择的新密码。

于 2012-04-09T20:43:17.780 回答
2

如果您决心按照您描述的方式进行操作,则可以通过更改行使其可逆:

EncryptedCharValue := IntToStr (Ord(PasswordChar) * 5 + 14);

EncryptedCharValue := format('%.4d', [Ord(PasswordChar) * 5 + 14]);

这将允许您稍后将字符串分成四个字符块,减去 14,除以 5,然后将其转换回字符。不过,我坚持我之前的评论 - 如果您确实有一个需要可逆安全性的用例,请使用更强大的算法,例如在这个问题中讨论。

[编辑:四个字符显然更健壮]

于 2012-04-09T20:31:12.953 回答
1

You 函数是一种非常简单的哈希算法,无法反转。以可以反转的方式存储密码是没有意义的,因为它不会增加任何额外的安全层(除非您使用基于非对称加密的复杂方案)

于 2012-04-09T20:16:22.700 回答
0

简单哈希算法: 如何用 Delphi 对字符串进行哈希处理?

使用密钥算法(CRAM,HMac)散列: Delphi 中的 HMAC-SHA256

于 2012-04-10T05:34:40.367 回答