密码学课程方案AES加密解密文档.pdf

上传人:tbuqq 文档编号:4646825 上传时间:2019-11-24 格式:PDF 页数:19 大小:541.62KB
返回 下载 相关 举报
密码学课程方案AES加密解密文档.pdf_第1页
第1页 / 共19页
亲,该文档总共19页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《密码学课程方案AES加密解密文档.pdf》由会员分享,可在线阅读,更多相关《密码学课程方案AES加密解密文档.pdf(19页珍藏版)》请在三一文库上搜索。

1、个人资料整理仅限学习使用 成 都 信 息 工 程 学 院 课 程 设 计 报 告 AES 加密解密的实现 课程名称:应用密码算法程序设计 学生姓名: 学生学号: 专业班级: 任课教师: 年月日 个人资料整理仅限学习使用 指导老师评阅成绩表 学习与工作 态度 1.取逆 2.仿射变换 个人资料整理仅限学习使用 4. 轮密钥加AddRoundKey 5. 逆字节替换 通过逆 S盒的映射变换得到 6. 逆行移位InvShiftRow 与加密时的行移位区别在于移位方向相反。 7. 逆列混淆 加密与解密系统流程图如下所示, 个人资料整理仅限学习使用 3 系统功能程序设计 3.1 基本要求部分 3.1.1

2、字节替换 SubBytes printf(“after subbyte:n“。 /取出中间态state映射到 S盒中的值赋给中间态state for(i=0 。 i 读进明文 读进密钥 (1)产生轮子密钥 (2)AddRoundKey变换 (3)轮变换 Round(State ,RoundKey) ByteSub(State) ; ShiftRow(State); MixColumn(State); AddRoundKey(State ,RoundKey); (4)最后轮变换 FinalRound(State ,RoundKey) ByteSub(State) ShiftRow(State)

3、AddRoundKey(State ,RoundKey); 密文 1 r N 个人资料整理仅限学习使用 for(j=0 。j stateij=sboxstateij。 for(i=0 。i / 输出到屏幕显示state for(j=0 。j printf(“tt%02x “,stateij。 printf(“n“ 。 printf(“n“ 。 return 0。 3.1.2 行移位 ShiftRows printf(“after shiftrows:n“。 / 在中间态的行上, k=state10 。 / 第 0行不变 state10=state11 。 / 第一行循环左移一个字节 state

4、11=state12 。 / 第二行循环左移两个字节 state12=state13 。 / 第三行循环左移三个字节 state13=k 。 k=state20 。 state20=state22 。 state22=k 。 k=state21 。 state21=state23 。 state23=k 。 k=state30 。 state30=state33 。 state33=state32 。 state32=state31 。 state31=k 。 for(i=0 。 i / 输出到屏幕显示state for(j=0 。j printf(“tt%02x “,stateij。 pri

5、ntf(“n“ 。 printf(“n“ 。 return 0。 3.1.3 列混合 MixColumns=c(x*s(xmod(x4+1 个人资料整理仅限学习使用 unsigned char mixcolumns(unsigned char state44 printf(“after mixcolumns:n“。/ 实现 (02 03 01 01 与中间态state分别相乘后异或得相应 值 for(i=0 。 i / (01 02 03 01 / (01 01 02 03 k=state0i 。 / (03 01 01 02 temp0 = state0i state1i state2i s

6、tate3i 。 temp1 = state0i state1i 。 temp1 = xtime(temp1。 state0i = temp1 temp0 。 temp1 = state1i state2i 。 temp1 = xtime(temp1。 state1i = temp1 temp0 。 temp1 = state2i state3i 。 temp1 = xtime(temp1。 state2i = temp1 temp0 。 temp1 = state3i k 。temp1 = xtime(temp1 。state3i = temp1 temp0 。 for(i=0 。i / 输

7、出到屏幕显示state for(j=0 。j printf(“tt%02x “,stateij。 printf(“n“ 。 printf(“n“ 。 return 0。 3.1.4 轮密钥加 AddRoundKey( 用于将输入或中间态S 的每一列与一个密钥字ki 进行按位异或,每一个轮 密钥由 Nb 个字组成。 unsigned char addroundkey(unsigned char state44,unsigned char w44 printf(“addroundkey %d:n“,round+。 /将中间态state中的每一列与一个密钥字(w44 中的一列 进行按位异或 for(

8、i=0 。 i / 完了又赋值给state for(j=0 。j stateij=wij。 for(i=0 。 i / 输出到屏幕显示出来state for(j=0 。j printf(“tt%02x “,stateij。 printf(“n“ 。 printf(“n“ 。 return 0。 个人资料整理仅限学习使用 3.1.5 密钥扩展 通过生成器产生Nr+1 个轮密钥,每个轮密钥由Nb 个字组成,共有Nb 。 for(i=4 。 i if(i%4=0 rotword0=w1i-1。 rotword1=w2i-1。 rotword2=w3i-1。 rotword3=w0i-1。 print

9、f(“rotword(:“。 for(j=0 。j printf(“%02x “,rotwordj。 for(j=0 。j subwordj=sboxrotwordj。 printf(“nsubword(:“。 for(j=0 。j printf(“%02x “,subwordj。 printf(“nn“ 。 for(j=0 。j rconj=subwordj RconNj 。 printf(“after Rcon(:“。 for(j=0 。j printf(“%02x “,rconj。 printf(“nn“ 。 for(j=0 。j wji%4=rconj wji-4 。 printf(“

10、w%d :“,count。 for(j=0 。j printf(“ %02x “,wji%4 。 count+ 。 else for(j=0 。 j wji%4=wji%4wj(i%4-1。 printf(“w%d :“,count。 for(j=0 。 j printf(“ %02x “,wji%4。 count+。 个人资料整理仅限学习使用 printf(“nn“ 。 printf(“ 密钥扩展 Round key:n“ 。 for(i=0 。i for(j=0 。j printf(“tt%02x “,wij。 printf(“n“ 。 printf(“n“ 。 3.1.6 逆字节替换 与

11、字节代替类似,逆字节代替基于逆S盒实现。 unsigned char InvSubbytes(unsigned char state44 for(i=0 。 i / 基于逆 S盒的映射替代 for(j=0 。j stateij = rsboxstateij。 printf(“after InvSubbyte:n“。 for(i=0 。i for(j=0 。j / 输出到屏幕显示state printf(“tt%02x “,stateij。 printf(“n“ 。 printf(“n“ 。 return 0。 3.1.7 逆行移位 与行移位相反,逆行移位将态state的后三行按相反的方向进行移

12、位操作,即第0 行保持不 变,第1 行循环向右移一个字节,第2 行循环向右移动两个字节,第3 行循环向右移动三 个字节。 unsigned char InvShiftRows(unsigned char state44 k=state13 。 state13=state12 。 /对中间态state进行移位操作 state12=state11 。 / 第 0 行保持不变 state11=state10 。 / 第 1 行循环右移一个字节 state10=k 。 / 第 2 行循环右移两个字节 / 第 3 行循环右移三个字节 k=state20 。 state20=state22 。 state

13、22=k 。 k=state21 。 state21=state23 。 state23=k 。 k=state30 。 个人资料整理仅限学习使用 state30=state31 。 state31=state32 。 state32=state33 。 state33=k 。 printf(“after InvShiftRows:n“。 for(i=0 。i / 输出到屏幕显示state for(j=0 。j printf(“tt%02x “,stateij。 printf(“n“ 。 printf(“n“ 。 return 0。 3.1.8 逆列混合 逆列混淆的处理办法与MixColumn

14、s相乘 进行交换。 unsigned char InvMixColumns(unsigned char state44 printf(“after InvMixColumns :n“。 /实现 (0e 0b 0d 09与中间态 state分别相乘后异或得相应值 for(i=0 。i / (09 0e 0b 0d temp0 = state0i。 / (0d 09 0e 0b temp1 = state1i 。 / (0b 0d 09 0e temp2 = state2i 。 temp3 = state3i 。 state0i = Multiply(temp0, 0x0e Multiply(te

15、mp1, 0x0b Multiply(temp2, 0x0d Multiply(temp3, 0x09。 state1i = Multiply(temp0, 0x09 Multiply(temp1, 0x0e Multiply(temp2, 0x0b Multiply(temp3, 0x0d。 state2i = Multiply(temp0, 0x0d Multiply(temp1, 0x09 Multiply(temp2, 0x0e Multiply(temp3, 0x0b。 state3i = Multiply(temp0, 0x0b Multiply(temp1, 0x0d Multi

16、ply(temp2, 0x09 Multiply(temp3, 0x0e。 for(i=0 。 i / 输出到屏幕显示state for(j=0 。j printf(“tt%02x “,stateij。 printf(“n“ 。 printf(“n“ 。 return 0。 3.1.9 加密 加密部分我分了两种情况,一种是自动检查加密程序的正确性,之前在程 序里给明文和密钥赋上初值,运行程序检验结果是否正确;另一种是用户手动 个人资料整理仅限学习使用 输入 32 位的十六进制数,进行加密,我是把每一具体项模块化,将功能在每个 具体模块中实现,只需要直接调用,视觉效果强,一目了然。 下面是实现加

17、密功能一些关键代码 void AES_encrypt(unsigned char StateN, unsigned char RoundKeyN message16=0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,0x31,0x31,0x98,0xa2,0xe0,0x37,0x0 7,0x34 。 key16=0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c 。 for(i=0 。 i for(j=0 。j / 分别获取明文和密钥 stateji=mes

18、sagem 。wji=keym。m+。 . addroundkey(state,w 。 for(round=2 。round printf(“ 第 %d 轮加密 : n“,round 。 subbytes(state。 shiftrows(state 。 mixcolumns(state 。 keyexpand(w, round 。 addroundkey(state,w 。 subbytes(state。 /最后一轮 shiftrows(state 。 keyexpand(w, 10。 addroundkey(state,w 。 3.1.10 解密 AES 解密我也是分成了两个部分,第一部分

19、是在程序中对密文和密钥赋初 值,通过与标准对照检查解密过程的正确性;第二部分是用户手动输入密文和 密钥,程序对其进行解密,得到最后的明文。 解密过程基本如下: 1)获取输入的明文和密钥 2)通过密钥扩展过程获取各轮密钥 3)轮密钥加 变换过程 4)逆行移位 5)逆字节替代 6)轮密钥加变换 7)逆列混淆 47步共 9次循环,最后一轮实现46步,完成解密过程。 主要代码如下: void AES_decrypt(unsigned char StateN, unsigned char wN key16=0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7

20、,0x15,0x88,0x09,0xcf,0x4f,0x3c 。 cipher16=0x39,0x25,0x84,0x1d,0x02,0xdc,0x09,0xfb,0xdc,0x11,0x85,0x97,0x19,0x6a,0x0b,0 x32 。 printf(“%02x “,keyi。printf(“n“ 。 /获取密文和密钥 for(i=0 。i for(j=0 。j stateji=cipherm。wji=keym。m+。 Keyexpand(w,round 。 /获得密钥扩展列表 AddRoundKey(State, w 。 /首轮 个人资料整理仅限学习使用 for (i = 9 。

21、 i 0。 i /1-9 轮 InvShiftRows(state 。 InvSubbytes(state。 Keyexpand(w,round 。 AddRoundKey(State, w 。 InvMixColumns(State 。 InvShiftRows(State 。 /最后一轮 InvSubBytes(State。 Keyexpand(w,0 。 AddRoundKey(State, w 。 4. 测试报告 为检验程序的正确性,需要将结果与标准相对照。参照老师课件里的AES 运行程序的运 行结果,与我的运行结果对照如下: 下面是我的运行界面: 个人资料整理仅限学习使用 个人资料整

22、理仅限学习使用 上面的是标准,接着的是我的运行测试,下面的是我从终端中复制的过程: 密钥扩展 Round key: ef a8 b6 db 44 52 71 0b a5 5b 25 ad 41 7f 3b 00 addroundkey 5 : e0 c8 d9 85 92 63 b1 b8 7f 63 35 be e8 c0 50 01 第 6 轮加密 : after subbyte: e1 e8 35 97 4f fb c8 6c d2 fb 96 ae 9b ba 53 7c after shiftrows: e1 e8 35 97 fb c8 6c4f 96 ae d2 fb 7c 9b

23、 ba 53 after mixcolumns: 25 bd b6 4c d1 11 3a4c a9 d1 33 c0 ad 68 8e b0 after keyexpand: rotword(:0b ad 00 db subword(:2b 95 63 b9 after Rcon(:3b 95 63 b9 w20 : d4 d1 c6 f8 w21 : 7c 83 9d 87 个人资料整理仅限学习使用 w22 : ca f2 b8 bc w23 : 11 f9 15 bc 密钥扩展 Round key: d4 7c ca 11 d1 83 f2 f9 c6 9d b8 15 f8 87 bc

24、 bc addroundkey 6 : f1 c1 7c 5d 00 92 c8 b5 6f4c 8b d5 55 ef 32 0c 第 7 轮加密 : after subbyte: a1 78 10 4c 63 4f e8 d5 a8 29 3d 03 fc df 23 fe after shiftrows: a1 78 10 4c 4f e8 d5 63 3d 03 a8 29 fe fc df 23 after mixcolumns: 4b 2c 33 37 86 4a 9d d2 8d 89 f4 18 6d 80 e8 d8 after keyexpand: rotword(:f9

25、15 bc 11 subword(:99 59 65 82 after Rcon(:b9 59 65 82 w24 : 6d 88 a3 7a w25 : 11 0b 3e fd w26 : db f9 86 41 w27 : ca 00 93 fd 密钥扩展 Round key: 6d 11 db ca 88 0b f9 00 a3 3e 86 93 7a fd 41 fd addroundkey 7 : 个人资料整理仅限学习使用 26 3d e8 fd 0e 41 64 d2 2e b7 72 8b 17 7d a9 25 第 8 轮加密 : after subbyte: f7 27 9b

26、 54 ab 83 43 b5 31 a9 40 3d f0 ff d3 3f after shiftrows: f7 27 9b 54 83 43 b5 ab 40 3d 31 a9 3f f0 ff d3 after mixcolumns: 14 46 27 34 15 16 46 2a b5 15 56 d8 bf ec d7 43 after keyexpand: rotword(:00 93 fd ca subword(:63 dc 54 74 after Rcon(:23 dc 54 74 w28 : 4e 54 f7 0e w29 : 5f5f c9 f3 w30 : 84 a6

27、 4f b2 w31 : 4e a6 dc 4f 密钥扩展 Round key: 4e 5f 84 4e 54 5f a6 a6 f7 c9 4f dc 0e f3 b2 4f addroundkey 8 : 5a19 a3 7a 41 49 e0 8c 42 dc 19 04 b1 1f 65 0c 第 9 轮加密 : after subbyte: be d4 0a da 83 3b e1 64 2c 86 d4 f2 c8 c0 4d fe 个人资料整理仅限学习使用 after shiftrows: be d4 0a da 3b e1 64 83 d4 f2 2c 86 fe c8 c0 4d after mixcolumns: 00 b1 54 fa 51 c8 76 1b 2f 89 6d 99 d1 ff cd ea after keyexpand:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1