《中南大学现代密码学实验报告(共24页).doc》由会员分享,可在线阅读,更多相关《中南大学现代密码学实验报告(共24页).doc(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上现 代 密 码 学实 验 报 告学生姓名 代巍学 号 专业班级 信息安全1201指导教师 段桂华 学 院 信息科学与工程学院 完成时间 2014年5月实验一 对称密码算法实验实验目的1.掌握密码学中经典的对称密码算法DES、AES、RC4的算法原理。2.掌握DES、AES、RC4的算法流程和实现方法。实验预备1.DES算法有什么特点?算法中的哪些结构保证了其混淆和扩散的特性?2.AES算法的基本原理和特点。3.流密码RC4的密钥流生成以及S盒初始化过程。 实验内容1. 分析DES、AES、RC4、SHA的实现过程。2. 用程序设计语言将算法过程编程实现。3. 完成字符
2、串数据的加密运算和解密运算输入明文:Idolikethisbook 输入密钥:cryption 实验步骤1. 预习DES、AES、RC4算法。2. 写出算法流程,用程序设计语言将算法过程编程实现。3. 输入指定的明文、密钥进行实验,验证结果。4. 自己选择不同的输入,记录输出结果。写出所编写程序的流程图和运行界面、运行结果。一、DES算法1. DES算法及原理DES密码实际上是Lucifer密码的进一步发展。它是一种采用传统加密方法的区组密码。它的算法是对称的,既可用于加密又可用于解密。美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和19
3、74年8月27日先后两次向公众发出了征求加密算法的公告。加密算法要达到的目的通常称为DES密码算法要求主要为以下四点: 提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改;具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础实现经济,运行有效,并且适用于多种完全不同的应用。 目前在这里,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS
4、间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。 DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。 DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据
5、进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。 通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。 DES算法流程图子密钥产生流程图2.DES算法加密解密过程(1)加密过程。a.初始置换。DES的第一阶段包括64位分组的置换,改变每个分组中位的顺序。术语置换使用其严格的数学意义;只改变了顺序。这64位数据现在被分成两半:L0(左半部分)和R
6、0(右半部分)。下标0说明是原始的数据。在DES算法第二阶段的每次循环后,这些下标加1。 b.循环移位(16次)一种根据密钥,并且依赖于表格的算法。这种操作通常被称为数据移位。这个算法要重复16次,但由于每次移位都使用密钥的不同子分组,因此每次移位的操作各不相同。密钥的子分组由另一组表格和表格的移位算法来确定。在每次循环以后,L(左半部分)和R(右半部分)的下标依次加一。第16次循环的结果被称为预输出。c.逆置换DES的最后一个阶段包括64位分组的置换,改变每个分组中位的顺序,这与第1阶段的操作类似。这次置换的输出结果就是密文。(2)解密过程DES的解密过程和加密过程相同,只是在解密过程中将子
7、密钥的使用顺序颠倒。3. DES算法C+实现模块化设计(囿于篇幅,举几个代表的例子)(1) 二进制转换(将输入的字符串转化为比特数组)void erjinzhi(char z8,int *q)char ch;int i,j,a=7;for(i=0;i8;i+) ch=zi;for(j=0;j8;j+)*(q+a)=ch%2;ch=ch/2;a-;a=a+16;for(i=0;i=63;i+)if(i%8=0) printf( );printf(%d,*(q+i);printf(n); (2)密钥生成时 C D移位void LS_yiwei(int (*p)28,int i)int j;if(i
8、=1|i=2|i=9|i=16)for(j=0;j=27;j+)if(j=27)*(*(p+i)+j)=*(*(p+i-1)+0);else*(*(p+i)+j)=*(*(p+i-1)+j+1); elsefor(j=0;j=27;j+)if(j=26)*(*(p+i)+j)=*(*(p+i-1)+0);else if(j=27)*(*(p+i)+j)=*(*(p+i-1)+1);else*(*(p+i)+j)=*(*(p+i-1)+j+2);(2)密文生成模块void miwen(int *ip_1)int i,j,a,c,b,x8;for(i=0;i=0;j-)c=*(ip_1+a);b=
9、pow(2,j);xi=xi+b*c;miwensi=xi;/把密文copy在miwens数组中 为了输出使用a+;/printf(密文为:);for(i=0;i=7;i+)a=xi%127;printf(%c,(char)(a);printf(n);4. 实验结果二、AES算法1.AES算法简介AES 是一种可用来保护电子数据的新型加密算法。特别是,AES 是可以使用 128、192 和 256 位密钥的迭代式对称密钥块密码,并且可以对 128 位(16 个字节)的数据块进行加密和解密。与使用密钥对的公钥密码不同的是,对称密钥密码使用同一个密钥来对数据进行加密和解密。由块密码返回的加密数据与
10、输入数据具有相同的位数。迭代式密码使用循环结构来针对输入数据反复执行排列和置换运算。2.算法实现以加密函数为例,如下所示,首先对密钥进行预处理密钥扩展,然后明文进行Nr(Nr与密钥长度有关)次迭代运算,包括字节代换ShiftRows行移位、MixColumns、列混合以及AddRoundKey密钥加。void Cipher() int i,j,round=0; / 把明文赋值到状态数组中 for(i=0;i4;i+)for(j=0;j4;j+) stateji = ini*4 + j; / 先与初始轮密钥相加 AddRoundKey(0); / 第一轮至(Nr-1)轮的迭代运算,第Nr轮不用进
11、行列混合运算 for(round=1;roundNr;round+) SubBytes();/字节代换 ShiftRows();/行移位 MixColumns();/列混合 AddRoundKey(round);/密钥加 SubBytes(); ShiftRows(); AddRoundKey(Nr); / 加密结束,将机密结果填入数组out中以便输出 for(i=0;i4;i+)for(j=0;j4;j+) outi*4+j=stateji;解密函数的流程和加密函数是一致的,只是对于行变换、列变换、以及相关s盒子为加密的逆过程。字节代换(SubBytes)字节代换是非线形变换,独立地对状态的
12、每个字节进行。行移位(ShiftRows)是将状态阵列的各行进行循环移位,不同状态行的位移量不同。第0行不移动,第1行循环左移C1个字节,第2行循环左移C2个字节,第3行循环左移C3个字节。位移量C1、C2、C3的取值与Nb有关。列混合(MixColumns)是将状态阵列的每个列视为多项式,再与一个固定的多项式c(x)进行模x4+1乘法。Rijndael的设计者给出的c(x)为(系数用十六进制数表示):c(x)=03x3+01x2+01x+02。密钥加(AddRoundKey)是将轮密钥简单地与状态进行逐比特异或。轮密钥由种子密钥通过密钥编排算法得到,轮密钥长度等于分组长度Nb。程序流程图AE
13、S流程图3.实验结果首先,输入密钥cryption,输入明文Idolikethisbook,实验结果如图所示。实验结果三、RC4算法1.算法简介RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。首先,用从1到256个字节的可变长度密钥初始化一个256个字节的状态盒S256。然后,通过S盒子对密钥按字节进行变换。最后可以得到变换后的密钥。对于加密,只要让密钥按字节与明文进行异或。而解密,只要让密钥按字节与密文进行异或。2.算法实现开始时,S中元素的值被置为按升序从0到255,即S0=0,S1=1, ,S255=255。同时对密钥k
14、eykey_len的进行填充到随机序列密钥rc4key256中,(key_len为key的字节长度,且不大于256)。循环重复用key,直到rc4key的所有字节都被赋值。然后根据密钥re4key去对S盒进行变换。这些预操作可概括如下:/S盒先初始化为s0=0,s1=1.s255=255for(i = 0; i 255; i+)Si=i;/初始化序列化密钥for(i = 0; i 256; i+)j = i % key_len ;rc4keyi = key_dataj;/根据密钥rc4key,填充S盒for( j = 0, i = 0; i 256; i+)j = (rc4keyi + Si
15、+ j) % 256;swap(&Si, &Sj);/交换Si和Sj的数值矢量S一旦完成初始化,输人密钥就不再被使用密钥流的生成是从s0到S255,对每个Si,根据当前S的值,将Si与S中的另一字节置换当S255完成置换后,操作继续重复,从S0开始。操作如下:/生成随机序列密钥for(counter = 0; counter buffer_len; counter+)i = (i + 1) % 256;j = (Si + j) % 256;swap(&Si, &Sj);t = (Si + Sj) % 256;rc4keycounter = St;这两个过程使用同样的函数即可,加密中,将k的值与
16、下一明文字节异或;解密中,将k的值与下一密文字节异或。操作如下:/将缓冲区数据和随机系列密钥进行异或,则可进行加密或者解密for(i = 0; i buffer_len; i+)resulti = buffer_datai rc4keyi;程序流程图图1.1RC4流程图3.运行结果首先,输入密钥cryption,输入明文Idolikethisbook,实验结果如图所示。加密结果1如果密钥不变,明文变为idolikethisbook,实验结果如图所示。可以看到,当密钥不变,明文做一小部分改变的时候(第一位由I改变为i),只有对应位的密文发生改变。加密结果2问题讨论1. 在DES算法中有哪些是弱密
17、钥?哪些是半弱密钥?2. 改变明文或密钥中的一个比特值可能影响AES值中的多少比特?3.分析实验中在编辑、编译、运行等各环节中所出现的问题及解决方法。回答问题答1、弱密钥:DES在16迭代中分别使用不同的子密钥来确保DES的安全性,如果存在这样一个秘钥,尤其产生的子密钥是相同的,则称其为弱密钥。即K1=K2=K16半弱密钥:由K产生的子密钥K1,K2,,K16中存在着重复但是不是完全相同,则称为半弱密钥2、最多影响128比特3、实验二 公钥密码算法实验实验目的1.掌握密码学中常用的公钥密码算法RSA、ECC的算法原理。2.掌握RSA、ECC的算法流程和实现方法。实验预备1.RSA和ECC密码系
18、统所基于的数学难题是什么?2.RSA和ECC算法的基本原理。3.公钥密码系统可以取代对称密码系统吗? 4.RSA和ECC的实现过程。实验内容1. 分析RSA、ECC的实现过程。2. 用程序设计语言将算法过程编程实现3. 完成数据的加密运算和解密运算输入明文:security 输入密钥:cryption 对ASCII码进行加密和解密。实验步骤1. 预习RSA、ECC算法。2. 了解大素数的生成、大数的运算、公钥、私钥的生成。3. 写出算法流程,用程序设计语言将算法过程编程实现。4. 输入指定的明文和密钥进行实验,验证结果。写出所编写程序的流程图和运行界面、运行结果。一、RSA 算法1. RSA算
19、法及原理(1)选取长度相等的两个大素数p 和q,计算其乘积:n = pq然后随机选取加密密钥e,使e 和(p1)(q1)互素。最后用欧几里德扩展算法计算解密密钥d,以满足ed = 1(mod(p1) ( q1)即d = e1 mod(p1)(q1)e 和n 是公钥,d 是私钥(2)加密公式如下:ci = mie(mod n)(3)解密时,取每一密文分组ci 并计算:mi = cid(mod n)Cid =(mie)d = mi(ed) = mik(p1)(q1)+1 = mi mik(p1)(q1) = mi *1 = mi(4)消息也可以用d 加密用e 解密2. RSA算法加密解密过程 发送
20、者 B 将明文信息加密后变成密文信息发送给接受者A,A解密。 (1) 加密过程。发送者 B 将作如下事情: a. 得到确认的接受者 A 的加密公钥(从认证中心或电话本或信息公告栏等处得到) b. 将明文信息表示为整数。(要求以最有效的方式来表达信息) c. 计算整数 d. 将整数 c 转换成密文信息. f. 将密文信息发送给 A. (可以在公开通道中传递, 在不知道解密私钥的情况下第三者无法破解密文信息) (2) 解密过程。为了将密文信息恢复为明文信息, 接受者 A 将作如下事情: a. 将密文信息转换成整数c. b. 运用解密私钥 恢复整数. c. 将整数 c 转换成明文信息.3.RSA算法
21、实现C语言源程序:#include int candp(int a,int b,int c) /数据处理函数,实现幂的取余运算 int r=1;b=b+1;while(b!=1)r=r*a;r=r%c;b-;printf(%dn,r);return r;int fun(int x,int y) /公钥e 与t 的互素判断int t;while(y)t=x;x=y;y=t%y;if(x = 1)return 0; /x 与y 互素时返回0elsereturn 1; /x 与y 不互素时返回1void main()int p,q,e,d,m,n,t,c,r;printf(请输入两个素数p,q: )
22、;scanf(%d%d,&p,&q);n=p*q;printf(计算得n 为%3dn,n);t=(p-1)*(q-1); /求n 的欧拉数printf(计算得t 为%3dn,t);printf(请输入公钥e: );scanf(%d,&e);if(et|fun(e,t)printf(e 不合要求,请重新输入: ); /et 或e 与t 不互素时,重新输入scanf(%d,&e);d=1;while(e*d)%t)!=1) d+; /由公钥e 求出私钥dprintf(经计算d 为%dn,d);printf(加密请输入1n); /加密或解密选择printf(解密请输入2n);scanf(%d,&r)
23、;switch(r)case 1: printf(请输入明文m: ); /输入要加密的明文数字scanf(%d,&m);c=candp(m,e,n);printf(密文为%dn,c);break;case 2: printf(请输入密文c: ); /输入要解密的密文数字scanf(%d,&c);m=candp(c,d,n);printf(明文为%dn,m);break;4.程序运行结果及相关说明主函数实现求N 的欧拉数、由公钥求解私钥、加密解密选择以及相应的密文明文输出。子函数candp 实现加密解密时的求幂取余运算,fun 实现e 与t 的互素判断,已验证e 是否符合要求。程序主体参考了网上
24、的相关RSA 算法程序,我对其中e 的合法性判断、主函数实现的顺序以及相关提示信息做了补充与修改并加上了注释,这样程序可读性更强,运行时更容易操作,思路也更加严密。当P=43, q=59 时,对134 进行加密,运行结果如下:第一次取e 为15,与t 不互素,提示需重新输入,输入13 后,便可以进行正确操作。由于int 型变量为十六位,因此n 最大只能小于65536,此程序只是对RSA 算法的入门,无法实现达到安全要求的数据位数。二、ECC算法1.ECC算法内容描述(问题域描述) ECC(Elliptic Curves Cryptography)加密算法是一种公钥加密算法,与主流的RSA算法相
25、比,ECC算法可以使用较短的密钥达到相同的安全程度。近年来,人们对ECC的认识已经不再处于研究阶段,开始逐步进入实际应用,如国家密码管理局颁布的SM2算法就是基于ECC算法的 原理:ECC 公钥密码系统,椭圆曲线用于加密找到一个难题:考虑等式Q=kP,其中Q、P 属于Ep(a,b),kp已知k 和P,计算Q,是容易的已知Q 和P,计算k,是困难的选择Ep(a,b)的元素G,使得G 的阶n 是一个大素数G 的阶是指满足nG=O 的最小n 值秘密选择整数r,计算P=rG,然后公开(p,a,b,G,P),P 为公钥保密r加密M:先把消息M 变换成为Ep(a,b)中一个点Pm然后,选择随机数k,计算密
26、文Cm=kG,Pm+kP)如果k 使得kG 或者kP 为O,则要重新选择k.解密Cm: (Pm+kP)-r(kG)=Pm+krG-rkG=Pm加密信息有扩张2.算法加密解密过程加密过程1. A选定一条椭圆曲线Ep(a,b),并取曲线上一点作为基点G2. A选择一个私钥k,并生成公钥K=kG3. A将Ep(a,b)和k,G发送给B4. B收到后将明文编码到Ep(a,b)上一点M,并产生一个随机数r5. B计算点C1=M+rK,C2=rG6. B将C1,C2传给A7. A计算C1-kC2=M+rkG-krG=M8. A对M解码得到明文签名验签流程1. A选定一条椭圆曲线Ep(a,b),并取曲线上一
27、点作为基点G2. A选择一个私钥k,并生成公钥K=kG3. A产生一个随机数r,计算R(x,y)=rG4. A计算Hash=SHA(M),M=M(modp)5. A计算S=(Hash+Mk)/r(modp)6. B获得S和M,Ep(a,b),K,R(x,y)7. B计算Hash=SHA(M),M=M(modp)8. B计算R=(Hash*G+M*K)/S=(Hash*G+M*kG)*r/(Hash+Mk)=rG=R(x,y),若R=R,则验签成功。以上加解密和签名验签流程只是一个例子,具体应用时可以利用K=kG这一特性变幻出多种加解密方式。3.运行结果问题讨论1. 总结算法的特点,分析算法的安
28、全性;2. 分析实验中在编辑、编译、运行等各环节中所出现的问题及解决方法。回答问题答:1、RSA算法:既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。但RSA的安全性一直未能得到理论上的证明。RSA的安全性依赖于大数分解。ECC算法:ECC基于的是椭圆曲线上的离散对数问题, 其位数不用太高,速度反而快些。椭圆曲线其实可能比RSA更复杂,但其安全性比较高,离散对数问题对于计算机而言几乎不可解。2、实验三 SKEY协议设计实验实验目的1.掌握身份认证协议的原理和基本思想。2.掌握SKEY协议的机制和实现方法。实验预备1.SKEY协议的作用。2.SKEY协议的安全性分析。3.SK
29、EY协议的实现过程。实验内容1. 分析SKEY协议的实现过程。2. 用程序设计语言将算法过程编程实现。3. 演示SKEY协议的身份鉴别过程。 实验步骤1. 预习SKEY协议的机制。2. 选择和实现相应的摘要算法MD5或SHA。3. 写出算法流程,用程序设计语言将协议过程编程实现。4. 验证SKEY协议的身份鉴别过程。写出所编写程序的流程图和运行界面、运行结果。一、SKEY协议的原理SKEY是一种鉴别程序,它依赖于单向函数的安全性。为了设置系统,输入随机数R,计算机计算f(R), f(f(R), f(f(f(R)等等大约100次。调用x1 ,x2 ,x3 ,。,x100这些数。计算机打印出这些数
30、的列表,Alice把这些数放入口袋妥善保管,计算机也顺利地在登录数据库中Alice的名字后面存储x101的值。当Alice第一次登录时,她输入她的名字和x100,计算机计算f(x100),并把它和x101比较,如果它们匹配,那么证明Alice身份是真的。然后,计算机用x101代替数据库中的x100。Alice将从她的列表中取消x100。Alice每次登录时,都输入她的列表中未取消的最后的数xI,计算机计算f(xI),并和存储在它的数据库中的xI+1比较。因为每个数只被用一次,并且这个函数是单向的,所以Eve不可能得到任何有用的信息。同样的,数据库对攻击者也毫无用处。当然,当Alice用完了她的
31、列表上面的数后,她必须重新初始化系统。二、用MD5实现加密1.算法简介MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被压缩成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。2.原理以及流程图MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组
32、,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N*512+448,N为一个非负整数,N可以是零。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求
33、。MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0x,B=0xefcdab89,C=0x98badcfe,D=0x。当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。将输入消息按512-位分组,最后要填充成为512位的整数倍,且最后一组的后64位用来填充消息长度(填充前)。填充方法为附一个1在消息后,后接所要求的多个0。这样可以确保不同消息在填充后不相同。由于留出64位用来表示消息长度,那么消息的长度最多可达264字节,相当于4G4G字节,文件的长度是不可能达到这么大,因此通常都是只采用64位
34、中的低32位来表示消息长度,高32位填充0。l初始化MD变量。由于每轮输出128位,这128位可用下面四个32位字A,B,C,D来表示。其初始值设为:A=0xB=0x89ABCDEFC=0xFEDCBA98D=0x开始进入算法主循环,循环的次数是消息中512位消息分组的数目。先将上面A、B、C、D四个变量分别复制到另外四个变量a、b、c、d中去。主循环有四轮,每轮很相似。每轮进行16次操作,每次操作对a、b、c、d四个变量中的三个作一次非线性函数运算,然后将所得结果加上第四个变量,消息的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,
35、c或d中之一。以下是每次操作中用到的四个非线性函数(每轮一个)。F(X,Y,Z)=(XY)(X)Z)G(X,Y,Z)=(XZ)(Y(Z)H(X,Y,Z)=XYZI(X,Y,Z)=Y(X(Z)其中,是异或,是与,是或,是反符号。3.实验结果通过实验了解到哈希函数的特点:压缩性、容易计算、抗修改性、弱抗碰撞、强抗碰撞。而这次实验的主要目的是验证MD5算法,虽然在课堂上做实验的时间有限,MD5算法又很繁杂,但是在老师的讲解下还是能懂的。其实要验证MD5算法最主要是要计算机的辅助,因为人工计算的可能性不大,通过计算机的计算,我们可以容易进行求和运算。通过MD5实现Skey协议,验证服务器收到用户输入的
36、用户、静态密码和动态口令后,先验证用户和静态密码是否正确。如正确则在数据库中读出该用户的密钥1和2。这两个密钥在发布动态口令客户端软件时应该已确定,并存放在验证服务器端数据库内。使用密钥1和2对用户和当前时间进行同客户端相同的处理,最终产生验证服务器端的动态口令,并与客户端产生的动态口令进行比较,一致则通过验证。问题讨论1. 分析SKEY的安全性;2. 分析实验中在编辑、编译、运行等各环节中所出现的问题及解决方法。回答问题答:1、SKEY是比较安全的,因为每个数只被用一次,并且这个函数是单向的,所以攻击者不可能得到任何有用的信息。同样的,数据库对攻击者也毫无用处。当然,当用户用完了的列表上面的数后,必须重新初始化系统。专心-专注-专业