AES加解密的学习

AES算法属于分组密码算法,它的输入分组、输出分组以及加/解密过程的中间分组都是128位,Nr表示对一个数据分组的加密轮数,Nr取决于密钥长度,若密钥长度位128位(规定可可有128、192、256位密钥),则Nr=10,若密钥长度为192,则Nr=12,若密钥长度为256,则Nr=14。
(1)AES的加密过程
给定明文,对State进行初始化,并进行轮密钥操作,该操作是将轮密钥与State进行异或操作
执行Nr-1轮操作,每轮设计如下步骤:对当前的State进行S盒变化操作,行移位,列混淆以及轮密钥操作
在最后一轮中,对当前的State进行S盒变化,行移位和轮密钥操作
State中得到密文
1)轮密钥加变换操作(AddroundKey):将输入或者状态State中的每一个字节分别于产生的密钥的每一个字节进行异或操作
2)S盒变换操作(SubByte):基于S盒的非线性置换
3)行移位操作(ShiftRows):中间状态矩阵State的第0位不动,第一行循环左移1个字节,第二行循环左移2个字节,依次进行
4)列混合操作(MixColumns):
对中间状态矩阵State逐列进行变换
5)密钥扩展
根据加密的轮数用相应的扩展密钥的4个数据项和中间状态矩阵上的列按位异或。
w[i]:存放生成的密钥
Rcon[i]:存放前十个轮常数RC[i]的值
RotWord:循环左移一个字节
SubWord:基于S盒对输入字中的每个字节进行S代替
AES算法利用外部输入密钥K,通过密钥扩展程序得到共4(Nr+1)字的扩展密钥,密钥扩展涉及的具体步骤如下:
a、初始密钥直接被复制到数组w[i]的前四个字节中,得到w[0],w[1],w[2],w[3]
b、对w数组中不为4的倍数的元素,只是简单的异或
c、对数组w下标为4的倍数时,在进行上述异或前,需要对w[i-1]进行一系列处理,即依次进行RotWord、SubWord操作,再将得到的结果与Rcon[i/4]进行异或运算处理
(2)AES与DES的对比
AES与DES的相同点:均使用分组密码机制,在加密过程中都涉及到了非线性S盒变换,循环左移和扩展密钥的操作
AES与DES的不同点:
1)DES的真正有效密钥是56位,而AES则有128位,192位和256位密钥
2)相比DES加密,AES多出了列混淆的操作,采用矩阵变换使得密文形式更加复杂
3)AES对密钥的扩展算法更为复杂,DES对密钥的扩展仅采用了非线性的扩展表格来扩展,而AES对密钥扩展采用了S盒扩展,循环左移操作和按位异或操作
4)AES128位密钥的加密性比DES56位密钥强10^21倍
(3)DES的CTF题目
题目1
题目2
题目3
1)关于题目的解析如下:
方法一:通过题目中给出的代码可知,init是AES密钥扩展的函数,encrypt是AES轮函数,iv = encrypt(key, Ke)可以看出iv是密钥的扩展加密,由 tk[i] ^= tk[i - 1]可以看出使用了CBC模式进行加密(CBC,Cipher Block Chaining模式,分组密文像链条一样相互连接在一起,在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密),假设现在AES的解密函数已经写出,在加密是输入了两组长度相同的字符,那么在解密时,将第一组数据利用解密函数解密后与第二组输入原数据进行异或运算即可得到第二组输入的解密,由于解密后的数据是是已知的,可据此解出加密后的密码
通过途中给出的表格可以看出,出题人将S盒变换的数字进行改变,T变换(T 变换是结合了 ByteSub MixColumn, 将 AES 轮函数中的两步并到一起, 加速效率的一种方法, 如果按照原来的矩阵乘法)也被完全改变
由于列混淆中矩阵的运算非常麻烦,但由观察可以得到2 * ByteSub(b0),1 * ByteSub(b0),1 * ByteSub(b0),3 * ByteSub(b0)的结构是不会改变的,加密的内容本身就是字节,范围在0255之间,所以可以将0255分别代入运算,方便以后的数据查找
MixColumn(ByteSub(b0 b1 b2 b3)) = T1[b0] xor T2[b1] xor T3[b2] xor T4[b3]
假设进入轮函数之前 state 全是 0, T1[0] ^ T2[0] ^ T3[0] ^ T4[0] = 0xaeaeaeae, 而按照原列混合的矩阵算等于 0x93939393 说明列混合的矩阵也被修改
由于进入轮函数之前state全为0,经过S盒的第一个数据为0x93,程序中给出的T[0]=0xF467D4E9,原来AES在进行列混淆时利用的矩阵第一行参数为2311,那么现在设为cofe[0], cofe[1], cofe[2], cofe[3]
根据运算规则,可以列出等式0x93 ** cofe[0] = 0xF4(后面三位以此类推*
在0~255爆破,得到矩阵中第一列的四个因数,后三波运算以此类推
**方法二:首先对代码进行分析
根据代码,随机生成密钥key后利用加密得到iv,利用key和iv对明文进行加密得到密文,因此,只要我们获得到了iv与key,即可解出本题flag
获取iv主要基于对 encrypt函数进行分析
由于利用了CBC工作模式,m[0]=dec(cipher)xor iv
m[1]=dec(cipher)xor cipher
由此推出iv=m[0]xor m[1]xor cipher
然后对S盒盒T盒进行分析,由于S盒和T盒的
变*换满足下面的条件:*T1[i] =[2, 1, 1, 3]^T * S[i],将程序中的T与S代入发现并不满足条件,那么推导出是序列[2,3,3,1]发生变化,在0~255中进行爆破,得到混淆矩阵中的值,得到加密函数的构造,依据此构造解密函数
2)题目中用到的函数构造与爆破算法
a、爆破算法(在Sage中):
sage: F. = GF(2^8, modulus=[1,1,0,1,1,0,0,0,1])
sage: F.modulus()
x^8 + x^4 + x^3 + x + 1
sage: def f(num):
…: global F
…: return F.fetch_int(num)
…:
sage: for i in range(0,256):
…: if f(0x93)*f(i)==f(0xf4):
…: print(i)
…:
8
(以第一个元素的爆破为例)
b、 根据加密算法的分析构造解密算法:

#将密文分组
def bit_rot_left(lst, pos):
    return lst[pos:] + lst[:pos]

def bit_rot_right(lst, pos):
    return lst[-pos:] + lst[:-pos]

def lst_xor(lst1, lst2):
    return [i^j for i,j in zip(lst1, lst2)]

def ggwp(res):
    def FFmul(a,b):
        rr = [a]
        def xtime(x):
            return x<<1 ^(0x1b if x&0x80 else 0x00) 
        for i in range(1,8):
            rr.append(xtime(rr[i-1]))
        t = (b & 0x01) * a
        for i in range(1,8):
            t ^= (((b >> i) & 0x01) * rr[i])
        return t&0xff
    lst = [[8,5,7,9],[9,8,5,7],[7,9,8,5],[5,7,9,8]]
    for i in range(4):
        cache = {
   }
        for a1 in range(0x100):
            for a2 in range(0x100):
                (t1,t2,t3,t4) = FFmul(lst[0][0],a1)^FFmul(lst[0][1],a2), FFmul(lst[1][0],a1)^FFmul(lst[1][1],a2), FFmul(lst[2][0],a1)^FFmul(lst[2][1],a2), FFmul(lst[3][0],a1)^FFmul(lst[3][1],a2)
                if (t1,t2,t3,t4) not in cache:
                    cache[(t1,t2,t3,t4)] = (a1,a2)
        flag = 0
        for a3 in range(0x100):
            for a4 in range(0x100):
                (t1,t2,t3,t4) = FFmul(lst[0][2],a3)^FFmul(lst[0][3],a4)^res[0][i], FFmul(lst[1][2],a3)^FFmul(lst[1][3],a4)^res[1]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值