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
반응형
'암호학 > 암호학 둘러보기' 카테고리의 다른 글
[암호학 둘러보기](7)[D-H 알고리즘] (1) | 2025.02.04 |
---|---|
[암호학 둘러보기](6)[AES] (1) | 2025.01.22 |
[암호학 둘러보기](4)[DES 2] (0) | 2025.01.20 |
[암호학 둘러보기](3)[DES 1] (4) | 2025.01.14 |
[암호학 둘러보기](2)[과거의 암호 2] (1) | 2025.01.13 |