您的位置:首页 > 其它

Intel 第三代CPU酷睿处理器内置硬件随机数的获取方法

2014-09-12 15:28 399 查看
Intel在IVB架构的第三代CPU酷睿处理器(2012年开始生产)内置了一个利用电阻热噪声取得硬件真随机数的功能。

关于真随机数和伪随机数的区别,以及世上是否存在真随机数等哲学争论不在本文讨论范围。

下面给出delphi代码,一共4个函数,具体使用的是两个函数:

RdRand_isSupported 判断当前cpu是否支持该功能,

rdrand_16 取得16位随机数到aex寄存器,如果要取32位或者64位的随机数,请自行参考intel开发手册修改相应的指令。另外该函数内没有判断cpu是否支持该指令,所以请在程序开始阶段或者其他相应地方调用RdRand_isSupported来判断cpu是否支持该功能。

function GetCpuId(): UINT;

var

bException: BOOL;

//szCpu: array [0 .. 15] of BYTE;

uCpuID: UINT;

begin

Result := 0;

// ZeroMemory(@szCpu, sizeof(szCpu));

uCpuID := 0;

bException := true;

try

asm

mov eax, 1

cpuid

{ mov dword ptr szCpu[0], ebx

mov dword ptr szCpu[4], edx

mov dword ptr szCpu[8], ecx

mov eax, 1

cpuid }

mov uCpuID, ecx

end;

except

bException := false;

end;

if bException then

Result := uCpuID;

end;

function GetCpuName(): string;

var

bException: BOOL;

szCpu: array [0 .. 15] of BYTE;

// uCpuID: UINT;

begin

Result := '';

ZeroMemory(@szCpu, sizeof(szCpu));

// uCpuID := 0;

bException := true;

try

asm

mov eax, 0

//cpuid

db 0fh,0a2h

mov dword ptr szCpu[0], ebx

mov dword ptr szCpu[4], edx

mov dword ptr szCpu[8], ecx

// mov eax, 1

// cpuid

// mov uCpuID, edx

end;

except

bException := false;

end;

if bException then

begin

Result := StrPas(PAnsiChar(@szCpu));

end;

end;

function RdRand_isSupported: boolean;

var info: dword;

ss: string;

begin

ss:= GetCpuName;

if pos('Intel',ss)=0 then

begin

result:= false;

exit;

end;

info:= GetCpuId;

// showmessage(INTTOSTR(info));

if info and $40000000=$40000000 then

result:= true

else

result:= false;

end;

function rdrand_16: dword; //取得一个16位的随机数

asm

db $0f, $c7, $f0

end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: