DES加解密原理

2021-10-23 15:20:46 字數 2904 閱讀 6043

des演算法是典型的分組密碼,加密前先將明文編碼表示後的二進位制序列劃分成長度為64b的分組,des演算法的金鑰也是長度為64b的二進位制序列,金鑰中第8、16、24、32、40、48、56、64位為奇偶校驗位。

des演算法的基本步驟:

*1 初始置換ip

*2 16輪迭代處理

*3 互換左、右32位

*4 初始逆置換ip-1

初始置換ip是將64b的明文進行位置重排,通過ip運算得到乙個亂序的64b明文組,置換後的資料平均分為左右兩段,用l和r來表示,這兩部分資料是下一代迭代變換的初始輸入。

每輪迭代只對右邊的32b進行一系列加密變換f,加密變換包括選擇運算e、金鑰加密運算、選擇壓縮運算s,置換運算p,在一輪迭代即將結束時,把上一輪左邊32b與本輪經加密變換f得到的32b進行模二相加,作為下一輪迭代時右邊的段,並將上一輪右邊的未經變換的段直接送到左邊暫存器中作為下一輪迭代時左邊的段。

16輪迭代結束後,再將所得的左、右長度相等的l16和r16進行交換得到64b資料。

(1)選擇擴充套件運算e

將輸入的32b拓展成48b輸出,擴充套件方法是重複某些位置上的元素,共有16個位置上的元素被讀了兩次

(2)金鑰加密運算

將子金鑰產生器輸出的子金鑰k與選擇擴充套件運算e輸出的48b資料按位模二相加

(3)選擇壓縮運算s

48位元自左至右分成八組,每組6b,然後送入8個s盒。每個s盒能夠將6b的輸入轉化為4b的輸出(將輸入的第一位和第六位組成的二進位制數值作為橫座標,其它4b是縱座標,查詢s盒表得到最終數值),最後得到的十進位制數均用二進位制表示

(4)置換運算

對8個盒子中的資料進行座標變換

des加密過程共涉及16輪迭代,每輪使用乙個不同的48位子金鑰,共需16個子金鑰,這些子金鑰由初始輸入的64位金鑰產生,初始金鑰中有8位奇偶校驗位。通過16輪置換選擇和每輪左移位數加一得到16個子金鑰

利用逆初始置換表得到最後的密文。

金鑰與加密的金鑰相同,只是子金鑰的使用次序相反,得出最後的64b的明文

#初始置換表

#逆初始置換表

#選擇擴充套件運算表

#8個s盒表

#置換選擇pc-1表

#置換選擇pc-2表

#移位次數表

#置換def

table

(data,table1)

test =

for i in

range(0

,len

(table1)):

-1])

return test

#迴圈左移

defcyclicleft

(temp, num)

:

test =

for i in

range(0

,len

(temp)

):

(i + num)

%len

(temp)])

return test

#異或運算

defmyxor

(l, r)

:

test =

for i in

range(0

,len

(l))

:

^ r[i]

)return test

#將temp分為左半部分

defluniform

(temp)

:

test = temp[0:

len(temp)//2

]return test

#將temp分為右半部分

#合併def

merge

(l, r)

:

test =

for i in

range(0

,len

(l))

:

)for i in

range(0

,len

(l))

:

)return test

#生成子金鑰

#s盒#des加密

defdes

(text, key)

:

text1 = table(text, ip)

k = mydessubkey(key)

l0 = text1[0:

32]

r0 = text1[32:

64]for i in

range(0

,16):

l1 = r0

r1 = myxor(l0, myf(r0, k[i]

))

l0 = l1

r0 = r1

temp = merge(r1, l1)

c = table(temp, ip_1)

return c

#des解密

#將輸入的字串轉化為bit陣列

defstr2bitarray

(s):

ret = bitarray(

''.join(

[bin

(int

('1'

+hex

(c)[2:

],16)

)[3:

]for c in s.encode(

'utf-8')]

))return ret

defbitarray2str

(bit)

:return bit.tobytes(

).decode(

'utf-16'

)#進入主函式

輸入八位明文

輸入八位金鑰

DES可逆加解密

方法 des預設金鑰向量 private static byte keys des加密字串 待加密的字串 加密金鑰,要求為8位 加密成功返回加密後的字串,失敗返回源串 public static string encryptdes string encryptstring,string encryp...

iOS使用DES加解密

這裡使用框架提供的des加解密庫 首先引入標頭檔案 import 主要的加解密函式如下 字串加密 引數 plaintext 加密明文 key 金鑰 64位 nsstring encryptusedes nsstring plaintext key nsstring key size t numbyt...

python 實現DES加解密

from pydes import import base64 class des3 object def init self,key,iv 這裡金鑰key長度必須為16 24,偏移量ivs self.key key self.mode cbc self.iv iv 加密函式,如果text不是16的...