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

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;

时间: 2024-10-13 16:11:59

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

页面静态化1---概念(Apache内置压力测试工具使用方法)

三个概念 ①静态网址: http://127.0.0.1/regis.html ②动态网址:在请求页面时可以动态的传一些值进去. http://127.0.0.1/regis.php?id=45&title=今天天气不错 ③伪静态网址: 伪静态仅仅是对动态网址的一个重写,伪静态网址不能让动态网址静态化,搜索引擎不会认为伪静态就是HTML文档,其次伪静态可取,但是应把重心放在取出冗余参数.规范URL,竟可能的避免重复也等等. 举例说明:http://v.youku.com/v_show/id_XM

基于内置类的原型扩展方法

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>基于内置类的原型扩展方法</title></head><body><script type="text/javascript"> var ary = [12, 23, 34, 12, 23, 34, 12, 23, 34, 12, 23, 34,

java web 程序---内置对象application的log方法的使用

application的主要方法里,有log方法,是日志文件里可以查看到信息的. 当老师写好代码后,他发现在tomact里的log目录下找不到信息,原因是:我们用myeclipse这个客户端软件,应该把服务器关闭,而是去bin目录下,手动开启服务器 即startup.bat.这个文件,然后在log目录下查到了信息: 这里有截图,我输入的用户名,这里当程序运行后是个空白页面,只有到log目录下才可以查看到信息. 代码: login.jsp ? 1 2 3 4 5 6 7 <body>     &

linux shell字符串内置的常用操作(获取长度、查找、替换)

在编写shell程序时,经常会涉及到字符串相关操作.有许多命令语句,如awk,sed都能够做字符串各种操作. 事实上shell内置一系列操作符号,能够达到相似效果,使用内部操作符会省略启动外部程序等时间,因此速度会很的快.如果内置的操作符能够做到的,优先使用内置的. 1 推断读取字符串值                                        

内置函数补充,__str__方法、__del__方法 和 __call__方法和元祖

一 .内置函数补充 1.isinstance函数: isinstance(obj,cls)检查obj是否是类 cls 的对象 使用该函数来判断一个函数的类型 2. issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object): pass class Bar(Foo): pass issubclass(Bar, Foo) 3.下述四个函数是专门用来操作类与对象属性的,如何操作? 通过字符串来操作类与对象的属性,这种操作称为反射 clas

JavaScript封闭函数、常用内置对象、js调试方法

1.封闭函数 封闭函数是JavaScript中匿名函数的另外一种写法,创建一个一开始就执行而不用命名的函数 /在封闭函数前加';',可以避免js压缩时出错/;(function(){ alert('hello world!'); })(); /*当i大于78时等于78,小于时等于89*/ var i = 90>78?78:89; alert(i); /*第二个写法*/ !function(){ alert('hello world!'); }(); /*第三个写法*/ ~function(){

python类和函数拾遗——继承、bif(内置函数)、魔法方法

函数在创建时有一些内置的方法,特殊情况下会使用到.一般被称为魔法方法 在此之前先记录一下类的进阶方法: class Fish(): def hello(self): print("Hello! I am a fish!") class Shark(Fish): def eat(self): print("鲨鱼吃各种鱼") 这样子的话如果shark1 = Shark()     我们调用shark1.hello() 会怎样呢? shark1 = Shark() sha

【python基础语法】常用内置函数、关键字、方法和之间的区别(小结)

''' 关键字: False:bool数据类型 True:bool数据类型 None:表示数据的内容为空 and:逻辑运算符:与 or:逻辑运算符:或 not:逻辑运算符:非 in:身份运算符,判断变量是否在序列中 is :成员运算符,判断变量是否为某个类的实例 del:删除变量或序列的值 assert:列表排序,默认从小到大排序,升序,加参数reverse=True,按降序进行排序 with:简化Python的语句 pass:表示通过(一般用来占位的) if elif else:条件判断 wh

Node.js中内置文件系统一些常用的方法总结

文件系统(fs) 首先引入内置模块:var fs = require("fs"); readFile 1.异步读取一个文件的全部内容:fs.readFile("./filename",[options],function(err,data){statements}) // fs.readFile('./88.txt','utf-8',function(err,data){ // if(!err){ // console.log("读取成功");