DES 加密算法 / Data Encryption Standard (DES) Algorithm

4月 30, 2024·
Junhong Liu
Junhong Liu
· 3 分钟阅读时长

程序说明 Reference books: https://blog.csdn.net/m0_37962600/article/details/79912654 Completion time:2021-4-20 Last modification time :2021-4-20

'''
此方法支持256种字符
参考文献:https://blog.csdn.net/m0_37962600/article/details/79912654
Completion time:2021-4-20

'''
import sys

#程序说明
print("-------------------<DES编码>程序说明-------------------")
print("All rights reserved")
print("Reference books: https://blog.csdn.net/m0_37962600/article/details/79912654)")
print("Completion time:2021-4-20")
print("Last modification time :2021-4-20",'\n')
print("--------------------------------------------------------")

print("请选择加密OR解密,加密输入0;解密输入1:")
aaaaa = input()
if (aaaaa != '0' and aaaaa != '1'):
    print("输入有无!")
    sys.exit(1)

#***************************************创建码符集
letter = [chr(i) for i in range(256)]
letter_dict = dict(zip(letter,['{:08b}'.format(i) for i in range(len(letter))]))
num_dict = dict(zip(['{:08b}'.format(i) for i in range(len(letter))],letter))

#***************************************生成16个子钥C,D(48位)(先假设密码为'12345678')
key = '12345678'
key_bin = ''
for i in key:
    key_bin = key_bin+letter_dict[i]

#key_bin = '0001001100110100010101110111100110011011101111001101111111110001'
#----------------------------------------------------步骤一
EX = [57,49,41,33,25,17,9, #交换规则表(8*7)
      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]
key_bIR  = ''
for i in range(len(EX)):
    key_bIR = key_bIR + key_bin[(EX[i]-1)]
#----------------------------------------------------步骤二
C = []
D = []
C.append(key_bIR[:28])
D.append(key_bIR[28:])

YW = [1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1] #移位规则表(1*16)
for i in range(16):
    C.append(C[i][YW[i]:] + C[i][:YW[i]])
    D.append(D[i][YW[i]:] + D[i][:YW[i]])
#----------------------------------------------------步骤三
PC_2 = [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]
K  = []
for i in range(len(C)-1):
    K_copy = C[i+1] + D[i+1]
    K_IV = ''
    for j in range(len(PC_2)):
        K_IV = K_IV + K_copy[(PC_2[j]-1)]
    K.append(K_IV)

#***************************************用得到的子密钥对64位数据加密
if (aaaaa == '0'):
    print("请输入需要加密的英文讯息:")
else:
    print("请输入需要解密的英文讯息:")
m = input()
if(len(m)%8 != 0):
    m = m + num_dict['00000000']*(8 - len(m)%8)
M = []
for i in range(int(len(m)/8)):
    M.append(m[i*8:i*8+8])

Ciphertext = ''
for i in M:
    m = i
    word_bin = ''
    for i in m:
        word_bin = word_bin+letter_dict[i]

    #word_bin = '0000000100100011010001010110011110001001101010111100110111101111'
    #----------------------------------------------------步骤一
    IP = [58,50,42,34,26,18,10,2, #初始置换IP,得到word_bIR置换后的字符串
          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]
        
    word_bIR  = ''
    for i in range(len(IP)):
        word_bIR = word_bIR + word_bin[(IP[i]-1)]

    #初始置换IP,得到word_bIR
    R = []
    L = []
    L.append(word_bIR[:32])
    R.append(word_bIR[32:])
    #----------------------------------------------------步骤二
    E = [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]

    for i in range(16):
        L.append(R[i])
        R_IV = ''
        for j in range(len(E)):
            if (aaaaa == '0'):
                if ( R[i][(E[j]-1)] == K[i][j] ):
                    R_IV = R_IV + '0'
                else:
                    R_IV = R_IV + '1'
            else:
                if ( R[i][(E[j]-1)] == K[15-i][j] ):
                    R_IV = R_IV + '0'
                else:
                    R_IV = R_IV + '1'
        S1 = [14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7, #S核
              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]
        S2 = [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]
        S3 = [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]
        S4 = [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]
        S5 = [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]
        S6 = [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]
        S7 = [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]
        S8 = [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 = [S1,S2,S3,S4,S5,S6,S7,S8]

        R_IV_2 = ''
        for j in range(8):
            IV = R_IV[j*6:j*6+6]
            hang = IV[0]+IV[5]
            hang = int(hang,2)
            lie = IV[1:5]
            lie = int(lie,2)
            num = S[j][hang*16+lie]
            R_IV_2 = R_IV_2 + '{:04b}'.format(num)
    #----------------------------------------------------步骤三
        P = [16,7,20,21,   #P核
             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]
        R_IV_3 = ''
        for j in range(len(P)):
            if ( R_IV_2[(P[j]-1)] == L[i][j] ):
                 R_IV_3 = R_IV_3 + '0'
            else:
                R_IV_3 = R_IV_3 + '1'
        R.append(R_IV_3)

    #***************************************密文的生成
    IP_1 = [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]
    RL = R[16] + L[16]

    Ciphertext_bin = ''
    for i in range(len(IP_1)):
        Ciphertext_bin = Ciphertext_bin + RL[(IP_1[i]-1)]

    for j in range(8):
        Ciphertext = Ciphertext + num_dict[Ciphertext_bin[j*8:j*8+8]]
    

if (aaaaa == '0'):
    print("密文为:"+Ciphertext)
else:
    print("明文为:"+Ciphertext)