DES 의 암호 화 및 복호화 알고리즘 (Python 구현)
암호학 실험: DES 의 간단 한 암호 화 와 복호화 알고리즘 을 실 현 했 습 니 다. DES 알고리즘 과 관련 된 자 료 는 인터넷 에 많 습 니 다. 여 기 는 더 이상 군말 하지 않 고 소스 코드 만 붙 여 공유 합 니 다. 소스 코드 에 많은 한자 주석 이 포함 되 어 있 기 때문에 모두 가 읽 을 수 있 을 것 이 라 고 믿 습 니 다.
DES 알고리즘 의 원 리 를 편리 하 게 읽 고 이해 하기 위해 코드 를 모듈 화 했 습 니 다. 키 생 성 모듈, F 함수 모듈, DES 암호 화 모듈, DES 복호화 모듈 로 나 누 었 습 니 다.
주: DES 의 암호 화 알고리즘 과 복호화 알고리즘 은 거의 똑 같 습 니 다. 키 의 사용 순서 만 다 르 기 때문에 모듈 의 코드 도 거의 다 르 지 않 습 니 다.입 출력 요 구 는 16 진수 16 글자 입 니 다. 마침 64bit 입 니 다!
전재 출처 를 밝 혀 주 십시오:https://www.cnblogs.com/wangyanzhong123/p/10575739.html
키 생 성 모듈:
1 MaxTime = 16
2 # 1, 64 56
3 key_table1=[ 57, 49, 41, 33, 25, 17, 9,
4 1, 58, 50, 42, 34, 26, 18,
5 10, 2, 59, 51, 43, 35, 27,
6 19, 11, 3, 60, 52, 44, 36,
7 63, 55, 47, 39, 31, 23, 15,
8 7, 62, 54, 46, 38, 30, 22,
9 14, 6, 61, 53, 45, 37, 29,
10 21, 13, 5, 28, 20, 12, 4 ]
11 # 2, 56 48
12 key_table2=[ 14, 17, 11, 24, 1, 5,
13 3, 28, 15, 6, 21, 10,
14 23, 19, 12, 4, 26, 8,
15 16, 7, 27, 20, 13, 2,
16 41, 52, 31, 37, 47, 55,
17 30, 40, 51, 45, 33, 48,
18 44, 49, 39, 56, 34, 53,
19 46, 42, 50, 36, 29, 32 ]
20
21 def Listmove(l, step): #
22 return l[step:] + l[:step]
23
24 def Subkey(key): #
25 keyresult = []
26 key0 = [0 for i in range(56)]
27
28 for i in range(len(key_table1)):
29 key0[i] = key[key_table1[i]-1]
30
31 # 16
32 for i in range(MaxTime):
33 key1 = [0 for i in range(48)]
34 #
35 if (i == 0 or i == 1 or i == 8 or i == 15):
36 step = 1
37 else:
38 step = 2
39 #
40 tmp1 = key0[0:28]
41 tmp2 = key0[28:56]
42 #
43 tmp1 = Listmove(tmp1, step)
44 tmp2 = Listmove(tmp2, step)
45 #
46 key0 = tmp1 + tmp2
47 #
48 for i in range(len(key_table2)):
49 key1[i] = key0[key_table2[i]-1]
50 #
51 keyresult.append(key1)
52 #
53 return keyresult
F 함수 모듈:
1 MaxTime = 16
2 #IP
3 IP_table=[58, 50, 42, 34, 26, 18, 10, 2,
4 60, 52, 44, 36, 28, 20, 12, 4,
5 62, 54, 46, 38, 30, 22, 14, 6,
6 64, 56, 48, 40, 32, 24, 16, 8,
7 57, 49, 41, 33, 25, 17, 9, 1,
8 59, 51, 43, 35, 27, 19, 11, 3,
9 61, 53, 45, 37, 29, 21, 13, 5,
10 63, 55, 47, 39, 31, 23, 15, 7 ]
11 # IP
12 Inv_IP_table=[40, 8, 48, 16, 56, 24, 64, 32,
13 39, 7, 47, 15, 55, 23, 63, 31,
14 38, 6, 46, 14, 54, 22, 62, 30,
15 37, 5, 45, 13, 53, 21, 61, 29,
16 36, 4, 44, 12, 52, 20, 60, 28,
17 35, 3, 43, 11, 51, 19, 59, 27,
18 34, 2, 42, 10, 50, 18, 58, 26,
19 33, 1, 41, 9, 49, 17, 57, 25 ]
20 #S S1
21 S1=[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
22 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
23 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
24 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 ]
25 #S S2
26 S2=[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
27 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
28 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
29 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 ]
30 #S S3
31 S3=[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
32 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
33 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
34 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 ]
35 #S S4
36 S4=[ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
37 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
38 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
39 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 ]
40 #S S5
41 S5=[ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
42 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
43 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
44 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 ]
45 #S S6
46 S6=[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
47 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
48 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
49 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 ]
50 #S S7
51 S7=[ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
52 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
53 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
54 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]
55 #S S8
56 S8=[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
57 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
58 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
59 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 ]
60 # S
61 S=[S1,S2,S3,S4,S5,S6,S7,S8]
62 # , 32bit 48bit
63 extend_table=[32, 1, 2, 3, 4, 5,
64 4, 5, 6, 7, 8, 9,
65 8, 9, 10, 11, 12, 13,
66 12, 13, 14, 15, 16, 17,
67 16, 17, 18, 19, 20, 21,
68 20, 21, 22, 23, 24, 25,
69 24, 25, 26, 27, 28, 29,
70 28, 29, 30, 31, 32, 1 ]
71 #P
72 P_table=[ 16, 7, 20, 21, 29, 12, 28, 17,
73 1, 15, 23, 26, 5, 18, 31, 10,
74 2, 8, 24, 14, 32, 27, 3, 9,
75 19, 13, 30, 6, 22, 11, 4, 25 ]
76
77 def int2bit(n):#0~15
78 a=[]
79 for i in range(0,4):
80 a.insert(0,str(n%2))
81 n=int(n/2)
82 return a
83
84 #IP ,op 0 ,op 1
85 def IP(text, op):
86 tmp = [0 for i in range(64)]
87 if op == 0:
88 for i in range(64):
89 tmp[i] = text[IP_table[i]-1]
90 return tmp
91 if op == 1:
92 for i in range(64):
93 tmp[i] = text[Inv_IP_table[i]-1]
94 return tmp
95 # , 32 48
96 def Extend(text):
97 extend = [0 for i in range(48)]
98 for i in range(48):
99 extend[i] = text[extend_table[i] - 1]
100 return extend
101
102 #S
103 def S_replace(text):
104 Sresult = [0 for k in range(32)]
105 for k in range(8):
106 row = 2*int(text[k*6]) + int(text[k*6+5])
107 column = 8*int(text[k*6+1]) + 4*int(text[k*6+2]) + 2*int(text[k*6+3]) + int(text[k*6+4])
108 tmp = S[k][row*16+column]
109
110 for i in range(4):
111 Sresult[4*k + i] = int2bit(tmp)[i]
112 return Sresult
113 #P
114 def P_replace(text):
115 Presult = [0 for i in range(32)]
116 for i in range(32):
117 Presult[i] = text[P_table[i]-1]
118 return Presult
119 #
120 def Xor(bit1, bit2):
121 Xorresult = [0 for i in range(len(bit1))]
122 for i in range(len(bit1)):
123 Xorresult[i] = str(int(bit1[i]) ^ int(bit2[i]))
124 return Xorresult
DES 암호 화 모듈:
1 import CreateSubkey as cs
2 import F_function as f
3 #
4 def Hex2bin(text):
5 result = []
6 for i in range(len(text)):
7 result.extend(f.int2bit(int(text[i],16)))
8 return result
9 #
10 def bin2Hex(text):
11 result = []
12 q = len(text)//4
13 for i in range(q):
14 dec = int(text[4*i])*8 + int(text[4*i+1])*4 + int(text[4*i+2])*2 + int(text[4*i+3])*1
15 x = hex(dec)[2:].upper()
16 result.extend(x)
17 rs = ''.join(result)
18 return rs
19 # DES
20 def Encryption(text, key):
21 keylist = cs.Subkey(keybit)
22 text1 = f.IP(text, 0) #IP
23 L = [text1[i] for i in range(32)]
24 R = [text1[i] for i in range(32,64)]
25 for i in range(16):
26 tmp = R
27 tmp = f.Extend(tmp)
28 tmp = f.Xor(tmp, keylist[i])
29 tmp = f.S_replace(tmp)
30 tmp = f.P_replace(tmp)
31 tmp = f.Xor(tmp, L)
32 L = R
33 R = tmp
34 L,R = R,L
35 ctext = L
36 ctext.extend(R)
37 ctext = f.IP(ctext, 1)
38 return bin2Hex(ctext)
39
40 if __name__ == '__main__':
41 plaintext = input(' :')
42 key = input(' :')
43 ptext = Hex2bin(plaintext)
44 keybit = Hex2bin(key)
45 print(' :' + Encryption(ptext, keybit))
DES 복호화 모듈:
1 import CreateSubkey as cs
2 import F_function as f
3 #
4 def Hex2bin(text):
5 result = []
6 for i in range(len(text)):
7 result.extend(f.int2bit(int(text[i],16)))
8 return result
9 #
10 def bin2Hex(text):
11 result = []
12 q = len(text)//4
13 for i in range(q):
14 dec = int(text[4*i])*8 + int(text[4*i+1])*4 + int(text[4*i+2])*2 + int(text[4*i+3])*1
15 x = hex(dec)[2:].upper()
16 result.extend(x)
17 rs = ''.join(result)
18 return rs
19
20 def Encryption(text, key):
21 keylist = cs.Subkey(keybit)
22 text1 = f.IP(text, 0) #IP
23 L = [text1[i] for i in range(32)]
24 R = [text1[i] for i in range(32,64)]
25 for i in range(16):
26 tmp = R
27 tmp = f.Extend(tmp)
28 tmp = f.Xor(tmp, keylist[15-i])
29 tmp = f.S_replace(tmp)
30 tmp = f.P_replace(tmp)
31 tmp = f.Xor(tmp, L)
32 L = R
33 R = tmp
34 L,R = R,L
35 ctext = L
36 ctext.extend(R)
37 ctext = f.IP(ctext, 1)
38 return bin2Hex(ctext)
39
40 if __name__ == '__main__':
41 plaintext = input(' :')
42 key = input(' :')
43 ptext = Hex2bin(plaintext)
44 keybit = Hex2bin(key)
45 print(' :' + Encryption(ptext, keybit))
다음으로 전송:https://www.cnblogs.com/wangyanzhong123/p/10575739.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.