Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Delphi函数,它接受整数并返回一个不太容易解码的整数_Algorithm_Delphi_Pascal - Fatal编程技术网

Algorithm Delphi函数,它接受整数并返回一个不太容易解码的整数

Algorithm Delphi函数,它接受整数并返回一个不太容易解码的整数,algorithm,delphi,pascal,Algorithm,Delphi,Pascal,任何人都可以分享一个函数的一些常见的Delphi示例吗 返回一个不太明显的数字 例如: function GetNumber(const aSeed: Integer): Integer; begin Result := ((aSeed+5) * aSeed) + 15; end; 假设用户知道发送aSeed=21得到561 和aSeed=2,给出29 等等 是否有一个函数使得代码很难进行反向工程, 即使可以生成大量种子/结果集? (难:我不是说不可能,只是需要不平凡) 最好是不允许函数内

任何人都可以分享一个函数的一些常见的Delphi示例吗 返回一个不太明显的数字

例如:

function GetNumber(const aSeed: Integer): Integer;
begin
  Result := ((aSeed+5) * aSeed) + 15;
end;
假设用户知道发送
aSeed
=21得到561 和
aSeed
=2,给出29 等等

是否有一个函数使得代码很难进行反向工程, 即使可以生成大量种子/结果集? (难:我不是说不可能,只是需要不平凡)

最好是不允许函数内结果超过 结果也是整数

在任何情况下,如果您不确定是否很难/不可能逆转, 请随意分享你所拥有的

其他一些要求:

  • 相同的输入总是导致相同的输出;不能有随机输出
  • 无论平台:windows/android/mac/ios,输出相同
  • 不会产生非常大的数字(适合整数)

使用散列是实现所需的非常好的方法。下面是一个示例,它获取一个整数,将其转换为字符串,将其附加到,计算MD5并返回与前4个字节对应的整数:

uses
  System.Hash;

function GetHash(const s: string): TBytes;
var
  MD5: THashMD5;
begin
  MD5 := THashMD5.Create;
  MD5.Update(TEncoding.UTF8.GetBytes(s));
  Result := MD5.HashAsBytes;
end;

function GetNumber(Input: Integer): Integer;
var
  Hash: TBytes;
  p: ^Integer;
begin
  Hash := GetHash('secret' + IntToStr(Input));
  P := @Hash[0];
  Result := Abs(P^);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(GetNumber(1))); // 996659739
  ShowMessage(IntToStr(GetNumber(2))); // 939216101
  ShowMessage(IntToStr(GetNumber(3))); // 175456750
end;

你问的是散列。@RonMaupin我不认为OP想要散列。散列不是可逆的过程。他想要的是模糊处理或加密。对于哪类人来说,逆向工程应该是不平凡的?用例是什么?您是否希望将模糊编号存储在数据库中,然后将其取回,同时不希望有人理解您在数据库中编写的内容?或者你可以将号码发送到另一个系统,而该系统必须将原始号码取回?如果你解释你想做什么,你会得到更好的建议…密码学界有很多解决方案。他们通常用一个密钥加密,用另一个或同一个密钥解密。公钥加密和非公钥加密有对称加密和非对称加密两种。这里有很多选项来解释一切,特别是如果我们不知道你的真正问题。我尝试根据ID获得一个非随机数(ID对于我来说太明显了)。我不需要将结果恢复到原始ID,但我只是不想让人们知道我是如何得到结果数字的(尽可能多)。在本例中不寻找散列。感谢提供此示例。非常感谢。如果有人能开导我的话,那么这两行P:=@Hash[0];结果:=Abs(P^);这如何给出前4个字节的整数?别误会,我不是在怀疑答案,只是我没有足够的专家来阅读这段代码。@PeterJones
P
持有一个指向整数的指针
@Hash[0]
是哈希数组开头的地址。通过将该地址分配给
P
并取消对
P
的引用,可以得到存储在数组开头的整数。查看更多详细信息。