码迷,mamicode.com
首页 > 编程语言 > 详细

PYTHON实现DES加密源码

时间:2016-11-07 02:31:57      阅读:487      评论:0      收藏:0      [点我收藏+]

标签:please   ring   input   handle   opera   global   校验   decode   base64   

要求是实现DES加密,解密,我是用python实现的,还是有挺多坑的,改bug就改了挺久,加密实现后,解密过程就比较轻松。

要求:输入秘钥为64位二进制数(有效位为56位,其中每八位最后一位为奇偶校验位),明文为64位二进制数,输出为64位二进制数,解密过程大致为逆向过程

代码如下:

# -*- coding: utf-8 -*-
import time
import base64


C0=‘‘
D0=‘‘
L0=‘‘
R0=‘‘
cipher=‘‘
outtext=‘‘

substitute1=[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]

substitute2=[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]

shift=[1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]

KEY=[ dict() for i in range(16)]

sbox= [
        [
        0xe,0x4,0xd,0x1,0x2,0xf,0xb,0x8,0x3,0xa,0x6,0xc,0x5,0x9,0x0,0x7,
        0x0,0xf,0x7,0x4,0xe,0x2,0xd,0x1,0xa,0x6,0xc,0xb,0x9,0x5,0x3,0x8,
        0x4,0x1,0xe,0x8,0xd,0x6,0x2,0xb,0xf,0xc,0x9,0x7,0x3,0xa,0x5,0x0,
        0xf,0xc,0x8,0x2,0x4,0x9,0x1,0x7,0x5,0xb,0x3,0xe,0xa,0x0,0x6,0xd,
        ],
        [
        0xf,0x1,0x8,0xe,0x6,0xb,0x3,0x4,0x9,0x7,0x2,0xd,0xc,0x0,0x5,0xa,
        0x3,0xd,0x4,0x7,0xf,0x2,0x8,0xe,0xc,0x0,0x1,0xa,0x6,0x9,0xb,0x5,
        0x0,0xe,0x7,0xb,0xa,0x4,0xd,0x1,0x5,0x8,0xc,0x6,0x9,0x3,0x2,0xf,
        0xd,0x8,0xa,0x1,0x3,0xf,0x4,0x2,0xb,0x6,0x7,0xc,0x0,0x5,0xe,0x9,
        ],
        [
        0xa,0x0,0x9,0xe,0x6,0x3,0xf,0x5,0x1,0xd,0xc,0x7,0xb,0x4,0x2,0x8,
        0xd,0x7,0x0,0x9,0x3,0x4,0x6,0xa,0x2,0x8,0x5,0xe,0xc,0xb,0xf,0x1,
        0xd,0x6,0x4,0x9,0x8,0xf,0x3,0x0,0xb,0x1,0x2,0xc,0x5,0xa,0xe,0x7,
        0x1,0xa,0xd,0x0,0x6,0x9,0x8,0x7,0x4,0xf,0xe,0x3,0xb,0x5,0x2,0xc,
        ],
        [
        0x7,0xd,0xe,0x3,0x0,0x6,0x9,0xa,0x1,0x2,0x8,0x5,0xb,0xc,0x4,0xf,
        0xd,0x8,0xb,0x5,0x6,0xf,0x0,0x3,0x4,0x7,0x2,0xc,0x1,0xa,0xe,0x9,
        0xa,0x6,0x9,0x0,0xc,0xb,0x7,0xd,0xf,0x1,0x3,0xe,0x5,0x2,0x8,0x4,
        0x3,0xf,0x0,0x6,0xa,0x1,0xd,0x8,0x9,0x4,0x5,0xb,0xc,0x7,0x2,0xe,
        ],
        [
        0x2,0xc,0x4,0x1,0x7,0xa,0xb,0x6,0x8,0x5,0x3,0xf,0xd,0x0,0xe,0x9,
        0xe,0xb,0x2,0xc,0x4,0x7,0xd,0x1,0x5,0x0,0xf,0xa,0x3,0x9,0x8,0x6,
        0x4,0x2,0x1,0xb,0xa,0xd,0x7,0x8,0xf,0x9,0xc,0x5,0x6,0x3,0x0,0xe,
        0xb,0x8,0xc,0x7,0x1,0xe,0x2,0xd,0x6,0xf,0x0,0x9,0xa,0x4,0x5,0x3,
        ],
        [
        0xc,0x1,0xa,0xf,0x9,0x2,0x6,0x8,0x0,0xd,0x3,0x4,0xe,0x7,0x5,0xb,
        0xa,0xf,0x4,0x2,0x7,0xc,0x9,0x5,0x6,0x1,0xd,0xe,0x0,0xb,0x3,0x8,
        0x9,0xe,0xf,0x5,0x2,0x8,0xc,0x3,0x7,0x0,0x4,0xa,0x1,0xd,0xb,0x6,
        0x4,0x3,0x2,0xc,0x9,0x5,0xf,0xa,0xb,0xe,0x1,0x7,0x6,0x0,0x8,0xd,
        ],
        [
        0x4,0xb,0x2,0xe,0xf,0x0,0x8,0xd,0x3,0xc,0x9,0x7,0x5,0xa,0x6,0x1,
        0xd,0x0,0xb,0x7,0x4,0x9,0x1,0xa,0xe,0x3,0x5,0xc,0x2,0xf,0x8,0x6,
        0x1,0x4,0xb,0xd,0xc,0x3,0x7,0xe,0xa,0xf,0x6,0x8,0x0,0x5,0x9,0x2,
        0x6,0xb,0xd,0x8,0x1,0x4,0xa,0x7,0x9,0x5,0x0,0xf,0xe,0x2,0x3,0xc,
        ],
        [
        0xd,0x2,0x8,0x4,0x6,0xf,0xb,0x1,0xa,0x9,0x3,0xe,0x5,0x0,0xc,0x7,
        0x1,0xf,0xd,0x8,0xa,0x3,0x7,0x4,0xc,0x5,0x6,0xb,0x0,0xe,0x9,0x2,
        0x7,0xb,0x4,0x1,0x9,0xc,0xe,0x2,0x0,0x6,0xa,0xd,0xf,0x3,0x5,0x8,
        0x2,0x1,0xe,0x7,0x4,0xa,0x8,0xd,0xf,0xc,0x9,0x0,0x3,0x5,0x6,0xb,
        ]
    ]

substituteip= [
        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]

selectoperate=[
        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]

substituteP=[
        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]


resubstituteip=[
        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]

def handleraw(string):
    a=‘‘
    for i in string:
        a+=bin(ord(i)).replace(0b,‘‘).zfill(8)
    return a

def shiftleft(string,x):
    return string[-(len(string)-x):]+string[:x]

def encodepassword1(x):
    global C0
    global D0
    for i in range(0,28):
        C0+=x[substitute1[i]-1]
    for j in range(28,56):
        D0+=x[substitute1[j]-1]

k=0
def encodepassword2():
    global k,C0,D0
    s=‘‘
    m=‘‘
    if(k!=16):
        C0=shiftleft(C0,shift[k])
        D0=shiftleft(D0,shift[k])
        s=C0+D0
        for i in substitute2:
            m+=s[i-1]
        KEY[k]=m
        k+=1
        encodepassword2()

def substituteIP(string):
    global L0,R0
    a=‘‘
    for i in substituteip:
        a+=string[i-1]
    L0=a[:32]
    R0=a[-32:]

def sboxoperate():
    mid=‘‘
    for i in selectoperate:
        mid+=R0[i-1]
    mid=str(bin(int(mid,2)^int(KEY[m-1],2)).replace(0b,‘‘).zfill(48))
    outraw=‘‘
    for n in range(8):
        a=int(mid[6*n]+mid[6*n+5],2)
        b=int(mid[(6*n+1):(6*n+5)],2)
        outraw+=str(bin(int(str(sbox[n][a*16+b]),10)).replace(0b,‘‘).zfill(4))
    ‘‘‘print ‘S:‘,m,outraw‘‘‘
    out=‘‘
    for i in substituteP:
        out+=outraw[i-1]
    return out

m=0
def encodemain():
    global m,L0,R0,cipher
    ‘‘‘print ‘L0,R0‘,L0,R0‘‘‘
    m+=1
    a=L0
    L0=R0
    R0=str(bin(int(sboxoperate(),2)^int(a,2)).replace(0b,‘‘).zfill(32))
    if(m!=16):
        encodemain()
    else:
        b=R0+L0
        ‘‘‘print ‘L0,R0‘,L0,R0‘‘‘
        for i in resubstituteip:
            cipher+=b[i-1]

def decodecircle():
    global L0,R0,outtext,m
    a=R0
    R0=L0
    L0=str(bin(int(sboxoperate(),2)^int(a,2)).replace(0b,‘‘).zfill(32))
    m-=1
    if(m!=0):
        decodecircle()
    else:
        d=L0+R0
        decodetext=[0 for i in range(64)]
        for i in range(64):
            decodetext[substituteip[i]-1]=d[i]
        outtext=‘‘.join(decodetext)

def decoderesubstituteip(cipher):
    global R0,L0
    a=[0 for i in range(64)]
    for i in range(64):
        a[resubstituteip[i]-1]=cipher[i]
    a=‘‘.join(a)
    R0=a[:32]
    L0=a[-32:]

if __name__==__main__:
    print This is a DES encrypt and decrypt function
    ‘‘‘
    rawpassword=raw_input(‘please input the password:\n‘)
    password=handleraw(rawpassword)
    ‘‘‘
    password=raw_input(please input the password:\n)
    a=time.time()
    encodepassword1(password)
    encodepassword2()
    ‘‘‘
    print ‘the KEY is:\n‘,KEY
    ‘‘‘
    ‘‘‘
    rawtext=raw_input(lea‘pse input the text:\n‘)
    text=handleraw(rawtext)
    ‘‘‘
    b=time.time()
    text=raw_input(please input the text:\n)
    c=time.time()
    substituteIP(text)
    encodemain()
    print the cipher is:,cipher
    ‘‘‘decode the cipher‘‘‘
    decoderesubstituteip(cipher)
    decodecircle()
    print the decodetext is:,outtext
    print the time cost is:,time.time()-c+b-a,s

 

  

PYTHON实现DES加密源码

标签:please   ring   input   handle   opera   global   校验   decode   base64   

原文地址:http://www.cnblogs.com/lomooo/p/6037011.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!