简单分组密码

分组密码(block cipher)的数学模型是将明文消息编码表示后的数字(简称明文数字)序列,划分成长度为n的组,每组分别在密钥的控制下变换成等长的密文。常见的分组密码有DES、AES

常见出题思路:

  • 普通题目:针对分组模式的攻击、简单结构的攻击
  • 困难题目:需使用差分、积分、代数、MITM

分组模式

  1. ECB模式

    对于每一组密文,使用相同的密钥加密。如果明文相同,那么得到的密文就是相同的,这样会带来一些问题。例如对图片加密时,由于图片中存在大量相同的连续数据,使用ECB模式加密后,可能仅仅相当于对图片进行了一个模糊处理,实际并未取得加密的效果。

  2. CBC模式

  • 加密:首先有一个初始向量IV(长度和一组明文的长度相同),第一组明文先和IV做异或,将异或的结果用密钥加密得到第一段密文。再将第二组明文和第一段密文做异或,将异或的结果用密钥加密得到第二段密文。以此类推。
  • 解密:将第一段密文用密钥解密,然后将解密的结果与加密时使用的初始向量IV做异或得到第一段明文。再将第二段密文用密钥解密,用第一段密文与解密的结果做异或得到第二段明文。以此类推。

CBC的比特c翻转攻击

  • 已知明文攻击
  • 如果我们有一组明密文,就可以做到通过修改密文,来使密文解密出来的特定位置的字符变成我们想要的字符
  • 经常和WEB类型题目一起出
from Crypto.Cipher import AES
m="hahahahahahahaha=1 ; admin=0;uid=1"
key="1234567890abcdef"
iv="fedcba0987654321"
cipher = AES.new(key,AES.MODE_CBC,iv)
c=cipher.encrypt(m)
print c.encode("hex")
  • 攻击示例图:

这里可以注意到前一块Ciphertext用来产生下一块明文,如果我们改变前一块Ciphertext中的一个字节,然后和下一块解密后的密文xor,就可以得到一个不同的明文,而这个明文是我们可以控制的。利用这一点,我们就欺骗服务端或者绕过过滤器。具体怎么翻转呢,因为涉及到异或,这里稍微介绍下异或的概念。

当我们的一个值C是由A和B异或得到
C = A XOR B
那么
A XOR B XOR C很明显是=0的
当我们知道B和C之后,想要得到A的值也很容易
A = B XOR C
因此,A XOR B XOR C等于0。有了这个公式,我们可以在XOR运算的末尾处设置我们自己的值,即可改变。

将示意图中第一个ciphertext视为A,第二个plaintext视为B,第二个ciphertext经密钥解密后的结果视为C,则有加密时的公式C = A xor B,而解密时,为得到B,使用的是公式B = A xor C,因此想要控制解密后B的值,只需要控制解密时使用的A,将A用A’代替,即可控制B得到自己想要的值。具体而言,如果想让解密后的B得到B’,只需将A改为A xor B xor B’,则有B’ = (A xor B xor B’) xor C = (A xor B xor B’) xor (A xor B) = B’。

具体说来,对于解密时:
设明文为X,密文为Y,解密函数为k。
X[i] = k(Y[i]) Xor Y[i-1]
解密第一组时:
X[1]=k(Y[1]) Xor IV
而在加密时有:k(Y[i]) = Y[i-1] Xor X[i]
对于X[i]的解密时,X[i] = k(Y[i]) Xor Y[i-1],k(Y[i])部分是无法控制的,假如修改Y[i]的值,是无法确定k(Y[i])的值,由于最后是异或操作,因此可以仅修改Y[i-1]的内容为Y’[i-1]来控制最后的明文的值,设解密后的内容为M[i]=k(Y[i]) Xor Y[i-1]。

将Y[i-1]的值设置为Y[i-1] Xor X[i] Xor M[i]的值,新的Y[i-1]的值用Y’[i-1]表示。

那么解密的X[i] = k(Y[i]) Xor Y’[i-1]=k(Y[i]) Xor Y[i-1] Xor X[i] Xor M[i] = M[i]
亦即多异或了:X[i], M[i]两个值
这样就能将只修改Y[i-1]的内容来控制解密得到的X[i]的值

而此时X[i-1]的值肯定就会出错了,设修改Y[i-1]的值,导致解密后X[i-1]的值为M[i-1],那么将Y[i-2]的值改为Y[i-2]=Y[i-2] Xor M[i-1] Xor 任意值,可以使得X[i-1]=任意值

这样循环往前,最后一组就是根据M[1]的值修改IV=IV Xor M[1] Xor 任意值,使得X[1]=任意值

python代码:
chr(ord(m[position[i]])^ord(target[i])^ord(c[change]))

CBC选择密文攻击

通过CBC模式的选择密文攻击,可以很快地恢复出IV
明文每次加密前会和Ⅳ异或,Ⅳ每组会更新为上一组的密文
待解密的密文为:C|C(两组密文相同)时
Decrypt©^C=M1
Decrypt©^IV=M0
综合上面两个信息的话,Decrypt©CDecrypt©IV=M1M0
所以M1M0C=Decrypt©CDecrypt©IVC=IV
亦即:IV=M1M0C
也就是说如果我们能够通过一个oracle或者其他方式得到C|C(两组密文相同)这种模式的密文的话,就可以逆推出Ⅳ

padding oracle攻击

  • 常出现在WEB题目中
  • 分组密码CBC模式的Padding oracle攻击需要满足以下特定条件:
  1. 加密时采用了PKCS5的填充;(填充的数值是填充的字符个数)
  2. 攻击者可以和服务器进行交互,可以提交密文,服务器会以某种返回信息告知客户端的padding是否正常。
  3. 攻击效果是在不清楚key和IV的时候解密任意给定的密文
  4. Padding oracle攻击的原理主要是利用服务器再对padding进行检查的时候不同回显进行的。这是一种侧信道攻击。利用服务器对padding的检查,可以从末位开始逐位爆破明文。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值