一种真随机数组产生新思路探索与实现.docVIP

一种真随机数组产生新思路探索与实现.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一种真随机数组产生新思路探索与实现

一种真随机数组产生的新思路探索与实现   摘 要:本文首先介绍了用真随机数做密钥的加密,并对真随机数加密的优缺点进行了分析,然后提出了产生真随机数组的新思路“序列数交换法”,在计算机上模拟实现了这种方法,并对这种方法的优缺点进行了简要分析。   关键词:真随机数;加密;序列数交换法      一、 引言      用真随机数做密钥的加密称为真随机数加密,加密很简单但需要和明文字节数一样长度的真随机数字节,然后一对一的顺序相加或者异或起来就完成了加密。解密则是做加密的逆运算[1]。如此可见如果真随机数是现成的,由于运算简单在加密、解密速度上是顶级的。   明文、密文、密钥的完整性检验,可以设置效验码,通过检测效验码来判断信息是否完整,效验码也需要保密[2]。   真随机数加密的麻烦是密钥太长,它和明文的长度相同。现在单独的密文是安全的,即使动员无限的计算能力和用无限的时间对它的解密也徒劳的[3]。现在需要保密的是密钥,虽然它不包含任何信息,但如果它和被加密文件在一起,如同展示了明文。所以绝对不能让窃密者同时得到密文和密钥。密钥很长不可能被使用者记住,所以密钥的保管,比小密钥麻烦的多。如果用于通讯,还有密钥的传递问题。   为了不让窃密者得到密钥,需要对密钥进行加密,这种加密可以用简单的方法,例如随机加密,破解者甚至无法判断解密是否成功。这样就可以在掌握少量的密码的情况下掌握着大量的秘密了。   以往真随机数加密,因为比较笨重,只用在对极其重要的信息加密。由于计算机及网络的速度的不断增进和存储空间的越来越廉价,使用真随机数加密也不是什么奢侈的事情。相信会使用在越来越多的地方。      二、用“序列数交换法”产生真随机数组      “序列数交换法”是将有规律的数组,通过任意交换数组的序列号,而形成随机数的方法。   理论根据是热力学第二定理的推论“熵增加原理”,在自然作用下,从有序到无序是不可逆过程[4]。例如你整天洗纸牌,也不可能有一天发现是一顺的了。墨水滴到水盆里会逐渐扩散,如果你搅动则会加速扩散,再也没有机会聚成一滴了。   “序列数交换法”的物理模型是:将有规律的数组,例如载体可以是大小一样颜色不同的小球,不同颜色代表不同的元素,放到一个滚筒里,滚动均匀,然后一个个拿出来排列,就得到了新次序下的随机数组。      三、计算机模拟实现      现在用计算机来模拟这个过程。以ASCII码组成的数组为例(这在计算机是最基础的,以字节为单位),我们的元素是 0 ~ 255 的数字,共有 256个。   例如造一个有2560个元素的随机数列:   1) 先做一个数值由零到255的循环数列,长度为2560(现在数组周期为256);   2) 随机抽取两的序号使它们的数值交换;   3) 使 2)进行足够多次,检测其效果,直到满意为止。   下面用 C++语言来实现。只写出关键部分。   #define NN 2560 //数组长度   unsigned int k;   unsigned char *str; //定义数组指针   unsigned char ch;   unsigned int n1=0;   str = new unsigned char[NN+1]; //借用内存   for(k=0;kNN;k++)   str[k]=k%256; //形成序列数组   rand(GetTickCount()); //用运行时间做rand()函数的种子   for(k=0;kNN;k++)   { n1=(rand()+k)%NN; //随机生成序号以便交换   if(n1= =k)   goto xia; //序号相同不处理   else   { ch=str[n1]; //数值交换   str[n1]=str[k];   str[k]=ch;   }   xia:;   }   delete[] str; //退还内存   以上程序,借助一个随机函数 rand() 来完成挑选交换目标序号的工作,rand() 实际也对应序号从0到NN-1的数组,只不过表现形式比较怪异,我们称此数组为“捡选数组”。此段程序将有序的数组str[]从头到尾处理了一遍。形象的说就是处理了一次或搅动了一次。如果选择的随机函数比较优秀,一次搅动,可以使数组具有随机数组的统计特性,如果用几个好的随机函数,多做几次可能效果更好。如果随机函数不好,多次也能达到目的。   试验证明随机函数在这里不是必需的。用开始形成的序列数组str[]取代rand()作为“捡选数组”,以后每次用上次生成的str[]数组作为“捡选数组”,这样经过多遍处理后也可以形成真随机数组,

文档评论(0)

erterye + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档