AES加密解密C语言实现 - 图文(2)
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
{ t[r] = state[r][c]; } for(r=0; r<4; r++) { state[r][c] = FFmul(0x02, t[r]) ^ FFmul(0x03, t[(r+1)%4]) ^ FFmul(0x01, t[(r+2)%4]) ^ FFmul(0x01, t[(r+3)%4]); } } } unsigned char AES::FFmul(unsigned char a, unsigned char b) { unsigned char bw[4]; unsigned char res=0; int i; bw[0] = b; for(i=1; i<4; i++) { bw[i] = bw[i-1]<<1; if(bw[i-1]&0x80) { bw[i]^=0x1b; } } for(i=0; i<4; i++) { if((a>>i)&0x01) { res ^= bw[i]; } } return res; } 其中FFmul为有限域GF(28)上的乘法,标准算法应该是循环8次(b与a的每一位相乘,结果相加),但这里只用到最低2位,解密时用到的逆列混淆也只用了低4位,所以在这里高4位的运算是多余的,只计算低4位。
AddRoundKey(轮密钥加变换) 简单来说就是逐字节相加,有限域GF(28)上的加法是模2加法,即异或 1 2 3 4 5 6 7 8 9 10 11
void AES::AddRoundKey(unsigned char state[][4], unsigned char k[][4]) { int r,c; for(c=0; c<4; c++) { for(r=0; r<4; r++) { state[r][c] ^= k[r][c]; } } } KeyExpansion(密钥扩展)
将输入的密钥扩展为11组128位密钥组,其中第0组为输入密钥本身 其后第n组第i列 为 第n-1组第i列 与 第n组第i-1列之和(模2加法,1<= i <=3)
对于每一组 第一列即i=0,有特殊的处理
将前一列即第n-1组第3列的4个字节循环左移1个字节,
并对每个字节进行字节替代变换SubBytes 将第一行(即第一个字节)与轮常量rc[n]相加 最后再与前一组该列相加 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
void AES::KeyExpansion(unsigned char* key, unsigned char w[][4][4]) { int i,j,r,c; unsigned char rc[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0 for(r=0; r<4; r++) { for(c=0; c<4; c++) { w[0][r][c] = key[r+c*4]; } } for(i=1; i<=10; i++) { for(j=0; j<4; j++) { unsigned char t[4]; for(r=0; r<4; r++) { t[r] = j ? w[i][r][j-1] : w[i-1][r][3]; } if(j == 0) { unsigned char temp = t[0]; for(r=0; r<3; r++) { t[r] = Sbox[t[(r+1)%4]]; } t[3] = Sbox[temp]; t[0] ^= rc[i-1]; } for(r=0; r<4; r++) { w[i][r][j] = w[i-1][r][j] ^ t[r]; } } } } 解密的基本运算 AES解密算法与加密不同,基本运算中除了AddRoundKey(轮密钥加)不变外,其余的都需要进行逆变换,即 InvSubBytes(逆字节替代)、InvShiftRows(逆行移位)、InvMixColumns(逆列混淆) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 void AES::InvSubBytes(unsigned char state[][4]) { int r,c; for(r=0; r<4; r++) { for(c=0; c<4; c++) { state[r][c] = InvSbox[state[r][c]]; } } } void AES::InvShiftRows(unsigned char state[][4]) { unsigned char t[4]; int r,c; for(r=1; r<4; r++) { for(c=0; c<4; c++) { t[c] = state[r][(c-r+4)%4]; } for(c=0; c<4; c++) { state[r][c] = t[c]; } } } void AES::InvMixColumns(unsigned char state[][4]) { unsigned char t[4]; int r,c; for(c=0; c< 4; c++) { for(r=0; r<4; r++)
相关推荐:
- [政务民生]2013年公共基础知识热点问题(七)
- [政务民生]检验检测机构资质认定评审准则及释义20
- [政务民生]关于印发重庆市房屋建筑和市政基础设施
- [政务民生]1、隧道洞身开挖支护施工技术交底书
- [政务民生]2015年山东省17地市中考语文试题分类汇
- [政务民生]2-高级会计师资格考试和评审流程图
- [政务民生]2018版中国清分机行业发展分析及前景策
- [政务民生]新课改高中政治探究
- [政务民生]2018-2024年中国新型组合房屋行业投资
- [政务民生]2015年上海市春季高考数学模拟试卷五
- [政务民生]灌砂法及环刀法测压实度(带计算过程)
- [政务民生]运筹学实验2求解非线性规划
- [政务民生]劝学、逍遥游默写(教师卷)
- [政务民生]《运筹学》 - 期末考试 - 试卷A - 答案
- [政务民生]八年级英语下册 Module 6 Hobbies测试
- [政务民生]2019年宪法知识竞赛试题库100题(含答
- [政务民生]自动化英文文献翻译
- [政务民生]公文格式实施细则
- [政务民生]高一地理上册课堂跟踪练习题6
- [政务民生]会计继续教育习题及答案
- 第三章 无约束最优化方法
- 泛读教程第三册答案
- 魏晋南北朝文学
- 幂的运算复习题
- 城市环境问题的成因与治理策略_以社会
- 钢结构行业产业链及竞争分析研究
- 新型热塑性弹性体增韧聚丙烯的研究
- 中国旅游地理B卷试题及答案
- (苏教版)五年级数学上册第三单元测试卷
- 不稳定性心绞痛诊断与治疗
- 俞氏国际后勤职能部门绩效考核办法
- GB7258-2017新标准考试题含答案
- 小学生汉字听写比赛活动方案
- 1.3《平抛运动》学案 教科版必修2
- 2011香港特别行政区公务员考试复习资料
- 考虑水力条件变化的城市给水管网可靠性
- 表面活性剂在油田开发和生产中的应用
- ITT内部培训资料-FI端吸泵的介绍
- 文明守纪,从我做起学生发言稿
- 初中读《聊斋志异》心得体会800字范文




