Dieser Artikel bietet Ihnen eine Einführung in die Methode (den Code) zur Implementierung der DES-Verschlüsselung und -Entschlüsselung. Ich hoffe, dass er für Sie hilfreich ist.
DES (Data Encryption Standard) verwendet eine 64-Bit-Blocklänge und eine 56-Bit-Schlüssellänge. Es benötigt eine 64-Bit-Eingabe und durchläuft eine Reihe von Transformationen, um eine 64-Bit-Ausgabe zu erhalten. Bei der Entschlüsselung werden dieselben Schritte und dieselben Schlüssel verwendet. Der einzige Unterschied besteht darin, dass die Schlüsselreihenfolge gegenüber dem Verschlüsselungsprozess umgekehrt ist.
DES-Verschlüsselung:
Die Eingabe dieses Algorithmus ist der zu verschlüsselnde Klartext und der zur Verschlüsselung verwendete Schlüssel, die beide 64 Bit lang sind. Das 8., 16., 24., 32., 40., 48., 56. und 64. Bit des Schlüssels sind Paritätsbits.
1. Verarbeitung von Klartext
Lesen Sie den Klartext in das Programm ein und konvertieren Sie ihn in eine Binärzeichenfolge
def inputText(filename): with open(filename,'r')as f: text = f.read() text = text.split('\n') text = [eval(x) for x in text] text = ['{:08b}'.format(x) for x in text] text = ''.join(text) return text
Führen Sie eine IP-Ersetzung für den Klartext durch und teilen Sie ihn in zwei Teilzeichenfolgen, die linke und die rechte Teilzeichenfolge
def IP_Transposition(plaintext): LR = [] for i in IP: LR.append(int(plaintext[i-1])) L = LR[:32] R = LR[32:] return L,R
2. Verarbeitung von Schlüsseln
Lesen Sie den Schlüssel in das Programm ein und speichern Sie ihn in Form einer Binärzeichenfolge
Führen Sie eine PC-1-Ersetzung für den Schlüssel durch und teilen Sie ihn in die beiden Teilzeichenfolgen
#密钥置换 def Key_Transposition(key): CD = [] for i in PC_1: CD.append(int(key[i-1])) C = CD[:28] D = CD[28:] return C,D
muss eine Permutationskomprimierung für den Schlüssel durchführen, bevor der für die Iteration erforderliche Schlüssel
#密钥压缩 def Key_Compress(C,D): key = C+D new_key = [] for i in PC_2: new_key.append(key[i-1]) return new_key
generiert wird, um den Unterschlüssel zu generieren ist für jede Runde der DES-Iteration erforderlich, damit die Verschlüsselung und Entschlüsselung direkt durchgeführt werden kann. Unter Verwendung von
def generateKset(key): key = inputKey(key) C,D = Key_Transposition(key) K = [] for i in LeftRotate: C = Key_LeftRotate(C,i) C = Key_LeftRotate(D,i) K.append(Key_Compress(C,D)) return K
3, F-Funktion
in jeder Transformationsrunde kann der gesamte Prozess wie folgt ausgedrückt werden Formel:
$$ L_i = R_{i-1} $$
$$ R_i = L_{i-1}bigoplus F(R_{i-1},K_i) $$
Der Rundenschlüssel Ki ist 48 Bit lang und R ist 32 Bit lang. Zuerst wird R ersetzt und auf 48 Bit erweitert. Das Ergebnis wird durch Verwendung der Substitution generiert Funktion zum Erzeugen einer 32-Bit-Ausgabe. Der 32-Bit-Ausgang wird mit L XOR-verknüpft, nachdem er durch P ersetzt wurde, und die neue R
-Ersetzungsfunktion besteht aus 8 S-Boxen. Jede S-Box verfügt über einen 6-Bit-Eingang und einen 4-Bit-Ausgang. Für jede S-Box bilden das erste und das letzte Bit der Eingabe eine 2-Bit-Binärzahl, die zur Auswahl einer der 4 Reihen alternativer Werte in der S-Box verwendet wird, und die mittleren 4 Bits werden zur Auswahl verwendet eine der 16 Spalten.
#明文R扩展为48位 def R_expand(R): new_R = [] for i in E: new_R.append(R[i-1]) return new_R #将两列表元素异或 def xor(input1,input2): xor_result = [] for i in range(0,len(input1)): xor_result.append(int(input1[i])^int(input2[i])) return xor_result #将异或的结果进行S盒代替 def S_Substitution(xor_result): s_result = [] for i in range(0,8): tmp = xor_result[i*6:i*6+5] row = tmp[0]*2+tmp[-1] col = tmp[1]*8+tmp[2]*4+tmp[3]*2+tmp[4] s_result.append('{:04b}'.format(S[i][row][col])) s_result = ''.join(s_result) return s_result #F函数 def F(R,K): new_R = R_expand(R) R_Kxor= xor(new_R,K) s_result = S_Substitution(R_Kxor) p_result = P_Transposition(s_result) return p_result #将S盒代替的结果进行P置换 def P_Transposition(s_result): p_result = [] for i in P: p_result.append(int(s_result[i-1])) return p_result
Der Verschlüsselungsprozess erfordert 16 Iterationsrunden. Die ersten 15 Iterationsrunden müssen am Ende jeder Iteration ausgetauscht werden
def DES_encrypt(filename,key,outputFile): #从文件中读取明文 plaintext = inputText(filename) #将明文进行置换分离 L,R = IP_Transposition(plaintext) #生成Kset K = generateKset(key) for i in range(0,15): oldR = R #F函数 p_result = F(R,K[i]) R = xor(L,p_result) L = oldR p_result = F(R,K[15]) L = xor(L,p_result) #IP逆置换 reversedP = IP_reverseTransp(L+R) #生成16进制表示的密文 Cipher = generateHex(reversedP) #将密文写入outputFile文件 writeFile(outputFile,Cipher) return Cipher
DES-Entschlüsselung:
def DES_decrypt(filename,key,outputFile): #文件中读取密文 Ciphertext = inputText(filename) #将密文进行置换分离 L,R = IP_Transposition(Ciphertext) #生成Kset K = generateKset(key) for i in range(15,0,-1): oldR = R #F函数 p_result = F(R,K[i]) R = xor(L,p_result) L = oldR p_result = F(R,K[0]) L = xor(L,p_result) reversedP = IP_reverseTransp(L+R) plaintext = generateHex(reversedP) writeFile(outputFile,plaintext) return plaintext
Quellcode-Adresse https://github.com/SuQinghang...
Dieser Artikel ist hier für weitere spannende Inhalte , können Sie auf die Spalte
Python-Video-TutorialDas obige ist der detaillierte Inhalt vonEinführung in die Methode zur Implementierung der DES-Verschlüsselung und -Entschlüsselung in Python (Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!