Python DES 암호 화 실현 원리 및 인 스 턴 스 분석

11797 단어 PythonDES암호 화
암호 화 프로 세 스
먼저 치환 의 뜻 을 말씀 드 리 겠 습 니 다.예 를 들 어 5678 이라는 문자열 이 있 는데 치환 표 는 2143 이 고 치환 표 의 수 는 위 치 를 표시 하기 때문에 문자열 은 6587 이 됩 니 다.모든 교체 표 는 프로그램 에 있 습 니 다.(S 박스 교체 가 다 르 면 별도로 설명 합 니 다)
키 부분

4.567917.8 개의 문자열 키 를 2 진법 으로 바 꿉 니 다.
4.567917.64 비트 키 를 PC1 로 교체 하여 56 비트 로 바 꾸 었 습 니 다.예전 에는 DES 가 하드웨어 로 이 루어 졌 기 때문에 8,16,24,32,40,48,56,64 비트 는 검증 위치 이 고 키 부분 에 기록 되 지 않 습 니 다.하지만 우 리 는 지금 소프트웨어 로 이 루어 지고 있 기 때문에 이 8 명 은 빼 고 순 서 를 어 지 럽 혀 야 한다
  • 56 비트 키 를 L0 과 R0 으로 반 으로 나 누고,각각 L0 과 R0 을 좌 순환 시 키 고,(라운드 수가 1,2,9,16 라운드 일 경우 1 자리 이동,나머지 는 2 자리 이동)L0,R0 을 1 자리 이동 하면 L1,R1 을 얻는다.L1 과 R0 은 다음 라 운 드 를 계속 진행 하고 16 라 운 드 를 진행한다
  • 4.567917.위 에서 자 리 를 옮 겨 서 얻 은 것 이기 때문에 Li+Ri 는 PC2 를 통 해 16 개의 키(PC2 를 교체 하여 56 개의 데 이 터 를 48 비트 로 바 꾸 었 습 니 다)를 얻 었 습 니 다.
    명문 부분
    4.567917.먼저 명문 채 움 을 하고 PKCS\#5 규칙 을 사용 합 니 다.각 그룹 에 8 개의 바이트 가 있 는 것 을 만족 시 키 면 한 그룹 을 추가 합 니 다.각 바이트 가 00000000 이 고 마지막 그룹 에 8 개의 바이트 가 없 으 면 이 그룹 을 8 개의 바이트 로 채 웁 니 다.채 워 진 바이트 의 수 는 7 개의 바이트 가 있 으 면 0000001 을 채 웁 니 다4.567917.다시 초기 교체 하여 64 명의 명문 을 흐 트 러 뜨 린 다4.567917.16 라운드 feitel 함 수 를 진행 한 후 역 초기 연산 을 진행 합 니 다
    한 조 를 예 로 들 어 한 조 의 명문 8 바이트,64 비트 를 설명 한다.16 라운드 교체 가 있 습 니 다.16 번 feitel 함 수 를 실행 해 야 합 니 다.16 라운드 교체 전에 명문 을 초기 교체 하고 교체 한 후에 좌우 양쪽 데 이 터 를 64 비트 로 합 친 다음 에 역 초기 연산 을 해 야 합 니 다.
    64 명의 명문 을 좌우 로 반 으로 나 누 어 두 몫 으로 나누다.
    오른쪽 에 있 는 선 진행 부분 을 확장 하여 교체 하고 32 비트 는 48 비트 가 됩 니 다.
    라운드 수 에 대응 하 는 하위 키 와 이 또는 연산 을 합 니 다.
    S 박스 연산 을 하면 48 비트 가 32 비트 가 됩 니 다.S 박스 연산 의 구체 적 인 조작 방법 은 48 비트 데 이 터 를 8 부 로 나 누 면 1 부 에 6 비트 데이터 가 있다 는 것 이다.예 를 들 어 010110,머리 와 꼬리 를 결합 하 는 위치 00,10 진법 으로 바 꾸 면 0 이 고 중간 4 비트 의 10 진법 은 11 이기 때문에(x,y)는(0,11)이다.
    [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
    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]
    위 에 표 시 된 것 은 12 이 고 12 를 2 진법 으로 바 꾸 면 1100 이기 때문에 6 명 이 4 명 이 된다.모두 8 개의 데이터 가 있 고 8 개의 시계 도 있다.대응 하 는 연산 표 마다 다르다.
    P 박스 연산 을 진행 합 니 다.
    마지막 으로 왼쪽 32 비트 와 이 또는 연산 을 한다.
    복호화
    복호화 부분 은 feitel 함수 에서 하위 키 를 호출 하 는 순 서 를 제외 하고 모두 같 습 니 다.암호 화 호출 순 서 는 1-16 이 고 복호화 순 서 는 16-1 입 니 다.
    코드
    
    #################################    ######################################
    
    #         
    def INT_BIN(NUM):
      i = bin(NUM)[2:]
      if len(i) != 8:
        i = ((8 - len(i)) * '0') + i
    
      return i
    
    #     
    def Replace(ARR,change):
      ARR1 = []
      for i in ARR:
        a = ''
        for j in change:
          a += i[j-1]
        ARR1.append(a)
      return ARR1
    
    #     
    def XOR(a,b):
      c=""
      for i,j in zip(a,b):
        if i==j:
          c+='0'
        else:
          c+='1'
      return [c]
    
    #       
    def ASCII(A):
      text = ''
      for i in A:
        for j in range(8):
          b = i[j*8:(j+1)*8]
          text += chr(int(b,2))
      return text
    
    ##############################################################################
    
    #################################    ######################################
    #  PC1  、 56      L0 R0、   L0 R0       ,
    # (     1、2、9、16  ,  1 ,        )L0,R0  1 
    #    L1,R1,L1+R0  PC2      K1,L1 R0       ,    16    
    
    # PC-1   
    PC1 = [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]
    
    # PC-2   
    PC2 = [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]
    
    #        
    def GenerateSubkey(Key):
      #        
      K = ""
      i_byte = bytes(Key, encoding='utf-8')
      for i_bin in i_byte:
        K += INT_BIN(i_bin)
    
      # PC1  
      ReplacePc1 = Replace([K],PC1)
    
      #   16    
      Lmi = []
      Rmi = []
      Lmi.append(ReplacePc1[0][:28])
      Rmi.append(ReplacePc1[0][28:])
      for i in range(1,17):
        if i in (1, 2, 9, 16):
          Lmi.append(Lmi[i-1][1:]+Lmi[i-1][:1])
          Rmi.append(Rmi[i-1][1:]+Rmi[i-1][:1])
        else:
          Lmi.append(Lmi[i-1][2:]+Lmi[i-1][:2])
          Rmi.append(Rmi[i-1][2:]+Rmi[i-1][:2])
      del Lmi[0]
      del Rmi[0]
      del ReplacePc1[0]
      for i in range(16):
        ReplacePc1.append(Lmi[i]+Rmi[i])
    
      # PC2  
      return Replace(ReplacePc1,PC2)
    
    ###########################################################################
    
    #################################    ###################################
    #     ,  PKCS #5  ,         8   ,      ,     
    # 000010000,        8   ,        8   ,         
    #      ,   7   ,   00000001
    
    #        ,  
    def InitPlaintext(Plaintext):
      DecimalList = []
      BytesList = []
      BinList = []
      
      #      10  
      i_byte = bytes(Plaintext, encoding='utf-8')
      for i_bin in i_byte:
        DecimalList.append(i_bin)
    
      #       
      if len(DecimalList) % 8 == 0:
        for i in range(8):
          DecimalList.append(8)
        for i in range(int(len(DecimalList)/8)):
          BytesList.append(DecimalList[i*8:(i+1)*8])
      #      
      else:
        INT = 8 - len(DecimalList) % 8
        for i in range(INT):
          DecimalList.append(INT)
        for i in range(int(len(DecimalList)/8)):
          BytesList.append(DecimalList[i*8:(i+1)*8])
      
      # 10   2  
      for i in BytesList:
        TMP = ''
        for j in i:
          TMP += INT_BIN(j)
        BinList.append(TMP)
      
      return BinList
    
    ###########################################################################
    
    ################################feistel  ################################
    #ip     
    IPINIT = [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]
    
    #  E   
    EExten = [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]
    
    #P    
    PBOX = [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]
    
    #      
    P1 = [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]
    
    #8 s 
    S_1 = [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
        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]
     
    S_2 = [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]
     
    S_3 = [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]
     
    S_4 = [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]
     
    S_5 = [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]
     
    S_6 = [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]
     
    S_7 = [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]
     
    S_8 = [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_9 = []
    S_9.append(S_1)
    S_9.append(S_2)
    S_9.append(S_3)
    S_9.append(S_4)
    S_9.append(S_5)
    S_9.append(S_6)
    S_9.append(S_7)
    S_9.append(S_8)
    
    # S   
    def S(R):
      s = ''
      for i in range(8):
        a = R[i*6:(i+1)*6]
        x = int(a[0]+a[-1],2)
        y = int(a[1:5],2)
        s += INT_BIN(S_9[i][x*15+y])[4:]
      return[s]
    
    
    # feistel  
    def feistel(L, R, K):
      #     
      Expand = Replace(R,EExten)
      #     
      Expand = XOR(Expand[0],K)
      # S   
      Expand = S(Expand[0])
      # P 
      Expand = Replace(Expand,PBOX)
      #     
      Expand = XOR(L[0],Expand[0])
    
      return Expand[0]
    
    ###########################################################################
    
    ################################ 、    ################################
    #   
    def Encrypt(PlanText,Key):
      #     
      IP1 = Replace(InitPlaintext(PlanText),IPINIT)
      #      
      SubkeyList = GenerateSubkey(Key)
    
      # 16   
      Ciphertext = []
      for i in IP1:
        L = i[:32]
        R = i[32:]
        for k in SubkeyList:
          TMP = feistel([L],[R],k)
          L = R
          R = TMP
        #      
        Ciphertext.append(Replace([R+L],P1)[0])
      return Ciphertext,SubkeyList
    
    #   
    def Decrypt(Ciphertext,Key):
      #     
      IP1 = Replace(Ciphertext,IPINIT) 
    
      # 16   
      PlanText = []
      for i in IP1:
        L = i[:32]
        R = i[32:]
        for k in Key[::-1]:
          TMP = feistel([L],[R],k)
          L = R
          R = TMP
        #      
        PlanText.append(Replace([R+L],P1)[0])
      return PlanText
    
    ###########################################################################
    
    if __name__ == "__main__":
      miwen,miyao = Encrypt('computer','networks')
      print(miwen)
      print(ASCII(Decrypt(miwen,miyao)))
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기