Linux内核随机数产生器的设计与实现

Linux内核随机数产生器的设计与实现

关键字:Linux内核   随机数产生器     

  EDN博客精华文章  作者:bluehacker
       这几天抽了点时间看了看linux 2.6.10的代码,对里面的那个内核随机数产生器发生兴趣,花了点工夫分析了下,贴在这里灌水.

  --------------------------------------------------------------------------------------------

  随机数在许多领域都有重要应用,如Monte Carlo模拟、密码学和网络安全。随机数的质量直接关系到网络安全系统的可靠性和安全性,关系到 Monte Carlo模拟结果的可信度。自从计算机诞生起,寻求用计算机产生高质量的随机数序列的研究就一直是个长期受到关注的课题。Linux内核从 1.3.30版本开始实现了一个高强度的随机数发生器,本文根据Linux 2.6.10内核的源代码,详细分析该随机数产生器的设计与实现。

  1. 基本原理

  Linux内核采用来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。

  计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。

  内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。

  2. 设计与实现

  Linux 内核随机数产生器在/drivers/char/random.c中作为字符设备实现。在模块初始化函数rand_initialize()中调用 create_entropy_store()分别创建名为random_state的缺省熵池,一个名为sec_random_state和一个名为 urandom_state的熵池。熵池用struct entropy_store来表示。

  内核实现了一系列接口函数用于获取系统环境的噪声数据,并加入熵池,分别是:

  void add_interrupt_randomness(int irq);

  void add_keyboard_randomness(unsigned char scancode);

  void add_mouse_randomness(__u32 mouse_data);

  void add_disk_randomness(struct gendisk *disk);

  其中add_interrupt_randomness()函数利用设备两次中断的间隔时间作为噪声源将随机数据加入熵池。要使设备的中断作为系统噪声,必须用SA_SAMPLE_RANDOM标志注册其中断服务程序。这样,每当设备发生中断时,中断系统会自动调用 add_interrupt_randomness()将熵加入熵池。

  Add_keyboard_randomness()将按键的扫描码和两次按键之间的时间间隔作为噪声源;而add_mouse_randomness()则利用鼠标位置和连续两次鼠标中断时间间隔填充熵池;最后 add_disk_randomness()函数则以连续两次磁盘操作之间的间隔产生随机数。

  上面的函数最终都是通过调用 add_timer_randomness()函数将熵加入熵池的。Add_timer_randomness()首先估算所加数据的熵,再调用 batch_entropy_store()函数将数据加入熵池。为了避免中断的延迟过长影响系统性能,batch_entropy_store()并不直接将熵加入熵池,而是将其加入队列中。当队列长度达到一定长度后,由keventd内核线程通过调用batch_entropy_process()函数将队列中的熵加入池中。

  Batch_entropy_process()函数枚举队列中的每个熵,对每个熵调用 add_entropy_words()函数将其加入熵池,但它并不更新熵池的熵估算值。为此,batch_entropy_process()对每个熵调用完add_entropy_words()后,立刻调用credit_entropy_store()函数更新熵估算值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值