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