一种流密码密钥流生成器的模块化设计与实现

时间:2011-01-18

     1 引言

  流密码也称序列密码,它是对称密码算法的一种,具有长度可灵活变化,加解密速度快、复杂度低的特点。流密码采用逐个字符加解密的策略,不需要缓存,同步流密码还可以实现无错误扩散。

  在高保密强度要求的场合,密多采用“一密”的流密码体制。流密码的设计通常采用多重密钥、多重环节、多重安全措施等技术,达到“一密”、终靠密钥保密的目标。鉴于流密码系统存在多重相似运算过程,在部分———密钥生成器设计可以采用模块化复用的设计方法,通过程序共用、时分复用,实现精简程序、节省芯片资源、降低功耗。

  2 密钥生成算法简介

  流密码加解密系统通常由密钥管理模块、密钥流发生器和流密码的加解密运算模块组成。在文献中采用了一种Geffe 发生器串接单向陷门的Hash 函数的方式,如图1 所示,生成超长周期的伪随机序列,密钥的强度依赖于Hash 函数,使通过终输出的流密码码字逆向得到Geffe 发生器的内部状态的难度大大增加,从而保证了此密钥流发生器的安全性。文献中提到可采用多组Geffe 序列生成器并行来提高Geffe 发生器的输出速度,但我们在实际设计中发现组数过多则大大增加运算复杂度,密钥强度降低,本文采用2 组数Geffe 发生器并行结构,获得了较好的效果。

 密钥生成基本流程

图1 密钥生成基本流程

  初始密钥经过运算产生数据密钥,数据密钥发生器输出生成密钥流,数据密钥即时产生即时销毁。

  为了提高密钥安全性和破解难度,通常选取舍弃若干长度密钥流序列。随机数可以称为公钥,由加密系统随加密数据帧传递给解密系统,为验证随机数的正确性,加密系统会将摘要随随机数同时传递给解密系统,解密系统根据接收到的随机数与预置的种子密钥产生本地摘要,并与接收到的摘要进行对比,以确认随机数的正确与否。摘要由初始密钥确定,对初始密钥通过Hash 函数而产生。

  采用二级密钥模式———即种子密钥和数据密钥,对密钥进行管理。其中,数据密钥即上文所说的密钥流发生器的输出密钥,一般在每次通信时临时产生,通信结束后被销毁。种子密钥是初始密钥的加密密钥,在通信前通过安全渠道共同确定,并长时间存在。考虑到硬件实现过程中的通用性,由种子密钥产生初始密钥的方式如图2 所示。

初始密钥生成方法

图2 初始密钥生成方法。

  其中,随机数是打包在加密流中传输给解码端的,解码端得到此实时采集的随机数之后,通过上述运算得到数据密钥,由此完成数据密钥的交换。这种方式的采用,将为下一步设计工作中实现模块复用、节约资源提供了可能。

  3 算法设计与实现

  流密码系统仅需密钥保密,一个流密码是否具有很高的密码强度主要取决于密钥流生成器的设计,因此密钥流产生器是加解密系统的。

  在流密码系统中,加解密系统的诸多环节,如初始密钥生成、摘要生成、密钥流产生等,若要针对不同功能分别编写各自的程序代码,将会占用大量的Slice 资源,造成FPGA 资源的极大浪费,不便于控制成本。上述环节均采用同样的Geffe 和Hash 函数,实现过程则会非常相似,方案就可以采用模块化设计思想,将相近的措施和环节模块化,利用状态机来实现各个模块之间的状态转换和进程控制,以实现这些功能模块的统一处理,从而提高硬件资源的利用率。

  3. 1 密钥生成控制模块

  密钥生成控制模块为密钥生成模块提供输入接口和状态控制,包括初始密钥生成、初始密钥滚动、密钥舍弃、摘要生成和密钥流产生等工作,以状态机的形式来描述和实现,如图3 所示。

密钥生成控制模块状态转换图

图3 密钥生成控制模块状态转换图

  密钥生成控制模块的状态机共包括5 种状态,其中状态4 为空闲状态,状态0 是初始密钥生成状态,状态1 是密钥舍弃状态,状态2 是密钥产生状态,状态3 是摘要生成状态。

  当没有任何外部激励信号或者密钥生成模块停止工作的时候,处于空闲状态,而一旦接收到外部激励信号,立即转入相应的状态处理程序。

  当种子密钥和随机数准备好,并接到生成初始密钥的通知( EncPrmKeyEn = 1) 时,密钥生成控制模块由空闲状态转入状态0,启用初始密钥生成功能,当初始密钥生成完毕后,立即转入状态1,密钥舍弃功能启动,密钥舍弃完毕后,发出工作完成标志( KeyStrmOV = 1) ,通知状态机重新进入空闲状态。

  当密钥生成控制模块接收到生成摘要的通知后( AbstGenDe = 1) ,即刻转入状态3,摘要生成功能生效,当摘要生成完毕,发出结束标志( KeyStrmOV =1) ,通知密钥生成控制模块摘要已生成,可以转入空闲等待状态。

  当外部激励信号变成密钥生成的通知( EncKeyGenEn= 1) 时,密钥生成控制模块由空闲状态转入状态2,进入密钥生成模块的密钥产生功能,生成完一组密钥后,同样会使密钥生成控制模块转入空闲状态。

  3. 2 密钥生成模块

  密钥生成模块实现的功能包括初始密钥生成、初始密钥滚动、摘要生成、密钥生成和密钥舍弃。借鉴编程语言中的函数共用思想,将密钥生成模块划分为复位子模块、初始化子模块、Geffe 子模块和Hash 函数模块四个部分,如图4 所示。

密钥生成模块流程简图

图4 密钥生成模块流程简图

  在密钥生成模块使能信号无效,即密钥生成控制模块处于空闲状态时,密钥生成模块一直处于复位状态,模块的各参数均被恢复为初始值,此即为复位子模块; 一旦密钥控制模块处于非空闲状态时,首先会进入初始化子模块,该模块会根据接收状态的不同对模块的各参数实施不同的初始化,包括根据随机数和种子密钥初始化初始密钥发生器的Geffe中各m 序列发生器的状态和本征多项式,或根据初始密钥来初始化密钥流发生器的Geffe,或读取密钥流发生器上的Geffe 状态和本征来初始化Geffe,或读取初始密钥初始化Hash 函数的输入,以及Geffe子模块和Hash 函数中所使用到的各寄存器等等。初始化过程完毕后,Geffe 子模块启动( 生成摘要时,将跳过Geffe 子模块直接进入Hash 函数子模块) ,生成启动Hash 函数子模块所需要的输入数据,并在Geffe 子模块停止工作时存储Geffe 的终状态和本征多项式以便下次启动Geffe 时能够正确实施初始化。一旦Geffe 子模块输出Hash 函数所需要的数据,Hash 函数子模块即可被启动( 当接收状态为密钥舍弃时,无需再启动Hash 函数,可以直接退出) ,根据接收状态的不同,生成初始密钥、摘要或者数据密钥,并存储到不同的存储区域,以用于Geffe 初始化、摘要验证和数据加解密。

  在进入状态3 时,启动摘要生成功能,若初始密钥比特数不足启动Hash 函数需要的输入长度h,则必须对初始密钥进行扩展至h。

  对于Hash 函数子模块的实现,可采用流水操作。如果采用串行方案,需要时钟通常会超过Geffe的主时钟总数g,造成Hash 函数无法与Geffe 同步运行。如果Geffe 和Hash 函数串行运行,产生一帧明文/密文数据的密钥所需要的时钟往往会远大于一帧数据所占用的主时钟个数,无法实施密钥的生成。

  Hash 函数一般是将给定的输入m 分成若干个分组{ m1,m2,…mk} ,并以迭代的方式,逐组处理,因此可以考虑采用流水操作来减少Hash 函数子模块的运算时间。以Hash 函数采用MD5 为例,对于MD5 子模块的实现,采用流水操作便可满足上述条件。

MD5 内部运算流水操作过程

图5 MD5 内部运算流水操作过程。

  设密钥生成模块开始有n 个主时钟的初始化过程,Geffe 串行连续运行g 次,Geffe 每运行就启动Hash 函数( 摘要生成和密钥舍弃除外) ,Hash 函数随下一个Geffe 同时启动。这使Hash 函数的运行时间要小于Geffe 的运行时间,因此Hash 函数可以与Geffe 并行工作而不会影响下的Hash 函数运行,而且每次Hash 函数结束后会有若干个主时钟来完成Hash 函数运算结果的存储工作。当g 次Geffe 运行完毕后,紧接着是若干个主时钟的Geffe 存储工作,而Hash 函数也随Geffe 存储工作的开始而开始。这种时序关系能有效避免Geffe 的等待,提高工作效率。

  4 结束语

  在该流密码加解密系统中,在对部分—密钥生成器进行实现时,充分运用模块化复用思想,通过函数体共用、时分复用和流水操作等方法,使程序设计得到了精简,程序的可移植性增强,减少了硬件资源占用,有效降低了功耗,在实际应用中效果明显。


  
上一篇:总线技术在LED亮化工程中的应用
下一篇:UHF RFID阅读器基带处理接收端电路的设计

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料