【问题标题】:Reversing encryption in delphidelphi中的逆向加密
【发布时间】:2011-11-16 07:31:17
【问题描述】:

这段代码不是我写的,是以前的程序员。但是,我注意到他没有提供解密算法,导致加密无用。

如何解密?

function Encrypt(jstr: String): String;
var
  I: Integer;
  A: Real;
begin
  if Length(jstr) = 0 Then begin
    Result := '';
    Exit;
  end;
  A := 0;
    for I := 0 To Length(jstr) do
      A := A + (Ord(jstr[I]) * Pos(jstr[I],jstr)) / 33;
  Result := FormatFloat('0000000000.0000000000',A);
  if Pos(',',Result) > 0 then begin
    Insert('.',Result,Pos(',',Result));
    Delete(Result,Pos(',',Result),1);
  end;
end;

谢谢!

【问题讨论】:

  • 作为提示:您不需要将每一行都放入 。只需在每行前面添加 4 个空格,您将获得突出显示的代码格式
  • 幸好它不是没有密钥的加密。
  • @ralu 这不是问题,所谓加密的整个代码都在 Q 中,没有密钥
  • 看来逗号替换是将小数字符强制为句点。如果你还在使用这个函数,我会在替换部分使用 DecimalSeparator 全局变量,而不是用逗号编码。
  • “浮点加密技术”甚至可能在不同的 CPU 上产生不同的输出,这要归功于浮点引擎中舍入误差的可能差异。这是写散列的糟糕方法。我永远不会重用这段代码。

标签: windows delphi delphi-7 delphi-xe2


【解决方案1】:

它看起来像一个单向哈希,因此是不可逆的。例如,如果字符串很大,结果仍然是浮点数的字符串表示。

【讨论】:

    【解决方案2】:

    该功能无法反转。由于它接受任意长度的输入并返回有限长度的输出,简单信息论告诉您尝试编写一般逆是徒劳的。即使对于较短的输入字符串,在我看来,不同的输入字符串也可能导致相同的加密字符串。

    由于浮点代码的奇怪使用,即使作为哈希,这个函数对我来说似乎也很脆弱。如果我是你,我会用更适合目的的东西替换这个功能。

    最后,我建议您对该开发人员生成的所有代码进行审查。这段代码和算法的低质量向我表明,这个开发人员接触的所有东西都可能有缺陷。

    【讨论】:

    • 爱你的最后一段大卫:-)
    • 确实,你的最后一段给了我灵感,让我重写了一些更干净和功能更强大的代码。谢谢大佬。
    • 浮点加密值得在 Daily-WTF 网站上占有一席之地。
    • 我敢打赌,我们大多数人在某些时候都认为我们足够聪明,可以创建自己的加密方案!我们都应该在职业生涯的早期被警告不要自己涉足加密货币:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2020-07-02
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多