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

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

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

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

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

rdrand_16 取得16位随机数到aex寄存器,(看了一下intel开发手册似乎16位和32位随机数指令是一样的,该函数返回的其实是一个32位随机数,具体情况大家自行测试一下)。另外该函数内没有判断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;

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值