ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:77.85KB ,
资源ID:5989389      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5989389.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(SMS4分析实验报告附C++实现代码.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

SMS4分析实验报告附C++实现代码.docx

1、SMS4分析实验报告附C+实现代码中国商用加密标准SMS4分析实验报告一、概况二、SMS4与DES、AES比较三、意义四、实现1.密钥扩展2.S盒替换3.L变换4.轮函数F5.加密算法6.解密算法五、分析1输入改变一位,输出改变位数2S变换和L变换输入改变一位,输出改变位数3S盒连续变换使输入等于输出的轮数附1:实现代码附2:运行截图一、概况商用密码是指对不涉及国家秘密内容的信息进行加密保护或者安全认证所使用的密码技术和密码产品。商用密码的应用领域十分广泛,主要用于对不涉及国家秘密内容但又具有敏感性的内部信息、行政事务信息、经济信息等进行加密保护。1972年美国公布了第一个商用密码DES。而2

2、006年2月公布的用于无线局域网加密的SMS4是我国公布的第一个商用密码。SMS4是一个分组对称密码算法。分组长度与密钥长度均为128位。数据处理单位主要为字节(8位)和字(32位)。包括非线性变换S和线性变换L,经过32轮迭代结果为128位密文。其中S盒可替换,是一种灵活的、相对稳定的密码算法。二、SMS4与DES、AES比较SMS4、DES与AES均为已公开的分组对称商用密码,均使用异或,置换,代换,移位操作四种基本运算。均包括线性和非线性变换。DES:分组长度为64位,密钥长度为64位(放弃其中八位用作奇偶校验),16轮变换,输出64位密文。有8个4 x 16位S盒。从实际出发仍认为其安

3、全性足够,但现在一般更多的使用AES。AES:分组长度为128256位,密钥长度为128、192或256位,1014轮变换,输出与明文对应长度的密文。有16 x 16位的S盒和基于16 x 16位的E、F表的混合列操作。SMS4:分组长度为128位,密钥长度为128位,32轮变换,输出128位密文。有16 x 16位S盒。三、意义随着信息时代的到来,信息显得越来越重要,甚至成为一种战略物资。所以信息的安全也越来越重要。而密码算法则是信息安全的核心。SMS4的公布改变了长期以来不公布密码算法只提供密码芯片的局面。打破了外国对商业密码的垄断,使得用户不再需要面对要达到加密要求就必须向外国管理者缴纳

4、使用费的情况。也在最大程度上避免了因使用外国密码算法而被掌握陷门的风险。同时,SMS4也标志着我国密码体制与国际接轨,有利于我国密码管理的科学化,促进我国商用密码算法的发展。四、实现1密钥扩展使用到4个常数FK03和32个固定参数CK031,定义K03为FK与密钥的异或值。子密钥IKi等于Ki+4等于Ki+13与CKi的T变换与Ki的异或值。2S盒替换使用16 x 16位的S盒,以输入高位为行号、低位为列号取对应表中数值作为输出。3L变换以输入与其循环左移2,10,18,24次的值的异或值作为输出。(密钥扩展里用到的L变换的左移次数为13,23次)4轮函数F四个S盒并行替换后做L变换称作T变换

5、。F函数的输出为输入数据X13与子密钥IK的异或值的T变换得到的值再与输入数据X0的异或值。5加密算法明文作为第一轮F的输入,之后的输入为前一轮输入的后三项与前一轮F变换的结果,子密钥为IK031。32轮变换后,最后四轮的输出分别作为密文的第4到第1项。6解密算法解密算法与加密相同,但子密钥的使用顺序为IK310。五、分析 1输入改变一位,输出改变位数每次测试先随机产生原始输入,之后每次随机改变一位,与前一次输出比较改变位数。每次测试做1000次改变,取平均数。见图(四)。多次统计取平均结果为:63.63位2S变换和L变换输入改变一位,输出改变位数每次测试先随机产生原始输入,之后每次随机改变一

6、位,与前一次输出比较改变位数。每次测试做1000次改变,取平均数。见图(三)。多次统计取平均结果为:S:3.98位 L:5位3S盒连续变换使输入等于输出的轮数S盒公有256种输入,对每个输入做连续S变换,直到输出与输入相同。对于每个S盒结果为定值。部分见图(四)。对于附1中的代码实现时所用S盒的计算结果为: (XX:Y XX=输入 Y=S盒替换次数) 00: 120 01: 24 02: 120 03: 24 04: 56 05: 120 06: 120 07: 5608: 56 09: 120 0A: 56 0B: 56 0C: 120 0D: 35 0E: 56 0F: 12010: 24

7、 11: 120 12: 120 13: 120 14: 56 15: 120 16: 56 17: 5618: 120 19: 120 1A: 120 1B: 35 1C: 120 1D: 120 1E: 120 1F: 5620: 24 21: 120 22: 120 23: 120 24: 9 25: 120 26: 35 27: 12028: 120 29: 120 2A: 56 2B: 24 2C: 56 2D: 3 2E: 35 2F: 5630: 120 31: 120 32: 120 33: 120 34: 35 35: 56 36: 6 37: 3538: 120 39: 2

8、4 3A: 120 3B: 56 3C: 35 3D: 120 3E: 35 3F: 3540: 120 41: 56 42: 120 43: 24 44: 120 45: 120 46: 56 47: 12048: 120 49: 120 4A: 35 4B: 120 4C: 56 4D: 120 4E: 9 4F: 950: 120 51: 56 52: 56 53: 35 54: 120 55: 120 56: 56 57: 12058: 6 59: 120 5A: 120 5B: 120 5C: 35 5D: 56 5E: 120 5F: 5660: 120 61: 9 62: 56

9、63: 120 64: 120 65: 6 66: 35 67: 12068: 120 69: 120 6A: 120 6B: 56 6C: 24 6D: 120 6E: 56 6F: 5670: 35 71: 120 72: 56 73: 120 74: 35 75: 35 76: 120 77: 5678: 56 79: 6 7A: 120 7B: 120 7C: 120 7D: 56 7E: 120 7F: 12080: 120 81: 56 82: 56 83: 120 84: 120 85: 120 86: 120 87: 5688: 35 89: 24 8A: 56 8B: 120

10、 8C: 120 8D: 9 8E: 120 8F: 12090: 24 91: 9 92: 56 93: 56 94: 120 95: 35 96: 120 97: 12098: 35 99: 56 9A: 120 9B: 120 9C: 24 9D: 120 9E: 120 9F: 35A0: 120 A1: 120 A2: 120 A3: 35 A4: 56 A5: 35 A6: 35 A7: 120A8: 9 A9: 120 AA: 120 AB: 1 AC: 35 AD: 35 AE: 9 AF: 56B0: 24 B1: 120 B2: 35 B3: 120 B4: 2 B5: 5

11、6 B6: 120 B7: 56B8: 24 B9: 120 BA: 120 BB: 56 BC: 120 BD: 24 BE: 120 BF: 56C0: 9 C1: 35 C2: 56 C3: 56 C4: 56 C5: 120 C6: 120 C7: 120C8: 120 C9: 35 CA: 35 CB: 56 CC: 56 CD: 24 CE: 120 CF: 3D0: 56 D1: 35 D2: 120 D3: 35 D4: 35 D5: 24 D6: 120 D7: 24D8: 3 D9: 35 DA: 56 DB: 120 DC: 24 DD: 120 DE: 2 DF: 24

12、E0: 24 E1: 120 E2: 120 E3: 35 E4: 120 E5: 120 E6: 56 E7: 120E8: 6 E9: 120 EA: 120 EB: 120 EC: 120 ED: 56 EE: 120 EF: 120F0: 120 F1: 120 F2: 56 F3: 120 F4: 120 F5: 24 F6: 120 F7: 24F8: 6 F9: 120 FA: 56 FB: 35 FC: 24 FD: 56 FE: 24 FF: 120表(一) S变换循环测试附1:/10385001 丁雅博 SMS4密码算法 VC+6.0编译#include#include#i

13、nclude#include#include#includeusing namespace std;int S_box1616 =0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05, 0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99, 0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xa

14、c,0x62, 0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6, 0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8, 0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35, 0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22

15、,0x7c,0x3b,0x01,0x21,0x78,0x87, 0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e, 0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1, 0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3, 0x1d,0xf6,0xe2,0x2e,0x82,

16、0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f, 0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51, 0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8, 0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0, 0

17、x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84, 0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48;unsigned int ck32 = 0x00070e15,0x1c232a31,0x383f464d,0x545b6269,0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9, 0xe0e7eef5,0xfc030a11,0x181f262

18、d,0x343b4249,0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9, 0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229,0x30373e45,0x4c535a61,0x686f767d,0x848b9299, 0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209,0x10171e25,0x2c333a41,0x484f565d,0x646b7279;unsigned int fk4 = 0xa3b1bac6,0x56aa335,0x677d9197,0xb27022dc;voi

19、d pri(char a, int n)/数组输出 for(int i = 0; i n; i+) cout ai; cout endl;void pri_(char a, int n)/16进制输出 int m = n / 4; for(int i = 0; i m; i+) int k = i * 4; int temp = (ak-0) * 8 + (ak+1-0) * 4 + (ak+2-0) * 2 + (ak+3-0); if(temp 10) cout temp; else char temp_ = temp - 10 + A; cout temp_; cout endl;voi

20、d pri_(char a, int n)/二进制转字符输出 int m = n / 8; for(int i = 0; i m; i+) int temp = 0,k = i * 8; for(int j = 0; j 8; j+) temp = temp * 2; temp = temp + ak+j - 0; cout char(temp); cout endl;void getbi(char a, char re, int n)/获得二进制码 for(int i = 0; i n; i+) int sb = ai; for(int j = 0; j 8; j+) rei*8+7-j =

21、 sb % 2 + 0; sb = sb / 2; void giv(char a32, char re32)/赋值 for(int i = 0; i 32; i+) rei = ai;void xor(char a32, char b32, char re32)/异或 for(int i = 0; i 32; i+) if(ai = bi) rei = 0; else rei = 1; void zy(char a32, int n)/循环左移 while(n-) char temp = a0; for(int i = 0; i 31; i+) ai = ai+1; a31 = temp;

22、void d_to_b(unsigned int a, char re32)/十进制转二进制 for(int i = 1; i = 32; i+) re32-i = a % 2 + 0; a = a / 2; void h_to_b(char a32, char re432)/十六进制转二进制 int i,j; char b128; for(i = 0; i = A) d = ai - A + 10; else d = ai - 0; for(j = 0; j 4; j+) bi*4+3-j = d % 2 + 0; d = d / 2; for(i = 0; i 4; i+) for(j =

23、 0; j 32; j+) reij = bi*32+j; void S_change(char a32, char re32)/4个S盒并行置换 for(int i = 0; i 4; i+) int xtemp = 0; int ytemp = 0; for(int j = 0; j 4; j+) xtemp = xtemp * 2 + a8*i+j - 0; ytemp = ytemp * 2 + a8*i+j+4 - 0; int temp = S_boxxtempytemp; for(int k = 0; k 8; k+) rei*8+7-k = temp % 2 + 0; temp

24、 = temp / 2; void L_change(char a32, char re32)/L置换 char temp32; giv(a,temp); zy(temp,2); xor(a,temp,re); zy(temp,8); xor(re,temp,re); zy(temp,8); xor(re,temp,re); zy(temp,6); xor(re,temp,re);void key_LC(char a32, char re32)/L*置换 char temp32; giv(a,temp); zy(temp,13); xor(a,temp,re); zy(temp,10); xo

25、r(re,temp,re);void F_change(char a32, char b32, char c32, char d32, char rk32, char re32)/F变换 xor(b,c,re); xor(re,d,re); xor(re,rk,re); S_change(re,re); L_change(re,re); xor(a,re,re);void key_ex(char a432, char re3232)/密钥扩展 int i; char K3632; char FK432; for(i = 0; i 4; i+) d_to_b(fki, FKi); xor(ai,

26、FKi,Ki); char CK3232; for(i = 0; i 32; i+) d_to_b(cki, CKi); for(i = 0; i 32; i+) char temp32; xor(Ki+1,Ki+2,temp); xor(temp,Ki+3,temp); xor(temp,CKi,temp); S_change(temp,temp); key_LC(temp,temp); xor(Ki,temp,rei); giv(rei,Ki+4); void pu_to_pr(char a432, char b3232, char re432)/加密 int i = 0; char X3

27、632; for(i = 0; i 4; i+) giv(ai,Xi); for(i = 0; i 32; i+) F_change(Xi,Xi+1,Xi+2,Xi+3,bi,Xi+4); for(i = 0; i 4; i+) giv(X35-i,rei);void pr_to_pu(char a432, char b3232, char re432)/解密 int i = 0; char X3632; for(i = 0; i 4; i+) giv(ai,Xi); for(i = 0; i 32; i+) F_change(Xi,Xi+1,Xi+2,Xi+3,b31-i,Xi+4); fo

28、r(i = 0; i 4; i+) giv(X35-i,rei); double comp(char a, char b, int n)/比较俩数组不同的位数 double re = 0; for(int i = 0; i n; i+) if(ai != bi) re+; return re;double comp_Z(char a432, char b3232)/输入改变一位,输出平均改变位数 double re = 0; char pr432,pr_432; pu_to_pr(a,b,pr); srand(time(0); for(int i = 0; i 1000; i+) int p = rand() % 128; if(ap/32128%32 = 0) ap/32128%32 = 1; else ap/32

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1