DES演算法實踐(python版本)
一、 DES演算法原理概述
預備知識
-
64位為一個分組,當成明文輸入DES演算法模型,輸出同樣長度64位的密文。
-
對稱加密,加密金鑰也是解密金鑰,金鑰定義了加密過程。
-
金鑰構成:64位,每8位的最後一位用於奇偶校驗,所以實際金鑰長度為56位。
-
基本過程是換位和置換(根據置換矩陣)
演算法核心概要
-
總體結構
-
Feistel輪函式
-
子金鑰生成
-
解密過程
資訊空間處理:
-
原始明文訊息的處理:最後的分組不足64位時,填充的位元組為缺失的位元組數目。
-
明文分組結構:$M = m_1m_2…m_{64} , m_i ∈ {0, 1},i= 1…64 $
-
密文分組結構: $C = c_1c_2…c_{64} , c_i ∈ {0, 1},i= 1…64 $
-
金鑰結構:$K = k_1k_2…k_{64} , k_i ∈ {0, 1},i= 1…64 $
加密過程:
64位原始密文M經IP初始置換得到
經過16次迭代 得到
然後在經過 逆變換得到密文。
解密過程:
加密逆向進行分析。和加密不同的是,子金鑰排程過程為逆序,其他一致。
初始置換:
給定一個固定的初始置換IP矩陣來重排明文塊M中的二進位制位。得到二進位制串
表: IP置換表(8 * 8)(row * col 下同)
迭代T
-
迭代規則:交叉迭代。 . 為子金鑰,長度為 為 輪函式。
-
16次迭代後產生
-
左右交換輸出$R_{16}L_{16}
逆置換
表: 逆置換表(8 * 8)
輪函式
密碼函式f(R, K)
接受兩個輸入:32 位的資料和 48 位的子金鑰。然後:
-
通過表 E 進行擴充套件置換 (表),將輸入的 32 位資料擴充套件為 48 位;
-
將擴充套件後的 48 位資料與 48 位的子金鑰進行異或運算;
-
將異或得到的 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 位的二進位制數。
-
把通過 S 表置換得到的 8 個 4 位連在一起,形成一個 32 位的資料。然後將該 32 位資料通過表 P 進行置換(稱為P-置換),置換後得到一個仍然是 32 位的結果資料,這就是
f(R, K)
函式的輸出。
三個表:E擴充套件置換表(8 * 6),S盒置換表(4 * 16),P-置換表(8 * 4)
子金鑰生成
-
對金鑰K中的56個非校驗位實現PC-1置換,得到 ,即置換後的前28位和後28位。
-
對 分別進行迴圈左移操作,得到 ,當 時二進位制串左移一個位置,否則左移兩個位置。
-
對56位的 實行PC-2壓縮置換,得到48位的 。 然後 。
-
如果已經得到 ,密碼排程結束,否則轉步驟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++版本) tesorflow(python版本)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回滾工具_flashback(python版本)
update、delete的條件寫錯甚至沒有寫,導致資料操作錯誤,需要恢復被誤操作的行記錄。這種情形,其實時有發生,可以選擇用備份檔案+binlog來恢復到測試環境,然後再做資料修復,但是這樣其實需要耗費一定的時間跟資源。
其實,如果binlog format為row,binlog檔案中是會詳
Apriori演算法介紹(Python實現)
導讀:
隨著大資料概念的火熱,啤酒與尿布的故事廣為人知。我們如何發現買啤酒的人往往也會買尿布這一規律?資料探勘中的用於挖掘頻繁項集和關聯規則的Apriori演算法可以告訴我們。本文首先對Apriori演算法進行簡介,而後進一步介紹相關的基本概念,之後詳細的介紹Apriori演算法的具體策略和步驟,最後給
動態規劃案例(python版本)
最近幾天一直在看有關動態規劃的演算法,整理了一些常見案例,主要是求最長公共子序列,最長公共子串,最長遞增子序列,最長迴文子串,硬幣的組合數,硬幣的最少組合方法,最小編輯距離,揹包問題(01揹包,完全揹包,多重揹包)等方面的經典案例求解。
這些案例大部分都是用python實現
利用redis的訂閱和釋出來實現實時監控的一個DEMO(Python版本)
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