• PYTHON实现DES加密及base64源码


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

    另外,附加base64编码源码

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

    base64代码如下:

    base='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    
    def base64(string):
        out=''
        c=len(string)%3
        a=''.join(bin(ord(i)).replace('0b','').zfill(8) for i in string)
        if(c==1):
            a+='0000'
        if(c==2):
            a+='00'
        m=int(len(a)/6)
        for j in range(m):
            out+=base[int(a[j*6:j*6+6],2)]
        if(c==1):
            out+='=='
        if(c==2):
            out+='='
        return out
    
    string=raw_input('please input the text:')
    print ('the base64text is:'),base64(string)
    

      DES代码如下:

    # -*- coding: utf-8 -*-
    import time
    import base64
    import os
    
    m=0
    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
        t=''
        if(k!=16):
            C0=shiftleft(C0,shift[k])
            D0=shiftleft(D0,shift[k])
            s=C0+D0
            for i in substitute2:
                t+=s[i-1]
            KEY[k]=t
            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
    
    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(string):
        global R0,L0,m
        m=16
        a=[0 for i in range(64)]
        for i in range(64):
            a[resubstituteip[i]-1]=string[i]
        a=''.join(a)
        R0=a[:32]
        L0=a[-32:]
    
    if __name__=='__main__':
        e=raw_input('This is a DES encrypt and decrypt function
     press 1 to encrypt, 2 to decrypt:')
        password=raw_input('please input the key:
    ')
        encodepassword1(password)
        encodepassword2()
        '''print 'the KEY is:
    ',KEY'''
        if(e=='1'):
            text=raw_input('please input the text:
    ')
            substituteIP(text)
            encodemain()
            print 'the cipher is:',cipher
        if(e=='2'):
            ciphertext=raw_input('please input the cipher:
    ')
            decoderesubstituteip(ciphertext)
            decodecircle()
            print 'the decodetext is:',outtext
        os.system("pause")
    

      

      

  • 相关阅读:
    Something about the "BSTR" and "SysStringLen"
    关于 i = i ++ 的问题
    duilib写个三国杀?
    关于WM_GETTEXT的应用
    hoops暂时用过的一些方法
    Hoops随便记的
    C++ win32线程数上限
    windows系统时间(SYSTEMTIME)
    Form表单提交的那些事
    多行文字溢出...
  • 原文地址:https://www.cnblogs.com/lomooo/p/6037011.html
Copyright © 2020-2023  润新知