版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java实现AES加密和解密经过三周的不懈努力,终于完成了 AES对任意格式的文件加密和解 密。现在将自己的学习经历记下来,纪念自己三周的付出。同时也感 谢网上的各位大神的博客,让我学到了很多。下面就将AES的各个构件的核心代码粘贴如下,每行代码都有详细的 注释!package myAes;/*本类完成AES的加密和解密的流程/内容参考:* */public class myAes private byte State口口;明文的状态表private byte Sbox口口; S 盒子private byte iSbox口口;逆 S盒子private byte key口;密钥private i
2、nt Nk;/密钥长度private int Nr;/ 对不同的长度的密钥不同的轮数private byte w;/ 密钥调度表private byte Rcon口口;轮常数表private int Nb;明文列数/构造函数public myAes(byte口 keyBytes,int keySize) =4;/只处理明文是128位为一组if(keySize=128)=4;=10;else if (keySize=192) /密钥长度位192位);二6;=12;else if (keySize=256) 二8;二14;二 new byte * 4;二 keyBytes;createSbox()
3、;/创建S盒子的方法createISbox();/ 创建S逆盒子的方法createRcon(); 创建轮常数数组的方法keyExtend();/ 密钥扩展的方法/初始化S盒子private void createSbox() =new byte口 0 x63, 0 x7c, 0 x77, 0 x7b, (byte) 0 xf2, 0 x6b, 0 x6f,(byte) 0 xc5, 0 x30, 0 x01, 0 x67, 0 x2b, (byte) 0 xfe,(byte) 0 xd7, (byte) 0 xab, 0 x76 , (byte) 0 xca, (byte) 0 x82, (b
4、yte) 0 xc9, 0 x7d,(byte) 0 xfa, 0 x59, 0 x47, (byte) 0 xf0, (byte) 0 xad,(byte) 0 xd4, (byte) 0 xa2, (byte) 0 xaf, (byte) 0 x9c,(byte) 0 xa4, 0 x72, (byte) 0 xc0 , (byte) 0 xb7, (byte) 0 xfd, (byte) 0 x93, 0 x26, 0 x36, 0 x3f, (byte) 0 xf7, (byte) 0 xcc, 0 x34, (byte) 0 xa5,(byte) 0 xe5, (byte) 0 xf
5、1,0 x71, (byte) 0 xd8, 0 x31,0 x15 ,0 x04, (byte) 0 xc7, 0 x23, (byte) 0 xc3, 0 x18,(byte) 0 x96, 0 x05, (byte) 0 x9a, 0 x07, 0 x12,(byte) 0 x80, (byte) 0 xe2, (byte) 0 xeb, 0 x27,(byte) 0 xb2, 0 x75 , 0 x09, (byte) 0 x83, 0 x2c, 0 x1a, 0 x1b, 0 x6e, 0 x5a,(byte) 0 xa0, 0 x52, 0 x3b, (byte) 0 xd6, (
6、byte) 0 xb3,0 x29, (byte) 0 xe3, 0 x2f, (byte) 0 x84 , 0 x53, (byte) 0 xd1,0 x00, (byte) 0 xed, 0 x20,(byte) 0 xfc, (byte) 0 xb1,0 x5b, 0 x6a, (byte) 0 xcb,(byte) 0 xbe, 0 x39, 0 x4a, 0 x4c, 0 x58, (byte) 0 xcf , (byte) 0 xd0, (byte) 0 xef, (byte) 0 xaa, (byte) 0 xfb,0 x43, 0 x4d, 0 x33, (byte) 0 x8
7、5, 0 x45, (byte) 0 xf9, 0 x02,0 x7f, 0 x50, 0 x3c, (byte) 0 x9f, (byte) 0 xa8 , 0 x51, (byte) 0 xa3, 0 x40, (byte) 0 x8f, (byte) 0 x92,(byte) 0 x9d, 0 x38, (byte) 0 xf5, (byte) 0 xbc, (byte) 0 xb6, (byte) 0 xda, 0 x21, 0 x10, (byte) 0 xff,(byte) 0 xf3, (byte) 0 xd2 , (byte) 0 xcd, 0 x0c, 0 x13, (byt
8、e) 0 xec, 0 x5f,(byte) 0 x97, 0 x44, 0 x17, (byte) 0 xc4, (byte) 0 xa7,0 x7e, 0 x3d, 0 x64, 0 x5d, 0 x19, 0 x73 , 0 x60, (byte) 0 x81,0 x4f, (byte) 0 xdc, 0 x22, 0 x2a,(byte) 0 x90, (byte) 0 x88, 0 x46, (byte) 0 xee,(byte) 0 xb8, 0 x14, (byte) 0 xde, 0 x5e, 0 x0b, (byte) 0 xdb , (byte) 0 xe0, 0 x32,
9、 0 x3a, 0 x0a, 0 x49, 0 x06, 0 x24, 0 x5c,(byte) 0 xc2, (byte) 0 xd3, (byte) 0 xac, 0 x62,(byte) 0 x91, (byte) 0 x95, (byte) 0 xe4, 0 x79 , (byte) 0 xe7, (byte) 0 xc8, 0 x37, 0 x6d, (byte) 0 x8d,(byte) 0 xd5, 0 x4e, (byte) 0 xa9, 0 x6c, 0 x56,(byte) 0 xf4, (byte) 0 xea, 0 x65, 0 x7a, (byte) 0 xae, 0
10、 x08 , (byte) 0 xba, 0 x78, 0 x25, 0 x2e, 0 x1c, (byte) 0 xa6, (byte) 0 xb4, (byte) 0 xc6, (byte) 0 xe8, (byte) 0 xdd,0 x74, 0 x1f, 0 x4b, (byte) 0 xbd, (byte) 0 x8b, (byte) 0 x8a , 0 x70, 0 x3e, (byte) 0 xb5, 0 x66, 0 x48, 0 x03,(byte) 0 xf6, 0 x0e, 0 x61, 0 x35, 0 x57, (byte) 0 xb9,(byte) 0 x86, (
11、byte) 0 xc1, 0 x1d, (byte) 0 x9e , (byte) 0 xe1, (byte) 0 xf8, (byte) 0 x98, 0 x11, 0 x69,(byte) 0 xd9, (byte) 0 x8e, (byte) 0 x94, (byte) 0 x9b,0 x1e, (byte) 0 x87, (byte) 0 xe9, (byte) 0 xce, 0 x55,0 x28, (byte) 0 xdf , (byte) 0 x8c, (byte) 0 xa1, (byte) 0 x89, 0 x0d,(byte) 0 xbf, (byte) 0 xe6, 0
12、x42, 0 x68, 0 x41,(byte) 0 x99, 0 x2d, 0 x0f, (byte) 0 xb0, 0 x54,(byte) 0 xbb, 0 x16 ;/*生成S逆盒子:我的思路:得到s盒中一个元素的高四位和低四位,分别作为盒子的行和列。然后在把s盒中的行和列转换成十六进制存到s逆盒中。*/private void createISbox() int x, y;=new byte1616;for (int i = 0; i 16; i+) for (int j = 0; j 4) & 0 x0f);/得到s盒子元素中的低四位的值y = (int)皿& 0 x0f);高四位
13、和低四位分别做为s逆盒子的行和列,将s盒子的行和列变 成十六进制放到s逆盒子中xy = (byte) (16 * i + j);/初始化Rcon轮常数二维数组private void createRcon() =new byte口 0 x00, 0 x00, 0 x00, 0 x00 , 0 x01, 0 x00, 0 x00, 0 x00 , 0 x02, 0 x00, 0 x00, 0 x00 , 0 x04, 0 x00, 0 x00, 0 x00 , 0 x08, 0 x00, 0 x00, 0 x00 , 0 x10, 0 x00, 0 x00, 0 x00 , 0 x20, 0 x
14、00, 0 x00, 0 x00 , 0 x40, 0 x00, 0 x00, 0 x00 , (byte) 0 x80, 0 x00, 0 x00, 0 x00 , 0 x1B, 0 x00, 0 x0, 0 x00 , 0 x36, 0 x00, 0 x00, 0 x00 ,;/* RotWord方法:将密钥wi-1的四个字节循环左移位,*返回移位后的结果。* */private byte口 RotWord(byte rotWord) byte口 b = new byte4;b0 = rotWord1;b1 = rotWord2;b2 = rotWord3;b3 = rotWord0;re
15、turn b;/* SubWord方法:将密钥wi-1的四个字节分别用S盒子的内容进 行替换返回替换后的结果。*/private byte口 SubWord(byte口 subWord) for (int i = 0; i 4 & 0 x0f)(subWordi & 0 x0f);return subWord;/*扩展密钥的方法private void keyExtend() =new byteNb * (Nr + 1)4;for (int i = 0; i Nk; i+) i0 = 4 * i;i1 = 4 * i + 1;i2 = 4 * i + 2;i3 = 4 * i + 3;/对轮密
16、钥十六进制输出/*,w+i+:);for(int j=0;j=3;j+)%x,wij);!l .*/byte口 temp = new byte4;for (int i = Nk; i 6 & (i % Nk = 4) temp = SubWord(temp);i0 = (byte) i - Nk0八 temp0);i1 = (byte) i - Nk1八 temp1);i2 = (byte) i - Nk2八 temp2);i3 = (byte) i - Nk3八 temp3);/对轮密钥十六进制输出/*w+i+:);for(int j=0;j=3;j+)%x,wij);!l .*/;/byt
17、e数组转换成String输出。即到时候在前台输出密钥扩展的内 容public static String BytesToString(String w,byte口 b)String s =;for (int i = 0; i ; i+)String hex = (bi & 0 xFF);if () = 1)hex = 0+hex+n.elsehex=hex+s+=hex;s=w+ +s;return s;/*以下是加密过程的每个方法/轮加密private void addRoundKey(int round) for (int r = 0; r 4; r+) for (int c = 0; c
18、 Nb; c+) rc = (byte) rc八 wround * Nb + cr);/字节替换private void subByte() for (int r = 0; r 4; r+) for (int c = 0; c 4) & 0 x0frc & 0 x0f);/逆字节替换private void invSubByte() for (int r = 0; r 4; r+) for (int c = 0; c 4) & 0 x0frc & 0 x0f);/行移位 private void shiftRow() byte temp = new byte4Nb;for (int r = 0
19、; r 4; r+) for (int c = 0; c Nb; c+) temprc = rc;/开始移位for (int r = 1; r 4; r+) for (int c = 0; c Nb; c+) rc = tempr(r + c) % Nb;/逆行移位private void invShiftRow() byte temp = new byte4Nb;for (int r = 0; r 4; r+) for (int c = 0; c Nb; c+) temprc = rc;/开始移位for (int c = 0; c Nb; c+) rc = tempr(c - r + Nb)
20、 % Nb;/列混合private void mixColum() byte口 temp = new byte4Nb;for (int r = 0; r 4; r+) for (int c = 0; c Nb; c+) temprc = rc;for (int c = 0; c Nb; c+) 0c = (byte) (mult2(temp0c)八 multBy03(temp1c)八 mult1(temp2c) mult1(temp3c);1c = (byte) (mult1(temp0c)八 mult2(temp1c)八 multBy03(temp2c) mult1(temp3c);2c =
21、 (byte) (mult1(temp0c)八 mult1(temp1c)八 mult2(temp2c)八multBy03(temp3c);3c = (byte) (multBy03(temp0c)八 mult1(temp1c) 八 mult1(temp2c) 八 mult2(temp3c);/逆列混合private void invMixColum()byte口 temp = new byte4Nb;for (int r = 0; r 4; r+) for (int c = 0; c Nb; c+) temprc = rc; for (int c = 0; c 7 & 0 x01)= 0)
22、/若字节最高位为0,则就是将b左移1位return (byte) (b 1); else byte c = 0 x1b;return (byte) (b 1)八 c);/字节*03的结果,相当于b* (02+01)。后面的方法类似private byte multBy03(byte b) return (byte) (mult2(b)八 mult1(b);/字节b*09的结果private byte multBy09(byte b) return (byte) (mult2(mult2(mult2(b)八 mult1(b);/字节*0b的结果private byte multBy0b(byte b) return (byte) (mult2(mult2(mult2(b) 八 mult2(b)八 mult1(b);/字节*0d的结果private byte multBy0d(byte b) return (byte) (mult2(mult2(mult2(b)八 mult2(mult2(b) mult1(b);/字节*0e的结果private byte multBy0e(byte b) return (byte) (mult2(mult2(mult2(b)八 mult2(mult2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汽车通道施工方案(3篇)
- 2025云南昆明市盘龙区教育发展投资有限公司招聘1人考试备考题库及答案解析
- 2025浙江杭州市临安区第三人民医院招聘2人模拟笔试试题及答案解析
- 砼砌体施工方案(3篇)
- 瓷砖打孔施工方案(3篇)
- 巡线施工方案(3篇)
- 电气工程施工方案及实施步骤
- 施工方案机械配置(3篇)
- 2025四川爱众乐享医养产业有限公司招聘劳务外包人员3人备考考试试题及答案解析
- 2025广东深圳市规划和自然资源局光明管理局劳务派遣人员招聘1人备考笔试题库及答案解析
- 水库工程初步设计报告技术审查要点(湖南省)
- 放疗患者的饮食指导及护理
- 2025年高铁专用电缆沟工程设计与施工总承包合同
- 睑板腺按摩知识培训课件
- 检修挂牌制度培训课件
- 清创缝合教学课件
- 2025年村级水管员招聘面试模拟题及答案全解析
- 化工防冻防凝课件
- GB/T 27043-2025合格评定能力验证提供者能力的通用要求
- 医院科室运营管理
- 学堂在线 雨课堂 学堂云 信息素养-学术研究的必修课 章节测试答案
评论
0/150
提交评论