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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
Delphi是否有加密安全的PRNG库?_Delphi_Random - Fatal编程技术网

Delphi是否有加密安全的PRNG库?

Delphi是否有加密安全的PRNG库?,delphi,random,Delphi,Random,有人能推荐一个用于Delphi(Win32)的加密安全伪随机数生成器库吗 可以是免费的,也可以是商业的,但最好是一个活跃的项目。我希望它包括源代码 OpenSSL将是一种可能性。源代码是可用的,尽管我不知道是否有Delphi版本可用。它包括一个。它是一个活动的项目,但对于您正在寻找的内容来说,它可能过于复杂。您可以使用现有的Win32 API。您可以使用Windows CryptoAPI: uses Wcrypt2; function GenerateRandom(Len: Cardinal)

有人能推荐一个用于Delphi(Win32)的加密安全伪随机数生成器库吗


可以是免费的,也可以是商业的,但最好是一个活跃的项目。我希望它包括源代码

OpenSSL将是一种可能性。源代码是可用的,尽管我不知道是否有Delphi版本可用。它包括一个。它是一个活动的项目,但对于您正在寻找的内容来说,它可能过于复杂。

您可以使用现有的Win32 API。

您可以使用Windows CryptoAPI:

uses Wcrypt2;

function GenerateRandom(Len: Cardinal): TBytes;
var
  hProv : HCRYPTPROV;
begin
  if not CryptAcquireContext(@hProv,
                             nil,
                             MS_ENHANCED_PROV,
                             PROV_RSA_FULL,
                             CRYPT_VERIFYCONTEXT) then
    CryptAcquireContext(@hProv,
                        nil,
                        MS_ENHANCED_PROV,
                        PROV_RSA_FULL,
                        CRYPT_NEWKEYSET + CRYPT_VERIFYCONTEXT);

  if hProv > 0 then
  try
    SetLength(Result,Len);
    CryptGenRandom(hProv,Len,@Result[0]);
  finally
    CryptReleaseContext(hProv,0);
  end;
end;
使用上述代码的示例:

function BytesToHex(const Bytes: TBytes): string;
var
  i : integer;
begin
  for i := 0 to Length(Bytes)-1 do
    Result := Result + IntToHex(Bytes[i],2);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(BytesToHex(GenerateRandom(16)));
end;
(在德语德尔福社区中很有名,但没有其他地方——大概是因为它没有正式推广)包含一个加密安全的

只需包含单元
decardom
(可能还有
DECUtils
),并像这样使用它(本例使用
IInteger
,但这不是强制性的):

函数生成器域名编号:IInteger;
变量
A:情报员;
开始

NRnd(A,512);//生成512位随机数,2^512。您还可以获得加密、SSL、哈希等功能。
Indy已经转换了很多标题并包含RAND_屏幕,但显然,在并没有UI的程序上不能/不应该使用它。不幸的是,它遗漏了大多数RAND_*one,但它们很容易导入和使用
例如:

然后在代码中:

  RAND_load_file(PAnsiChar(AnsiString('name-of-seed-file')), 512);
  //or
  //RAND_screen;
  ...
  ...
  const
    PKCS5_SALT_LEN = 8;
  var
    salt: TBytes;
  begin
    SetLength(salt, PKCS5_SALT_LEN);
    RAND_pseudo_bytes(@salt[0], PKCS5_SALT_LEN);
    ...
  end;
当然,同样的种子问题仍然适用。

请查看ISAAC(间接、移位、累积、添加和计数),它是一种快速PRNG,也是加密安全的(burtleburtle.net/bob/rand/isaacafa.html)。也许艾萨克和著名的梅森龙卷风一样快

Wolfgang Ehrhardt为ISAAC提供了pascal/delphi端口,可在
(免费,来源可用)。还有一个链接指向作者网站上提供的另一个delphi端口,但我会选择“Wolfgang Ehrhardt”版本。我知道他的站点()很多年了,从那时起,他一直在使用pascal/delphi例程进行更新。当然你应该是这方面的专家

这忽略了随机种子生成,这本身就是一个大问题。可以使用CryptoAPI(如其他答案所示)生成种子,然后使用DEC生成随机数。@gabr:种子生成当然是个问题,但多默没有要求它。如果你给Delphi PRNG提供了一个好的种子,它仍然不被认为是加密安全的…同意,但仍然必须指出-特别是你的代码显示了两个初始化种子的不太好的例子。只有当GetLastError=NTE\u BAD\u KEYSET时,才应该执行第二个CryptAcquireContext。否则代码将引发异常(RAISELASTERROR)或返回空数组。MSDN来源:CryptGenRandom具有已知的弱点。请考虑使用它作为一个已验证的CPRNG的熵源,例如作为校验——它是一个强的基于AES-256的密码安全伪随机数生成器,具有比密码子黑匣子更高的安全性(它仅使用密码子随机作为熵源)。
function RAND_load_file(const filename: PAnsiChar; max_bytes: longint): integer; cdecl; external 'libeay32.dll';
function RAND_bytes(buf: PByte; num: integer): integer; cdecl; external 'libeay32.dll';
function RAND_pseudo_bytes(buf: PByte; num: integer): integer; cdecl; external 'libeay32.dll';
  RAND_load_file(PAnsiChar(AnsiString('name-of-seed-file')), 512);
  //or
  //RAND_screen;
  ...
  ...
  const
    PKCS5_SALT_LEN = 8;
  var
    salt: TBytes;
  begin
    SetLength(salt, PKCS5_SALT_LEN);
    RAND_pseudo_bytes(@salt[0], PKCS5_SALT_LEN);
    ...
  end;