1. 程式人生 > >DES演算法實踐(python版本)

DES演算法實踐(python版本)

一、 DES演算法原理概述

預備知識

  • 64位為一個分組,當成明文輸入DES演算法模型,輸出同樣長度64位的密文。

  • 對稱加密,加密金鑰也是解密金鑰,金鑰定義了加密過程。

  • 金鑰構成:64位,每8位的最後一位用於奇偶校驗,所以實際金鑰長度為56位。

  • 基本過程是換位和置換(根據置換矩陣)

演算法核心概要

  • 總體結構

  • Feistel輪函式

  • 子金鑰生成

  • 解密過程

資訊空間處理:

  1. 原始明文訊息的處理:最後的分組不足64位時,填充的位元組為缺失的位元組數目。

  2. 明文分組結構:$M = m_1m_2…m_{64} , m_i ∈ {0, 1},i= 1…64 $

  3. 密文分組結構: $C = c_1c_2…c_{64} , c_i ∈ {0, 1},i= 1…64 $

  4. 金鑰結構:$K = k_1k_2…k_{64} , k_i ∈ {0, 1},i= 1…64 $

加密過程:

64位原始密文M經IP初始置換得到 I P ( M )

IP(M)

I P ( M ) IP(M) 經過16次迭代 T

1 , T 2 . . . T 16 T_1, T_2... T_{16} 得到 T 1 6 T 1 5... T 1 I P ( M ) T_16T_15...T_1IP(M)

然後在經過 I P 1 IP^{-1} 逆變換得到密文。

解密過程:

加密逆向進行分析。和加密不同的是,子金鑰排程過程為逆序,其他一致。

初始置換:

給定一個固定的初始置換IP矩陣來重排明文塊M中的二進位制位。得到二進位制串 M 0 = I P ( M ) = L 0 R 0 M_0 = IP (M) = L_0R_0

表: IP置換表(8 * 8)(row * col 下同)

迭代T

  1. 迭代規則:交叉迭代。 L i = R i 1    R i = L i 1 f ( R i 1 , K i ) L_i = R_{i-1} \,\, R_i = L_{i-1} \bigoplus f(R_{i - 1}, K_i) . K i K_i 為子金鑰,長度為 K i   , f K_i\,, f f i e s t e l fiestel 輪函式。

  2. 16次迭代後產生 L 16 R 16 L_{16}R_{16}

  3. 左右交換輸出$R_{16}L_{16}

逆置換 P 1 P^{-1} C = I P 1 ( R 16 L 16 ) C = IP^{-1}(R_{16}L_{16})

表: 逆置換表(8 * 8)

輪函式 f ( R i 1 , K i ) f(R_{i-1}, K_i)

密碼函式f(R, K)接受兩個輸入:32 位的資料和 48 位的子金鑰。然後:

  1. 通過表 E 進行擴充套件置換 (表),將輸入的 32 位資料擴充套件為 48 位;

  2. 將擴充套件後的 48 位資料與 48 位的子金鑰進行異或運算;

  3. 將異或得到的 48 位資料分成 8 個 6 位的塊,每一個塊通過對應的一個 S 表產生一個 4 位的輸出。其中,每個 S 表都是 4 行 16 列。**具體的置換過程如下:**把 6 位輸入中的第 1 位和第 6 位取出來行成一個兩位的二進位制數 x ,作為 Si 表中的行數(0~3);把 6 位輸入的中間 4 位構成另外一個二進位制數 y,作為 Si 表的列數(0~15);查出 Si 盒表(8 * 4 * 16 的矩陣)中 x 行 y 列所對應的整數,將該整數轉換為一個 4 位的二進位制數。

  4. 把通過 S 表置換得到的 8 個 4 位連在一起,形成一個 32 位的資料。然後將該 32 位資料通過表 P 進行置換(稱為P-置換),置換後得到一個仍然是 32 位的結果資料,這就是f(R, K)函式的輸出。

三個表:E擴充套件置換表(8 * 6),S盒置換表(4 * 16),P-置換表(8 * 4)

子金鑰生成

  1. 對金鑰K中的56個非校驗位實現PC-1置換,得到 C 0 D 0 C_0D_0 ,即置換後的前28位和後28位。

  2. C i 1 D i 1 C_{i-1} D_{i-1} 分別進行迴圈左移操作,得到 C i D i C_{i}D_{i} ,當 i = 1 2 9 16 i = 1,2,9,16 時二進位制串左移一個位置,否則左移兩個位置。

  3. 對56位的 C i D i C_iD_i 實行PC-2壓縮置換,得到48位的 K i K_i 。 然後 i + + i++

  4. 如果已經得到 K 16 K_{16} ,密碼排程結束,否則轉步驟2.

    兩個表:壓縮置換表PC-1 PC-2

二、 程式碼模組

在這裡插入圖片描述
整個演算法的需要的函式如上圖所示。

核心函式展示和描述

由於解密函式需要的模組基本與加密一致,所以不做呈現。

#####加密總函式############################################################################
# 1. 初始置換 2. 交叉迭代 3. 逆置換
def Encryption(plainText, secretKey):
    if PRINT_FLAG == True: 
        print("> 開始加密64位明文")
    M = list(plainText)
    L0, R0 = InitialPermutation(M)
    RL = CrossIterationInEncryption(L0, R0, secretKey)
    cipherText = "".join(InversePermutation(RL))
    return cipherText
##############################################################################################
######表格置換函式###########################################################################
"""
    function: transfrom the binaryStr with the giver permutation table
    condition: len(binaryStr) == len(PermutationTable)
    return: the permutated binary List.
"""
# 傳入01字串列表和置換表,返回置換結果
def Permutation(binaryStr, PermutationTable):
    length = len(PermutationTable)
    PermutatedList = []
    for i in range(0, length):
        PermutatedList.extend(binaryStr[PermutationTable[i] - 1])
    return PermutatedList
############################################################################################
#########加密過程的的交叉迭代####################################################################
"""
   function: make cross iteration on L0, R0 for 16 times
   input: L0--the front 32 bits of 64-bits plain text , R0--the back 32 bits of plain text
   return: R16--the back iterated 32-bits result, L16--the front iterated 32-bits result 
"""
# 16次交叉迭代,返回RL列表用於逆置換。
def CrossIterationInEncryption(L_0, R_0, SecretKey):
   if PRINT_FLAG == True: 
       print("> 正在進行加密過程的交叉迭代")
   R = ""
   L = ""
   tmp_R = R_0
   tmp_L = L_0
   sonKeyList = createSonKey(SecretKey)
   for i in range(1,17):
       L = tmp_R
       R = XOROperation(tmp_L,Feistel(tmp_R,sonKeyList[i - 1]))
       tmp_R = R
       tmp_L = L
   RL = R + L
   return RL 
##############################################################################################
####建立子金鑰##################################################################################
"""
    function: create the 16 son keys with the given key
    return: sonKeysList: 16 son keys list
"""
def createSonKey(SecretKey):
    # 提取金鑰中的非校驗位
    if PRINT_FLAG == True: 
        print("> 正在生成16個子金鑰")
    str_56_bits_List = list(SecretKey)
    sonKeyList = []
    # 進行PC-1置換
    Temp_PC_1_PermutationResult_C_i_1, Temp_PC_1_PermutationResult_D_i_1 = PC_1_Permutation(str_56_bits_List) 
    C_i = []
    D_i = []     
    for i in range(1, 17):        
        # C_i-1 D_i-1
        # 計算C_i D_i
        # 迴圈左移
        if i == 1 or i == 2 or i == 9 or i == 16:
            C_i = shiftLeft(Temp_PC_1_PermutationResult_C_i_1, 1)
            D_i = shiftLeft(Temp_PC_1_PermutationResult_D_i_1, 1)
        else:
            C_i = shiftLeft(Temp_PC_1_PermutationResult_C_i_1, 2)
            D_i = shiftLeft(Temp_PC_1_PermutationResult_D_i_1, 2)
        CD = C_i + D_i
        # PC2壓縮置換
        sonKey_i = PC_2_Permutation(CD)
        sonKeyList.append(sonKey_i)  
        Temp_PC_1_PermutationResult_C_i_1 = C_i
        Temp_PC_1_PermutationResult_D_i_1 = D_i
        if i == 16:
            break
    return sonKeyList
##############################################################################################

#####Feistel 函式#############################################################################
"""
    function: Feistel function to create bit-stR_ing to permute with R_i -- a 32-bit stR_ing
    input: R_i_1--the (i-1)th back 32 bits string, K_i--the son secret key
    return: Feistel result (string type)
"""
# 輪函式:1. E擴充套件置換; 2. 擴充套件結果和子金鑰進行異或運算 3. 進行S盒6-4轉換
def Feistel(R_i_1, K_i):
    if PRINT_FLAG == True: 
        print("> 正在執行feistel輪函式")
    E_ExpandResult = E_Expand(R_i_1)
    xorResult = XOROperation(E_ExpandResult, K_i)
    str_32_bits = []
    for i in range(8):
        str_6_bits = xorResult[i * 6: i * 6 + 6]
        str_32_bits += S_Box_Transformation(str_6_bits, i + 1)
    return "".join(P_Permutation(str_32_bits
            
           

相關推薦

DES演算法實踐python版本

一、 DES演算法原理概述 預備知識 64位為一個分組,當成明文輸入DES演算法模型,輸出同樣長度64位的密文。 對稱加密,加密金鑰也是解密金鑰,金鑰定義了加密過程。 金鑰構成:64位,每8位的最後一位用於奇偶校驗,所以實際金鑰長度為56位。

linux Ubuntu14.04 python(c++版本 tesorflowpython版本c++

一、環境變數配置: export M2_HOME=/home/ustcjing/Maven/apache-maven-3.5.0 export JAVA_HOME=/usr/lib/jvm8/java export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:$

mysql基於binlog回滾工具_flashbackpython版本

 update、delete的條件寫錯甚至沒有寫,導致資料操作錯誤,需要恢復被誤操作的行記錄。這種情形,其實時有發生,可以選擇用備份檔案+binlog來恢復到測試環境,然後再做資料修復,但是這樣其實需要耗費一定的時間跟資源。     其實,如果binlog format為row,binlog檔案中是會詳

Apriori演算法介紹Python實現

導讀: 隨著大資料概念的火熱,啤酒與尿布的故事廣為人知。我們如何發現買啤酒的人往往也會買尿布這一規律?資料探勘中的用於挖掘頻繁項集和關聯規則的Apriori演算法可以告訴我們。本文首先對Apriori演算法進行簡介,而後進一步介紹相關的基本概念,之後詳細的介紹Apriori演算法的具體策略和步驟,最後給

動態規劃案例python版本

最近幾天一直在看有關動態規劃的演算法,整理了一些常見案例,主要是求最長公共子序列,最長公共子串,最長遞增子序列,最長迴文子串,硬幣的組合數,硬幣的最少組合方法,最小編輯距離,揹包問題(01揹包,完全揹包,多重揹包)等方面的經典案例求解。 這些案例大部分都是用python實現

利用redis的訂閱和釋出來實現實時監控的一個DEMOPython版本

       redis的list型別有個很好的特性,就是每次新增元素後會返回當前list的長度,利用這個特點,我們可以監控它的長度,比如我們的key是使用者註冊的IP地址,list中存放的是已經在此IP地址上註冊的使用者的ID,當用戶數超過1000的時候來發一個告警,而r

ceph部署實踐luminous版本

作者:【吳業亮】 一、準備環境 4臺adminos7環境,儲存節點上兩塊磁碟(sda作業系統,sdb資料盤) 172.16.8.91 client 172.16.8.92 admin 172.16.8.93 storage1 172.16.8.9

機器學習&深度學習實踐python系列----Linear Regression線性迴歸

    今天和一位師兄決定複習一下Andrew Ng的機器學習和深度學習教程理論知識,用Python實現教程中的練習。教程分為:     我們決定從機器學習開始,逐漸實現。     寫這個系列主要

社交網路影響力最大化——貪心演算法實現Python實現

#!/usr/bin/env python # coding=UTF-8 from nose.tools import * from networkx import * from linear_threshold_clime import * from linear_threshold import * i

對稱加密演算法——DES演算法python實現

一、DES演算法描述         DES演算法總的說來可以兩部分組成: 1、對金鑰的處理。這一部分是把我們用的64位金鑰(實際用的56位,去掉了8個奇偶校驗位)分散成16個48位的子金鑰。 2、對資料的加密。通過第一步生成的子金鑰來加密我們所要加密的資料,最終生成密文。 下面就通過這兩

yum無法安裝軟件python版本問題

imp led pos yourself there round org share req 遇到如下問題:[root@sa yum.repos.d]# yum repolistThere was a problem importing one of the Python

拓撲排序|Topological Sort類演算法題心得PYTHON

拓撲排序 尋找專案之間依賴順序的過程稱為拓撲排序(topological sorting)。   首先要了解有向無環圖|Directed Acyclic Graph: 用字典表示:G = { 'a':'bce', 'b':'d','c':'d','d':'','e':'cd'} Key

selenium+chrome headless完成自動百度八斗平臺的錄入問題python版本為2.7

# -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import os from selenium import webdriver from selenium.webdriver

機器學習實踐十七—sklearn之無監督學習-K-means演算法

一、無監督學習概述 什麼是無監督學習 之所以稱為無監督,是因為模型學習是從無標籤的資料開始學習的。 無監督學習包含演算法 聚類 K-means(K均值聚類) 降維

機器學習實踐十五—sklearn之分類演算法-邏輯迴歸、精確率、召回率、ROC、AUC

邏輯迴歸雖然名字中帶有迴歸兩字,但它實際是一個分類演算法。 一、邏輯迴歸的應用場景 廣告點選率 是否為垃圾郵件 是否患病 金融詐騙 虛假賬號 看到上面的例子,我們可以發現其中的特點,那就是都屬於兩個類別之間的判斷。 邏輯迴歸就是

【機器學習】Apriori演算法——原理及程式碼實現Python

Apriopri演算法 Apriori演算法在資料探勘中應用較為廣泛,常用來挖掘屬性與結果之間的相關程度。對於這種尋找資料內部關聯關係的做法,我們稱之為:關聯分析或者關聯規則學習。而Apriori演算法就是其中非常著名的演算法之一。關聯分析,主要是通過演算法在大規模資料集中尋找頻繁項集和關聯規則。

演算法基礎--hash表Python

雜湊查詢是通過計算資料元素的儲存地址進行查詢的一種方法。 將元素通過某個函式,轉化為一個數(x),儘可能的讓這些元素對應的數具有唯一性,查詢時即可通過函式f(x)來找到元素所在的為位置(hash表也就是某種函式的對應關係) #除法取餘法來實現的雜湊函式 def myHas

實踐案例:使用開源工具從視訊中構建人臉檢測模型Python實現

介紹 近年來,計算機視覺這個奇妙的領域已經發展到獨樹一幟的地步。在世界各地已經有大量的應用程式在廣泛使用。 我在這個領域最喜歡的事情之一是我們的社群擁抱開源概念的想法。即使是大型科技巨頭也願意與每個人分享新的突破和創新,這樣技術就不會成為“富人的專利”。 其中一種技術是人臉檢測,它在實際

Leetcode初級演算法 打家劫舍動態規劃Python實現

問題描述: 演算法思想: 該問題的內在邏輯結構依然是動態規劃裡的經典結構。最關鍵的是推出狀態轉移方程,當前規模的對應解法由更低規模的解法,彷彿拾級而上,站在前人的肩膀上不斷攀登。 實際操作起來,比較實用的方法如下:固定一個比較小的規模n, 進行思維實驗。 例子:

【資料結構與演算法】八大排序整理python+java

1.氣泡排序 氣泡排序很簡單,就是從第一個數開始,把數依次和後面一個數比較,大的數交換位置,直到陣列中最後一個數。 與此同時用end限定陣列的結尾。 arry = [2,4,6,8,1,9,0] def swap(arry,i,j): tem = ar