# Block Cipher {%hackmd M1bgOPoiQbmM0JRHWaYA1g %} > Author:堇姬 ## 定義 將明文切成一個一個的block後,分別加密,再把加密過的密文組起來 # Block mode # ECB(Electronic CodeBook) ## 加密: **有明文$p$,密鑰$k$,加密函數$E()$,密文$c$** $p$分割成$p_1$、$p_2$、$p_3$、...、$p_x$ $c=\sum_{i=1}^{x} E(k,p_i)$ ![](https://hackmd.io/_uploads/H1SUn7jMT.png) ## 解密: **有明文$p$,密鑰$k$,解密函數$D()$,密文$c$** $c$分割成$c_1$、$c_2$、$c_3$、...、$c_x$ $p=\sum_{i=1}^{x} D(k,c_i)$ ![](https://hackmd.io/_uploads/rkYF3mjGT.png) ## Cut and paste ## prepend oracle # CBC(Cipher Block Chaining) ## 加密: ![image](https://hackmd.io/_uploads/HJUHwgkDp.png) ## 解密: ![image](https://hackmd.io/_uploads/B1EIweyPp.png) ## bit flipping attack $IV_前 \oplus D(C_前)=P_前$ $D(C_前) = P_前 \oplus IV_前$ 修改$IV$,$P$被修改 $IV_改 \oplus D(C_前)=P_改$ $IV_改 =P_改 \oplus D(C_前)$ 將$D(C_前)$帶入就可以了 >$IV_改 =P_改 \oplus P_前 \oplus IV_前$ ### 驗證 $D(C_前) \oplus IV_改$ $P_前 \oplus IV_前 \oplus P_改 \oplus P_前 \oplus IV_前$ >$P_改$ ## padding oracle attack ### 原理 $IV_前 \oplus D(C_前)=P_前$ 暴力去炸$IV$讓產生出來的$P_改$不會有填充錯誤 $IV_改 \oplus D(C_前)=P_改$ >找出了$IV_改$ 還原出$P_前$ >$P_改 \oplus IV_改 \oplus IV_前$ $P_改 \oplus IV_改=D(C_前)$ $IV_前=P_前\oplus D(C_前)$ 因此 $D(C_前) \oplus P_前\oplus D(C_前)$ ```python= from pwn import * from Crypto.Util.number import * from tqdm import * r=remote('127.0.0.1', 3140) def oracle(iv, mess): r.sendlineafter(b' = ', (iv+mess).hex().encode()) return b'PADDING CORRECT!!!' in r.recvline() flag=long_to_bytes(int(r.recvline()[:-1].decode().split(' = ')[1], 16)) #print(flag, len(flag)) ans=b'' cur=b'' for i in tqdm(range(0, len(flag)-16, 16)): iv, mess=flag[i:i+16], flag[i+16:i+32] for j in range(16): now=15-j for k in range(256): if oracle(iv[:now]+bytes([k])+xor(cur, iv[now+1:], chr(16-now).encode()*(15-now)), mess): if now==15: if k!=iv[15]: cur=xor(k, iv[15], 1)+cur break else: cur=xor(k, iv[now], (16-now))+cur break ans+=cur cur=b'' print(ans) ```