本发明涉及汽车领域,具体涉及一种生成伪随机数种子的方法。
背景技术
计算机或计算器产生的随机数有很长的周期性。它们不真正地随机,因为它们实际上是可以计算出来的,但是它们具有类似于随机数的统计特征。这样的发生器叫做伪随机数发生器。
在实际应用中往往使用伪随机数就足够了,这些数列是“似乎”随机的数,实际上它们是通过一个固定的、可以重复的计算方法产生的。
在车辆中,电子控制单元ecu(electroniccontrolunit)通常也使用rand()函数生成的种子,实际是一串固定的随机数列,而每次ecu复位过后,产生的种子都是固定的一串数字,虽然看似种子都是随机的数字,但是每次都是一样的值,例如ecu复位后,通过记录前面几次的安全算法通信数据,然后重复复位,发送相同的数据,即可获取ecu诊断的权限,从而获取ecu内部数据,这种伪随机的机制容易被破解,存在一定安全隐患。
技术实现要素:
针对现有技术中存在的问题,本发明要解决的问题是提供一种生成伪随机数种子的方法,通过引入随机因子与操作函数f,利用生成的伪随机数r,生成伪随机数种子,以保证生成的伪随机数种子的随机性,从而保证安全性。
本发明提供一种生成伪随机数种子的方法,包括以下步骤:
-获取要生成的伪随机数种子s的字节数sn;
-使用伪随机数生成函数生成字节数为sn的伪随机数r;
-获取操作组的字节数bn,sn为bn的整数倍;
-伪随机数r与伪随机数种子s中包括sn/bn个对应的操作组,从伪随机数r中取一个操作组,结合随机因子e,利用操作函数f,计算伪随机数种子s的对应操作组,直至所有操作组已完成操作。
进一步地,从伪随机数r与伪随机数种子s的一端开始依次操作,直至所有操作组已完成操作。
进一步地,随机因子e的字节数为bn或sn。
进一步地,随机因子e的字节数为bn,从伪随机数r与伪随机数种子s的左端开始依次操作,计算伪随机数种子s的对应操作组:
s[bn*i+j]=f(e[j],r[bn*i+j]),
其中i为操作组编号-1,j用于表示操作组中的相应字节。
进一步地,随机因子e的字节数为sn,从伪随机数r与伪随机数种子s的左端开始依次操作,计算伪随机数种子s的对应操作组:
s[bn*i+j]=f(e[bn*i+j],r[bn*i+j]),
其中i为操作组编号-1,j用于表示操作组中的相应字节。
进一步地,随机因子e从当前时间或者模数转换器的输出信号获得。
进一步地,操作函数f为位操作或多种位操作的组合。
进一步地,对于各个操作组的操作,采用相同或不同的操作函数f。
进一步地,操作组的字节数bn为4。
进一步地,所述方法包括以下步骤:
-任选伪随机数种子s的一个字节中的两位,保持二者互斥。
与现有技术相比,本发明提供的生成伪随机数种子的方法,具有以下有益效果:通过引入随机因子与操作函数f,利用生成的伪随机数r,生成伪随机数种子,以保证生成的伪随机数种子的随机性,从而保证安全性。
附图说明
图1是本发明的一个实施例的伪随机数r、随机因子e及伪随机数种子s的示意图;
图2是伪随机数r、随机因子e及伪随机数种子s的示意图;
图3是本发明的一个实施例的生成伪随机数种子的方法的流程图;
图4是另一个实施例中伪随机数r、随机因子e及伪随机数种子s的示意图。
具体实施方式
本发明的一个实施例的生成伪随机数种子的方法,包括以下步骤:
-获取要生成的伪随机数种子s的字节数sn;
-使用伪随机数生成函数rand()生成字节数为sn的伪随机数r;
-获取操作组的字节数bn,sn为bn的整数倍;
-伪随机数r与伪随机数种子s中包括sn/bn个对应的操作组,从伪随机数r中取一个操作组,结合随机因子e,利用操作函数f,计算伪随机数种子s的对应操作组,直至所有操作组已完成操作。
本实施例中,伪随机数种子s的字节数sn为16字节,操作组的字节数bn为4字节,sn为bn的整数倍–4倍,如图1所示。
伪随机数r与伪随机数种子s中包括sn/bn个(4个)对应的操作组,如图3所示,具体地生成伪随机数种子的方法如下:
-获取要生成的伪随机数种子s的字节数sn=16;
-使用伪随机数生成函数rand()生成字节数为16的伪随机数r;
-获取操作组的字节数bn=4,sn为bn的整数倍;
-从当前系统时间获取随机因子e,随机因子e的字节数为bn=4;
-从伪随机数r与伪随机数种子s的左端开始依次操作,计算伪随机数种子s的对应操作组:
●取伪随机数r中的第1操作组,i=操作组编号-1=0,操作函数f为按位异或操作,
s[bn*i+j]=f(e[j],r[bn*i+j])-〉s[j]=f(e[j],r[j]),
其中,j=0,1,2,3,得到伪随机数种子s的第1操作组的各个字节,如图1所示;
●取伪随机数r中的第2操作组,i=操作组编号-1=1,s[bn*i+j]=f(e[j],r[bn*i+j])-〉s[4+j]=f(e[j],r[4+j]),
得到伪随机数种子s的第2操作组的各个字节,如图2所示;
●类似地,取伪随机数r中的第3操作组,…,直至所有操作组已完成操作。
在另一个实施例中,与前述实施例的区别在于:
-从模数转换器的输出信号获取随机因子e,随机因子e的字节数为sn=16;
-从伪随机数r与伪随机数种子s的左端开始依次操作,计算伪随机数种子s的对应操作组:
●取伪随机数r中的第1操作组,i=操作组编号-1=0,操作函数f采用按位与操作,
s[bn*i+j]=f(e[bn*i+j],r[bn*i+j])-〉s[j]=f(e[j],r[j]),
其中,j=0,1,2,3,得到伪随机数种子s的第1操作组的各个字节,如图4所示;
●取伪随机数r中的第2操作组,i=操作组编号-1=1,s[bn*i+j]=f(e[bn*i+j],r[bn*i+j])
-〉s[4+j]=f(e[4+j],r[4+j]),
得到伪随机数种子s的第2操作组的各个字节;
●类似地,取伪随机数r中的第3操作组,…,直至所有操作组已完成操作。
在又一个实施例中,还可以在对每个操作组进行操作时,从当前系统时间获取字节数为bn=4的随机因子e,以增强伪随机数种子s的随机性。
在又一个实施例中,从伪随机数r与伪随机数种子s的右端开始依次操作,当然也可以按照其他顺序对所有操作组进行操作,本发明对此不作限制。
在又一个实施例中,对每个操作组采用不同的操作函数f,例如对第1操作组操作时,操作函数f为按位或;对第2操作组操作时,操作函数f为按位异或;…,进一步增强伪随机数种子s的随机性。
在又一个实施例中,对于每个操作组中,操作函数f为多种位操作的组合,例如对于第1位采用按位与,第2位采用按位异或,…,进一步增强伪随机数种子s的随机性。
在又一个实施例中,生成伪随机数种子的方法还包括以下步骤:
-任选伪随机数种子s的一个字节中的两位,保持二者互斥。
这样可以保证获得的伪随机数种子s不是全1或全0,以增强伪随机数种子s的随机性。
虽然本发明已以较佳实施例披露如上,但本发明并非限定于此。任何本领域技术人员,在不脱离本发明的精神和范围内所作的各种更动与修改,均应纳入本发明的保护范围内,因此本发明的保护范围应当以权利要求所限定的范围为准。