암호학/암호학 둘러보기

[암호학 둘러보기](5)[DES 3]

황올뱀 2025. 1. 21. 19:17

simple DES 직접 구현해보기

 

간단하게 단일 메세지 블록(12비트)에 대해 구현해보겠다.

 

조건들은 다음과 같다.
    메세지: 111111101010
    마스터키: 001100111
    함수 f: 1바퀴 왼쪽 회전 시프트, 이후 마지막 비트 2개 추가
    S1, S2: 각각 2x8행렬, 각 행은 할때마다 랜덤으로 0~7의 중복 없는 행 생성됨.

 

기타 코드 설명
    파이썬에서 그냥 시프트를 하면 앞에 있는 0은 무시됨(0001 -> 1) 따라서 문자열로 바꿨다가(bin, zfill) 다시 수로 연산했다가(int(x, 2)) 함.

 

코드

#simple DES

#회전 시프트용 함수: x를, k만큼 시프트, x길이
def l_rot(x, k, n):
    return bin(((x << k) & ((1 << n) - 1)) | (x >> (n - k)))[2:].zfill(n)

## 기본 설정 ##

#메세지
message = bin(0b111111101010)[2:].zfill(12)

#대충 3라운드까지만 돌릴거
round_n = 3
k = [0 for i in range(round_n+1)]

#마스터 키
k[0] = bin(0b001100111)[2:].zfill(9)

#함수 f
def f(x):
    x = int(x, 2)
    shift_x = l_rot(x, 1, 6)
    last_bit = bin(x & 0b000001)[2:]
    x = shift_x + last_bit + last_bit
    return x  

#S-box
import random
S1 = [random.sample(range(0, 7+1), 8),random.sample(range(1, 8+1), 8)]
S2 = [random.sample(range(0, 7+1), 8),random.sample(range(1, 8+1), 8)]
print("S-box(S1) = ", S1)
print("S-box(S2) = ", S2)

## 실제 암호과정 ##

Ln = message[:6]
Rn = message[6:]

for i in range(round_n):
    Ln = Rn
    Rn = f(Rn).zfill(8)
    k[i+1] = bin((int(k[0][:i+1],2)<<i+1)|int(k[0][i+2:],2))[2:].zfill(8)
    Rn = bin(int(Rn, 2) ^ int(k[i+1], 2))[2:].zfill(8)
    R_l = Rn[:4].zfill(4); R_r = Rn[4:].zfill(4)

    #R_l 처리
    col = int(R_l[0], 2)
    row = int(R_l[1:], 2)
    R_l = bin(S1[col][row])[2:].zfill(3)

    #R_r 처리
    col = int(R_r[0], 2)
    row = int(R_r[1:], 2)
    R_r = bin(S2[col][row])[2:].zfill(3)

    #Rn 병합
    Rn = R_l + R_r

cyper = Ln + Rn

print("message = ", message, ", cyper = ", cyper)
728x90
반응형