发明内容
本发明克服了上述问题,并且通过提供了用于提供在线随机性测试的方法和设备而提供了更多优点,以确保所生成的随机数较不容易被未授权方进行加密分析。
依照本发明的一方面,提供了用于测试随机性的方法。所述方法包括以下步骤:生成随机二进制比特的连续流;将生成的随机比特应用于指数单比特游程频率运算中,以计算单比特游程长度值范围的平均单比特游程频率值;并且,通过比较指数单比特游程频率运算的输出与预定验收范围(acceptance range)来确定生成的随机比特是否是充分随机的,其中所述指数单比特游程频率运算涉及识别在一行中具有全部为0或者1的比特子序列之一的多个子序列。所述方法还包括以下步骤:当任何平均单比特游程频率值重复地超出(falloutside)预定验收范围达预定次数以上时,确定生成的随机比特是不充分地随机的;当任何平均单比特游程频率值重复地超出预定验收范围达预定次数以上时,通知生成的随机比特是不充分地随机的;当任何平均单比特游程计数重复地超出预定验收范围达预定次数以上时,生成一个新的随机二进制比特组;并且,当确定生成的随机比特是不充分地随机之时,拒绝生成的随机比特用于后续的应用。
依照本发明的另一个方面,提供了一种用于评估随机数生成器生成的随机数的方法。所述方法包括以下步骤:(a)利用随机数生成器生成随机比特流;(b)将生成的随机比特应用于单比特游程长度运算;(c)将单比特游程长度运算的输出应用于指数平均,以获得单比特游程长度范围的平均单比特游程频率值;(d)比较平均单比特游程频率值与预定验收范围;以及,(e)确定任何平均单比特游程频率值是否超出预定验收范围达预定次数以上。所述方法还包括以下步骤:重复步骤(a)-(e),直到任意平均单比特游程频率值都超出预定验收范围;当重复步骤(a)-(e)达预定次数以上时,通知生成的数字是不充分地随机的。当任何平均单比特游程频率值超出预定验收范围达预定次数以上时,认为生成的随机比特是不充分地随机的。
依照本发明的再一方面,提供了一种用于评估由随机数生成器生成的随机数的设备。所述设备包括:用于生成包括二进制比特的随机序列的装置;用于根据指数单比特游程频率运算来检测所生成的随机序列是否是不充分地随机的装置;以及,用于当确定所生成的随机序列是不充分地随机之时,为后续的应用控制所生成的随机序列流的装置,其中执行所述指数单比特游程频率运算,以便对所生成的随机序列计算单比特游程长度范围的平均数单比特游程频率值,并且其中,如果指数单比特游程运算的任意输出重复地超出预定验收范围达预定次数以上,那么确定所生成的随机序列是不充分地随机的。所述设备还包括用于当任意平均单比特游程频率值重复地超出预定验收范围达预定次数以上时,发送所生成的随机序列是不充分地随机的报警信号的装置,以及用于当任意平均单比特游程频率值重复地超出预定验收范围达预定次数以上时,生成一个新的随机比特组的装置。
又一个方面在于:本发明可以为特定应用来根据需要依照硬件、软件或者硬件和软件的组合来实现。
此外,本发明能够以简单、可靠并且廉价的设备来实现。
当结合附图阅读以下详细说明时,这些及其他优点将对所述领域技术人员变得更加显而易见。
实施例详述
在随后的描述中,为了说明的目的而不是限制,叙述了特定细节,诸如特定体系结构、界面、技术等,以便提供对本发明的彻底的了解。然而,对于本领域技术人员显而易见的是,本发明可以依照脱离这些特定细节的其他实施例实施。为了简明并且清楚,省略了对众所周知的设备、电路以及方法的详细说明,免得因不必要的细节而使本发明的描述模糊。
图1举例说明了依照本发明示范性实施例的随机数生成系统10的简化框图。系统10包括随机数生成器(RG)12,检测器14和开关16。应注意的是,术语“随机数”指的是任何二进制信号序列,高斯型曲线或者信号的任何其他分布,表示0和1之间的数的信号序列,表示十进制数的信号序列,或者包括所希望的随机性的任何其他形式。
在操作中,RG 12可操作来输出一连串随机数。应该注意的是,此公开内容中的RG 12指的是任何可以生成信号的设备,所述信号可以依照任何常规的或者非常规的方式转换为二进制比特序列。当生成随机数时,检测器14依照预定标准(稍后解释)检测RG 12是否生成充分随机的序列。当检测器14认为所生成的随机数是不充分地随机之时,开关16停止所生成的随机数流。然而,如果确定它们是真随机的,那么开关16允许所生成的随机数字用于后续的应用,诸如任何电路、系统、处理、投机应用、模拟、统计抽样、Diffie-Hellman密钥交换等等,这些使用由RG 12提供的随机数。由此,开关16可以表示到加密系统,音频或者视频噪声发生器,计算机程序或者其他设备和过程的输入。
现在,参照图2和3,就确定所生成的随机数是否是充分地随机的而进行详细描述。
参照图2,依照本发明实施例,当RG 12处于运行中时,实时地测试随机数,以确保所生成的随机数是充分地随机的。在运行中,由RG 12生成随机比特的连续流。同时,检测器14计算随机比特流的单比特游程频率。特别地,检测器14检测长度k的全部子序列,在一行中具有0或者1的子序列。在检测模式期间,每当生成新的随机比特时,就检验该新比特是否继续在前的单比特游程。如果所述新比特不同于在前的比特,那么确定游程长度k。例如,如图2所示,当生成随机比特的连续流时,三个连续的0的S3(由P6、P7和P8表示)以及四个连续的1的T4(由P2、P3、P4和P5表示)可以由检测器14观察到。
在所述实施例中,单比特游程计数过程连续地运行。照此,必须周期地清除计数器或者累加器A以避免溢出。为此目的,在本发明中,使用了指数平均,其中在执行计数加法以前,累加器A以一确定的0<α<1因子而减少,因此,它永远不会变得太大。也就是说,为了节省存储和执行时间,在本发明中应用了对自相关计算的指数平均。指数平均具有这样的属性,每当在累加器A中更新平均数时,旧的平均值将具有减小的效果。应该注意的是,存在各种计数法,它们可以依照本发明的技术实现;然而优选的是,使用指数平均,如下所述。
所述指数平均依照下列方式工作。每当读取数值b时,将0和1之间的系数α(0<α<1)乘到累加器A,然后将b与之相加:Anew=α·Aold+b。为了具有有用的平均效果,α的值选择为接近1,α=1-1/n,n>>1。在该情况下,loga≈-1/n和平均比特的半衰期是k≈n·log2≈0.30103·n。在n步骤之后,最旧的平均值的权重变成(1-1/n)n≈1/e≈0.367879。这里,e是自然对数的底数(欧拉常数),如此可以将项n称为平均值的自然寿命。如果将平均的全部值是1,那么累加器的值是1+α+α2+...=1/(1-α)=n,而如果全部比特是0,那么累加器的值是0。应注意的是,指数平均的预期值是各个随机变量的期望值的指数平均。如果它们是均匀分布的二进制比特,则预期值是1/2+1/2α+1/2α2+...=n/2。
如上所述,当累加器以确定的0<α<1因子而减少时,指数平均用作清除计数器;由此在操作模式期间,累加器决不会变得太大。一旦为每个累加器执行指数平均,则将指数平均的值与预定验收范围相比较。也就是说,通过比较每个累加器的值与预定验收范围值,确定生成的随机数模式是否是充分地随机的。如果在平均处理过程期间、任何累加器的值都超出预定范围值,那么可以推断所生成的随机数往往不是不可预知的。这里,可以设置阈值,当测试重复失败时通知用户。
为帮助理解推导预定验收范围,使用了以下数学式。在长度为n的所有2n比特序列的列表中,存在2n-k-2个全部是‘0’的长度k的子序列,其起始于任意的固定比特位置2,3,...,n-k。由此,在长度n的一些比特序列中,存在比特‘0’的(n-k-1)·2n-k-2可能的长度k的游程。在一些长度为n的比特序列的开始,存在2n-k-1个全部为‘0’的子序列。最后出现相同数目的子序列,其合计达到2n-k。同时,如果k≤n-2,那么在长度n的比特序列中,存在比特‘0’的(n-k+3)·2n-k-2个长度k的游程。如果k=n-1,那么存在两个这种子序列,并且如果k=n,只存在一个这种子序列。如果k足够小,那么游程的数目可以大于长度n的序列的数目。应注意的是,对于比特‘1’的长度k的游程的数目同样如此。
检查n个比特,比特‘0’的k长度游程的期望值是(n-k+3)/2k+2,与比特‘1’的k长度游程的期望值相同。因此,可以通过设置以(n-k+3)/2k+2为中心的边界来选择预定验收范围。由此,外边界可以表示为[(n-k+3)/2k+2-α,(n-k+3)/2k+2+b]。根据从与已知的、良好资源的随机数的大量模拟中获得的数据可以有选择地调节确切的边界,其中可以获得理想的单比特游程的频率。这种随机序列可以购买到,并且例如可以从各种网络资源下载,包括“www.fourmilab.ch/hotbits”和“lavarand.sgi.com”。由此,操作者有选择地设置用于测试的实际范围,以便就所生成的随机序列是否可被未授权方预测而言,可以选择不同的灵敏度。
图3是举例说明依照本发明实施例测试随机序列统计质量的操作步骤的流程图。矩形单元表明计算机软件指令,而菱形单元表示影响由矩形方块表示的计算机软件指令的执行的计算机软件指令。作为选择,处理和判定块表示由功能等效电路执行的步骤,所述电路诸如数字信号处理机电路或者专用集成电路(ASIC)。应该注意的是,诸如循环和变量的初始化的许多例行程序单元和临时变量的使用没有示出。本领域中普通技术人员将理解的是,在此除非另有说明,否则描述的步骤的特定顺序只是说明性的,并且可以变化,而不脱离本发明的精神。
在步骤100,对随机数生成器12生成的随机二进制比特的连续流进行随机性测试。在步骤120,生成的随机比特受到单比特游程确定处理,然后将单比特游程的长度k存储在累加器中。每当发现单比特游程时,更新一组指数平均单比特游程频率值,其计数特定单比特游程的长度已经出现的频率。全部指数平均单比特游程频率值都减小因子α(0<α<1),而只有对应于单比特游程长度k的那个加1。
在步骤140,在每个累加器中执行指数平均运算,以便旧的平均单比特游程频率值将具有减少的效果。在步骤160,将指数平均运算之后的平均单比特游程频率值与它们相应的预定验收范围相比较。如果每个累加器A中任意的值超出预定验收范围,那么在步骤200确定已经检测到在真随机序列中不期望的这种模式,并且计数器加1。否则,在步骤180重置计数器,并且返回到步骤100,以进一步处理随机数。在步骤220,如果计数器的值大于阈值,那么在步骤240发送所生成的随机数不是充分地随机的通知。作为选择,可以置开关16无效,以便为后续的应用停止随机数流,或者可以丢弃所生成的随机数,并且在步骤240,可以开始生成新的随机数的整个处理过程。最后,如果在步骤220计数器的值没有超过阈值,则处理过程返回到步骤100。
如上所述的各种步骤可以通过将它们编程为函数,且并入应用程序内来实现,并且本领域的普通程序员可以利用惯用的编程技术来实现,例如使用C、Visual Basic、Java、Perl、C++等等来实现。在示范性实施例中,在图3中描述的方法可能如下构造(利用C程序设计语言)。为简单起见,我们利用浮点运算实现测试。
Appondix:MS Visual C code
/******************************************************************\
* RunFreq.c
* RunFreq<#random bits><bit generator type><bit generator param>
* 生成测试位
* 0或1的所有K-游程的指数频率(K=2..8)
* 打印测试统计
* Rem:使用浮点运算
* 遵循把Bit Avg.c转换到固定点的例子
* 如果总和只是在每第k次迭代才被减少,则就达到了长度l
* RunFreq 3e7 0 0.5 ->
* 没有更大的游程偏置
* 101.595 155.876
* 96.4734 158.746
* 96.3919 160.404
* 96.9115 160.165
* 101.7 160.119
* 99.1938 160.788
* 104.392 158.286
* 97.374 160.544
*
* 版本.1.0 04/17/01;由Laszlo Hars创建
*
\******************************************************************/
#include<stdio.h>
#include<stdlib.h>
#define MAXFULLRUN 10
#define MAXRUN2(MAXFULLRUN-2)
#define MAX(A,B)((A)>(B)?(A):(B))
#define MIN(A,B)((A)<(B)?(A):(B))
<!-- SIPO <DP n="7"> -->
<dp n="d7"/>
//外部函数原型
void BitGenInit(int argc,char*argv[]);
unsigned int NextBit();
int main(int argc,char*argv[])
{
int b0,b1,rl,i,j,n=(int)atof(argv[1]);
double
a[MAXRUN2]={125.0,125.0,125.0,125.0,125.0,125.0,125.0,125.0},//ideal past
l[MAXRUN2]={95.00,95.00,95.00,95.00,95.00,95.00,95.00,95.00},//LO limit=
ideal/1.32
h[MAXRUN2]={165.0,165.0,165.0,165.0,165.0,165.0,165.0,165.0},//HI limit=
ideal*1.32
x[MAXRUN2]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},// 调试用最大值,求值
y[MAXRUN2]={1e9,1e9,1e9,1e9,1e9,1e9,1e9,1e9}, // 调试用最小值,求值
w[MAXRUN2]={0.99609375,0.998046875,0.9990234375,0.99951171875,
0.999755859375,
0.9998779296875,0.99993896484375,0.99993896484375};// 乘
=1-1/2^(8..14,14)
if(argc<4){
printf(″Usage:RunFreq<#random bits><bit generator type><bit generator
params...>\n″);
putchar(′\a′); // 振铃
exit(1);}
BitGenInit(argc,argv);
b0=NextBit();
rl=-1; //rl=0:runlength=2
for(i=1;i<n;++i){
b1=NextBit();
<!-- SIPO <DP n="8"> -->
<dp n="d8"/>
if(b0==b1){++rl;continue;}// 一个游程之内{这里能够检查游程是否太长}
if(rl<0){b0=b1;continue;}// 太短的游程
rl=MIN(rl,MAXRUN2-1); // 把所有长的游程聚在一起
for(j=0;j<MAXRUN2;++j){
a[j]=a[j]*w[j]+(j==rl);
x[j]=MAX(a[j],x[j]);// 用于调试,赋值
y[j]=MIN(a[j],y[j]);// 用于调试,赋值
if(a[j]<l[j]‖a[j]>h[j]){
printf(″Too large bias of %d-run of bits %d at bit %d\n″,rl+2,b0,i);
exit(2);}
}
b0=b1;
rl=-1;
}
printf(″No large bias of runs\n″);
for(j= 0;j<MAXRUN2;++j)printf(″%g %g\n″,y[j],x[j]);//显示调试结果,赋值
}
虽然已经举例说明并且描述了本发明的优选实施例,但是本领域技术人员可以理解的是,在不脱离本发明的真正范围的情况下,可以作出各种改变和修改,并且对本发明的单元进行等效代替。具体来讲,除了指数平均,还可以使用其他类型的普通平均、分组平均值、重启平均等等。另外,在不脱离本发明的中心范围的情况下,可以作出许多修改来适用于特定情况和本发明的讲授。因此,不能将本发明限制为依照用于执行本发明的最佳方式公开的特定实施例,而是本发明包括属于所附权利要求书的范围内的所有实施例。