java aes 列混合_[原创]AES加密中列混合的具体算法

AES明文在加密过程中涉及到字节代换、行移位、列混合、轮密钥加等过程。这里对列混合的算法做出一些浅显的解释。

列混合其实就是对一个状态的每一列去乘一个矩阵,其中乘法是在有限域GF(2^8)内进行的,不可约多项式为x^8+x^4+x^2+x+1如图:

a4c26d1e5885305701be709a3d33442f.png

先把算法代码列出来:

void AES::MixColumns(unsigned char state[][4]) //列混合{ unsigned char t[4]; int r,c; for(c=0; c< 4; c++) //按列处理 { for(r=0; r<4; r++) { t[r] = state[r][c]; //每一列中的每一个字节拷贝到t[r]中 } 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) //有限域GF(2^8)上的乘法{ 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;}

这里重点是有限域GF(2^8)上的乘法。烈火采用的算法的原理如下:

1、 GF(2^8)中任何数乘0x01都不变

2、 GF(2^8)中计算乘0x02,可以分两种情况考虑:

(1)、原数值小于(1000 0000)2,即0x80的时候,乘2后第8个比特不会溢出,那么结果就是原数值左移一位;

(2)、原数值大于(1000 0000)2,即0x80的时候,乘2后第8个比特会溢出,结果需要减去一个不可约多项式(x8+x4+x2+x+1),注意到GF(2^8)中的减法就是加法,那么结果就为原数值左移一位后(乘2)再与(0001 1011)2即0x1b进行异或(这里x8已经减掉了,只需要再减去x4+x2+x+1)。

3http://www.pudncom.com/、类似第2点,可以得到GF(2^8)中计算乘4、乘8的结果;

4、GF(2^8)中计算乘其它数时,可以表示为乘1、2、4、8的线性组合。

根据以上几点再对有限域GF(2^8)上的乘法源代码进行解释:

unsigned char AES::FFmul(unsigned char a, unsigned char b) //有限域GF(2^8)上的乘法{ unsigned char bw[4]; unsigned char res=0; int i; bw[0] = b; for(i=1; i<4; i++) //循环三次,分别得到参数b乘2、4、8后的值,储存到bw[i]里面 { bw[i] = bw[i-1]<<1; //原数值乘2 if(bw[i-1]&0x80) //判断原数值是否小于0x80 { bw[i]^=0x1b; //如果大于0x80的话,减去一个不可约多项式 } } for(i=0; i<4; i++) { if((a>>i)&0x01) //将参数a的值表示为1、2、4、8的线性组合 { res ^= bw[i]; } } return res;}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SummerMVP的gravatar头像 SummerMVP2020-04-16 17:32:30原c++语言实现AES加密算法代码分享 项目描述 AES的实现 1. 只要求实现块长为 128 位、密钥长为 128 位的 AES,分别实现 ECB、CBC、CFB、OFB 这四种操作 模式。每种操作模式都有一组对应的测试数据,以便检查程序的正确性。其,CFB 操作模式为 8 位 CFB 操作模式,OFB 操作模式为 8 位 OFB 操作模式。 2. 要求以命令行的形式,指定明文文件、密钥文件、初始化向量文件的位置和名称、加密的操作模式以 及加密完成后密文文件的位置和名称。加密时先分别从指定的明文文件、密钥文件和初始化向量文件 读取有关信息,然后按指定的操作模式进行加密,最后将密文(用 16 进制表示)写入指定的密文文件。 命令行的具体格式如下: e2aes -p plainfile -k keyfile [-v vifile] -m mode -c cipherfile 参数: -p plainfile 指定明文文件的位置和名称 -k keyfile 指定密钥文件的位置和名称 -v vifile 指定初始化向量文件的位置和名称 -m mode 指定加密的操作模式 -c cipherfile 指定密文文件的位置和名称。 3. 分别实现对每种操作模式下加密及解密速度的测试,要求在程序生成 5MB 的随机测试数据(不要 求使用随机数发生器),连续加密、解密 20 次,记录并报告每种模式的加密和解密的总时间(毫秒)和 速度(MByte/秒)。 4. 用 C 和/或 C++语言完成程序。 运行环境 VS2012 项目技术(必填) C++,AES算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值