# 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)
```