Python DES 암호 화 실현 원리 및 인 스 턴 스 분석
먼저 치환 의 뜻 을 말씀 드 리 겠 습 니 다.예 를 들 어 5678 이라는 문자열 이 있 는데 치환 표 는 2143 이 고 치환 표 의 수 는 위 치 를 표시 하기 때문에 문자열 은 6587 이 됩 니 다.모든 교체 표 는 프로그램 에 있 습 니 다.(S 박스 교체 가 다 르 면 별도로 설명 합 니 다)
키 부분
4.567917.8 개의 문자열 키 를 2 진법 으로 바 꿉 니 다.
4.567917.64 비트 키 를 PC1 로 교체 하여 56 비트 로 바 꾸 었 습 니 다.예전 에는 DES 가 하드웨어 로 이 루어 졌 기 때문에 8,16,24,32,40,48,56,64 비트 는 검증 위치 이 고 키 부분 에 기록 되 지 않 습 니 다.하지만 우 리 는 지금 소프트웨어 로 이 루어 지고 있 기 때문에 이 8 명 은 빼 고 순 서 를 어 지 럽 혀 야 한다
명문 부분
4.567917.먼저 명문 채 움 을 하고 PKCS\#5 규칙 을 사용 합 니 다.각 그룹 에 8 개의 바이트 가 있 는 것 을 만족 시 키 면 한 그룹 을 추가 합 니 다.각 바이트 가 00000000 이 고 마지막 그룹 에 8 개의 바이트 가 없 으 면 이 그룹 을 8 개의 바이트 로 채 웁 니 다.채 워 진 바이트 의 수 는 7 개의 바이트 가 있 으 면 0000001 을 채 웁 니 다4.567917.다시 초기 교체 하여 64 명의 명문 을 흐 트 러 뜨 린 다4.567917.16 라운드 feitel 함 수 를 진행 한 후 역 초기 연산 을 진행 합 니 다
한 조 를 예 로 들 어 한 조 의 명문 8 바이트,64 비트 를 설명 한다.16 라운드 교체 가 있 습 니 다.16 번 feitel 함 수 를 실행 해 야 합 니 다.16 라운드 교체 전에 명문 을 초기 교체 하고 교체 한 후에 좌우 양쪽 데 이 터 를 64 비트 로 합 친 다음 에 역 초기 연산 을 해 야 합 니 다.
64 명의 명문 을 좌우 로 반 으로 나 누 어 두 몫 으로 나누다.
오른쪽 에 있 는 선 진행 부분 을 확장 하여 교체 하고 32 비트 는 48 비트 가 됩 니 다.
라운드 수 에 대응 하 는 하위 키 와 이 또는 연산 을 합 니 다.
S 박스 연산 을 하면 48 비트 가 32 비트 가 됩 니 다.S 박스 연산 의 구체 적 인 조작 방법 은 48 비트 데 이 터 를 8 부 로 나 누 면 1 부 에 6 비트 데이터 가 있다 는 것 이다.예 를 들 어 010110,머리 와 꼬리 를 결합 하 는 위치 00,10 진법 으로 바 꾸 면 0 이 고 중간 4 비트 의 10 진법 은 11 이기 때문에(x,y)는(0,11)이다.
[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]
위 에 표 시 된 것 은 12 이 고 12 를 2 진법 으로 바 꾸 면 1100 이기 때문에 6 명 이 4 명 이 된다.모두 8 개의 데이터 가 있 고 8 개의 시계 도 있다.대응 하 는 연산 표 마다 다르다.
P 박스 연산 을 진행 합 니 다.
마지막 으로 왼쪽 32 비트 와 이 또는 연산 을 한다.
복호화
복호화 부분 은 feitel 함수 에서 하위 키 를 호출 하 는 순 서 를 제외 하고 모두 같 습 니 다.암호 화 호출 순 서 는 1-16 이 고 복호화 순 서 는 16-1 입 니 다.
코드
################################# ######################################
#
def INT_BIN(NUM):
i = bin(NUM)[2:]
if len(i) != 8:
i = ((8 - len(i)) * '0') + i
return i
#
def Replace(ARR,change):
ARR1 = []
for i in ARR:
a = ''
for j in change:
a += i[j-1]
ARR1.append(a)
return ARR1
#
def XOR(a,b):
c=""
for i,j in zip(a,b):
if i==j:
c+='0'
else:
c+='1'
return [c]
#
def ASCII(A):
text = ''
for i in A:
for j in range(8):
b = i[j*8:(j+1)*8]
text += chr(int(b,2))
return text
##############################################################################
################################# ######################################
# PC1 、 56 L0 R0、 L0 R0 ,
# ( 1、2、9、16 , 1 , )L0,R0 1
# L1,R1,L1+R0 PC2 K1,L1 R0 , 16
# PC-1
PC1 = [57, 49, 41, 33, 25, 17, 9,
1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27,
19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15,
7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29,
21, 13, 5, 28, 20, 12, 4]
# PC-2
PC2 = [14, 17, 11, 24, 1, 5,
3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8,
16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55,
30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53,
46, 42, 50, 36, 29, 32]
#
def GenerateSubkey(Key):
#
K = ""
i_byte = bytes(Key, encoding='utf-8')
for i_bin in i_byte:
K += INT_BIN(i_bin)
# PC1
ReplacePc1 = Replace([K],PC1)
# 16
Lmi = []
Rmi = []
Lmi.append(ReplacePc1[0][:28])
Rmi.append(ReplacePc1[0][28:])
for i in range(1,17):
if i in (1, 2, 9, 16):
Lmi.append(Lmi[i-1][1:]+Lmi[i-1][:1])
Rmi.append(Rmi[i-1][1:]+Rmi[i-1][:1])
else:
Lmi.append(Lmi[i-1][2:]+Lmi[i-1][:2])
Rmi.append(Rmi[i-1][2:]+Rmi[i-1][:2])
del Lmi[0]
del Rmi[0]
del ReplacePc1[0]
for i in range(16):
ReplacePc1.append(Lmi[i]+Rmi[i])
# PC2
return Replace(ReplacePc1,PC2)
###########################################################################
################################# ###################################
# , PKCS #5 , 8 , ,
# 000010000, 8 , 8 ,
# , 7 , 00000001
# ,
def InitPlaintext(Plaintext):
DecimalList = []
BytesList = []
BinList = []
# 10
i_byte = bytes(Plaintext, encoding='utf-8')
for i_bin in i_byte:
DecimalList.append(i_bin)
#
if len(DecimalList) % 8 == 0:
for i in range(8):
DecimalList.append(8)
for i in range(int(len(DecimalList)/8)):
BytesList.append(DecimalList[i*8:(i+1)*8])
#
else:
INT = 8 - len(DecimalList) % 8
for i in range(INT):
DecimalList.append(INT)
for i in range(int(len(DecimalList)/8)):
BytesList.append(DecimalList[i*8:(i+1)*8])
# 10 2
for i in BytesList:
TMP = ''
for j in i:
TMP += INT_BIN(j)
BinList.append(TMP)
return BinList
###########################################################################
################################feistel ################################
#ip
IPINIT = [58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7]
# E
EExten = [32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32, 1]
#P
PBOX = [16, 7, 20, 21,
29, 12, 28, 17,
1, 15, 23, 26,
5, 18, 31, 10,
2, 8, 24, 14,
32, 27, 3, 9,
19, 13, 30, 6,
22, 11, 4, 25]
#
P1 = [40, 8, 48, 16, 56, 24, 64, 32,
39, 7, 47, 15, 55, 23, 63, 31,
38, 6, 46, 14, 54, 22, 62, 30,
37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28,
35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26,
33, 1, 41, 9, 49, 17, 57, 25]
#8 s
S_1 = [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]
S_2 = [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]
S_3 = [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]
S_4 = [7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]
S_5 = [2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]
S_6 = [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]
S_7 = [4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]
S_8 = [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]
S_9 = []
S_9.append(S_1)
S_9.append(S_2)
S_9.append(S_3)
S_9.append(S_4)
S_9.append(S_5)
S_9.append(S_6)
S_9.append(S_7)
S_9.append(S_8)
# S
def S(R):
s = ''
for i in range(8):
a = R[i*6:(i+1)*6]
x = int(a[0]+a[-1],2)
y = int(a[1:5],2)
s += INT_BIN(S_9[i][x*15+y])[4:]
return[s]
# feistel
def feistel(L, R, K):
#
Expand = Replace(R,EExten)
#
Expand = XOR(Expand[0],K)
# S
Expand = S(Expand[0])
# P
Expand = Replace(Expand,PBOX)
#
Expand = XOR(L[0],Expand[0])
return Expand[0]
###########################################################################
################################ 、 ################################
#
def Encrypt(PlanText,Key):
#
IP1 = Replace(InitPlaintext(PlanText),IPINIT)
#
SubkeyList = GenerateSubkey(Key)
# 16
Ciphertext = []
for i in IP1:
L = i[:32]
R = i[32:]
for k in SubkeyList:
TMP = feistel([L],[R],k)
L = R
R = TMP
#
Ciphertext.append(Replace([R+L],P1)[0])
return Ciphertext,SubkeyList
#
def Decrypt(Ciphertext,Key):
#
IP1 = Replace(Ciphertext,IPINIT)
# 16
PlanText = []
for i in IP1:
L = i[:32]
R = i[32:]
for k in Key[::-1]:
TMP = feistel([L],[R],k)
L = R
R = TMP
#
PlanText.append(Replace([R+L],P1)[0])
return PlanText
###########################################################################
if __name__ == "__main__":
miwen,miyao = Encrypt('computer','networks')
print(miwen)
print(ASCII(Decrypt(miwen,miyao)))
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.