去年做的密码学开发实践,其实这东西看穿了也没啥难的,别看题目起的多吓人,其实程序是简单的很,哈哈,今天懒得打字了,直接把当时的课程设计报告部分内容copy过来吧。
设计背景
随机数在密码学中起着极其重要的作用,例如在相互认证、产生密钥等的过程中都需要使用高强度的随机数来保证安全。所谓的高强度就是指随机数序列需要满足随机性和不可预测性。
真正的随机数实际上是难以获得的,因此通常意义上我们使用的都是伪随机数,但如果算法设计的好,伪随机数也可以通过各种随机性检验。
基于ANSI X9.17的伪随机数产生器是密码强度最高的伪随机数产生器之一,目前已经在包括PGP等许多应用中被采纳。
设计目的
该例是应用密码算法程序设计的课程设计,要求在深入理解ANSI X9.17随机数产生的流程基础上,使用一种编程语言实现一个基于ANSI X9.17的随机数发生器。
要求生成的随机数长度为1024比特,使用十六进制表示时为128字节;并且要求拥有良好的用户界面,使用户可以很快上手,易学易用。
理论知识介绍
ANSI X9.17标准是美国国家标准化协会制订的金融机构密钥管理规范;ANSI(美国国家标准化协会)负责金融安全的小组是ASC X9和ASC X12。其中ASC X9负责制定金融业务标准,ASC X12负责制定商业交易标准。其中ANSI X9.17标准制定于1985年,对金融机构的密钥管理进行了规范。
在多数情况下,我们都是使用某种特定的密码算法来辅助完成随机数的产生,ANSI X9.17也不例外,它的算法就是基于大名鼎鼎的DES(数据加密标准)。
数据加密标准(Data Encryption Standard,DES)是迄今世界上最为广泛使用和流行的一种分组密码算法,它的分组长度为64比特,密钥长度为56比特,它是由美国IBM公司研制的,源于早期的一种被称为Lucifer密码的发展和修改。
DES是一个迭代型的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用16个循环。
为了提高安全性,通常人们并不使用单纯的DES,而是将DES算法在多密钥情况下多重使用,例如两个密钥的三重DES。此方案已经被证明了是行之有效的,已在密钥管理标准ANSI X9.17和ISO 8732中被采用。
关于DES的详细计算过程就不说了,下图是ANSI X9.17的实现逻辑:
在上图中的EDE表示两个密钥的三重DES算法;产生器主要有3个组成部分。
1) 输入 输入为两个64比特的伪随机数,其中DTi表示当前的日期和时间;每产生一个数Ri后,DTi都会更新一次;Vi是产生第i个随机数时的种子,其初值可任意设定,以后每次都会自动更新。
2) 密钥 产生器使用了3次三重DES加密,3次加密使用相同的两个56比特密钥K1和K2,这两个密钥必须保密且不能用作他用。
3) 输出 输出为一个64比特的伪随机数Ri和一个64比特的新种子Vi+1。