for i=0,2,⋯ ,r−1
(L_{i+1}, R_{i+1}) = (R_i, L_i \oplus f(R_i, k_i)) \quad \text{for } i=0,2,\cdots,r-1
(Li+1,Ri+1)=(Ri,Li⊕f(Ri,ki))for i=0,2,⋯,r−1여기서 f를 라운드 함수round function이라고 부르고, 이 라운드 함수에 사용되는 ki는 i번째 비밀 키이다.
이렇게 r개의 라운드를 거쳐서 나오는 Rr∣∣Lr이 암호화된 블록이다.
복호화
- 입력: 복호화할 Lr∣∣Rr 블록, 공통적으로 사용할 비밀키 $k0, \cdots , k{r-1} $
- 출력: L0∣∣R0 평문 블록
암호화와 똑같은 과정을 뒤집어서 수행한다.
(Ri,Li)=(Li+1,Ri+1⊕f(Li+1,ki))for k=0,1,⋯,r−1
검증
r-round Feistel의 복호화 과정이 정확한 지 확인하고 싶다면, 다음을 확인하면 된다. E와 D는 각각 암호화encrypt와 복호화decrypt를 의미한다.
- (Li+1,Ri+1)=E(Li,Ri)=(Ri,Li⊕f(Ri,ki))
- (Li′,Ri′)=D(Li+1,Ri+1)=(Ri+1⊕f(Li+1,ki)),Li+1)
- (Li′,Ri′)=(Li,Ri)인가?
먼저, Ri′=Li+1=Ri임은 쉽게 확인된다.
Li′=Ri+1⊕f(Li+1,ki)=(Li⊕f(Ri,ki))⊕f(Li+1,ki)=Li⊕(f(Ri,ki)⊕f(LRi,ki))=Li
따라서 각 단계마다 복호화가 유효하다는 것이 확인되었고, 이 단계들로 구성된 r-round Fesistel 암호의 전체 복호화 과정도 정확하다.
출처
[1] Wikipedia - Feistel Cipher