【问题标题】:simple text file encryption based on a key基于密钥的简单文本文件加密
【发布时间】:2012-02-28 12:58:03
【问题描述】:

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

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;

【问题讨论】:

  • 不是我,但是这种加密方式不是很安全,不值得投资。它比加密更容易混淆。至于你真正的问题:没有办法,因为你没有真正的密钥系统可以在不包含秘密部分的情况下安全地进行身份验证。
  • @jimsweb 这是我很久以前写的东西,如果我没记错的话它是用 D7 写的,下载源代码 + bin 版本,玩得开心! delphigeist.com/2010/09/…
  • 我一般使用 dcpcrypt 的 AES 加密
  • @jimsweb,你应该直接问这个,不要让读者猜测意图。显然,您有两个不同的问题,后一个(使用多字母替换变换校验和)我觉得很有趣。请分而治之

标签: delphi delphi-7 delphi-2010


【解决方案1】:

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

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

如果您使用强大的哈希算法(例如 SHA256)来生成校验和,用户将很难自动执行蛮力攻击,因为它的计算成本很高。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢 Gangadhar 提出的宝贵建议。 - 这个应用程序没有商业用途。这是我的爱好应用程序。
    【解决方案3】:

    执行您要求的正确方法是加密然后验证数据。这里有一些相关的讨论: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 实现来派生加密密钥和身份验证密钥。有四种常见的方法可以确保两个键是独立的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 2016-03-24
      • 1970-01-01
      • 2011-05-10
      • 2014-10-24
      • 1970-01-01
      相关资源
      最近更新 更多