基于密钥的简单文本文件加密

时间:2012-02-28 12:58:04

标签: delphi delphi-7 delphi-2010

我正在尝试实现一种简单的文本文件加密技术,我正在使用以下代码来执行此操作。代码不是我写的,我只是用Google搜索并得到它。加密技术似乎非常简单,简洁且易于实现。我看到它只有一个功能可以动态地进行加密和解密。只需传递密钥即可。但是,我只是想知道,我是否可以检查用户是否传递了密钥是否正确。目前,它只是根据传递的密钥加密/解密文本文件。但是没有机制来检查我们是否使用正确的密钥进行解密。无论我们传递什么密钥,它都会被解密,但它不会被读取。知道如何解决这个问题..?

procedure TEnDeCrypt.EnDecryptFile(pathin, pathout: string; Chave: Word);
var
  InMS, OutMS: TMemoryStream;
  cnt: Integer;
  C: byte;
begin
  InMS  := TMemoryStream.Create;
  OutMS := TMemoryStream.Create;
  try
    InMS.LoadFromFile(pathin);
    InMS.Position := 0;
    for cnt := 0 to InMS.Size - 1 DO
      begin
        InMS.Read(C, 1);
        C := (C xor not (ord(chave shr cnt)));
        OutMS.Write(C, 1);
      end;
    OutMS.SaveToFile(pathout);
  finally
    InMS.Free;
    OutMS.Free;
  end;
end;

3 个答案:

答案 0 :(得分:7)

如果您知道文件的内容类型(无论是二进制文件/文本文件等),那么您可以对文本进行采样,看看是否存在任何非ASCII或非预期的字符在解密后的文件中。

您可以做的另一件事是在文件末尾添加水印文本。解密后,您可以检查您的水印是否包含超出预期数据类型的数据(如果您只期望字符,并且您看到其中包含非char数据,则可能存在问题)。这虽然不是万无一失,但对你来说只是一种缓冲。

那就是说,我会问你这个问题 - 这背后的意图是什么?用户传递的密钥是加密;因此,如果用户传递的是无效密钥,则输出无效。为什么需要引导用户使用正确的密钥?如果有类似的商业用例,那么你还需要了解这将使你的加密很容易破解。我建议您选择标准加密算法并使用它来加密您的文件。

答案 1 :(得分:7)

使用散列算法在纯文本上生成校验和,并将其存储在加密文件的开头。

您可以通过散列解密文本来验证密钥,并确保校验和匹配。

如果使用强哈希算法(如SHA256)生成校验和,则用户很难自动进行暴力攻击,因为它的计算成本很高。

为确保文件完好无损,您可能还希望在加密文件上存储校验和,并将其存储在文件头中。否则,将无法区分无效密码与截断文件。

我通常使用Blowfish加密算法,该算法可从多个来源获得Delphi。 Blowfish没有已知的弱点,并且相当紧凑和快速。

答案 2 :(得分:2)

执行您要求的正确方法是加密然后验证数据。这里有一些相关的讨论:Should we MAC-then-encrypt or encrypt-then-MAC?

传统方式是首先在标准模式下使用标准密码,例如在CBC模式下的AES,然后在密文上计算HMAC(例如HMAC-SHA256)。还有一些密码模式,例如CCM,EAX,GCM,它们将执行加密和身份验证。

不要使用哈希而不是HMAC。

用于加密的密钥必须独立于用于身份验证的密钥。你可以,例如使用System.Random函数随机生成,但绝对不。如果要部署到Vista SP2或更高版本,则可以使用Windows API中的CryptGenRandom,但是否则应使用支持加密随机数生成的加密库。

如果使用基于密码的加密,请使用PBKDF2实现来获取加密密钥和身份验证密钥。有四种常用方法可以确保两个密钥是独立的:

  • 使用两个单独的Salt值;
  • 使用单一盐但将其与单独的"标签"连接,例如字符串' E'和' A'分别,
  • 生成两倍长的派生密钥,使用一半作为加密密钥,另一半作为身份验证密钥,或
  • 让派生密钥为"密钥加密密钥"用于加密随机生成的加密密钥和身份验证密钥。