Einführung in die Methode zur Implementierung der DES-Verschlüsselung und -Entschlüsselung in Python (Code)

不言
Freigeben: 2019-03-25 10:49:17
nach vorne
6048 Leute haben es durchsucht

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

Quellcode-Adresse https://github.com/SuQinghang...

Dieser Artikel ist hier für weitere spannende Inhalte , können Sie auf die Spalte

Python-Video-Tutorial

von PHP Chinese Net achten!

Das 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!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!