中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

武漢軟件100強(qiáng)企業(yè)名單北京官方seo搜索引擎優(yōu)化推薦

武漢軟件100強(qiáng)企業(yè)名單,北京官方seo搜索引擎優(yōu)化推薦,河北做it的網(wǎng)站,南寧做網(wǎng)站推廣nnsomDES算法 一、算法介紹1.1 背景1.2 原理1.3 基本功能函數(shù)1.3.1 初始置換函數(shù) I P IP IP1.3.2 f f f 輪函數(shù)1.3.3 逆初始置換函數(shù) I P ? 1 IP^{-1} IP?1 1.4 子密鑰的生成 二、代碼實(shí)現(xiàn)2.1 子密鑰生成實(shí)現(xiàn)2.2 DES加解密實(shí)現(xiàn)2.3 完整代碼 三、演示效果 一、算法介紹 1.1 背景…

DES算法

一、算法介紹

1.1 背景

DES 算法是由美國(guó) IBM 公司在 20 世紀(jì) 70 年代提出,并被美國(guó)政府、美國(guó)國(guó)家標(biāo)準(zhǔn)局和美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)采納和承認(rèn)的一種標(biāo)準(zhǔn)加密算法。

它屬于分組加密算法,即在明文加密和密文解密過程中,信息都是按照固定長(zhǎng)度分組后進(jìn)行處理的。混淆擴(kuò)散是它采用的兩個(gè)最重要的安全特性。

混淆是指通過密碼算法使明文和密文以及密鑰的關(guān)系非常復(fù)雜,無法從數(shù)學(xué)上描述或者統(tǒng)計(jì)。擴(kuò)散是指明文和密鑰中每一位信息的變動(dòng),都會(huì)影響到密文中許多位信息的變動(dòng),從而隱藏統(tǒng)計(jì)上的特性,增加密碼的安全。

1.2 原理

DES 算法將明文分成 64 位大小的眾多數(shù)據(jù)塊,即分組長(zhǎng)度為 64 位,同時(shí)用 64 位密鑰(有效密鑰 56 位)對(duì) 64 位明文信息加密,最終形成 64 位的密文。如果明文長(zhǎng)度不足 64 位,則將其擴(kuò)展為 64 位(如補(bǔ)零等方法)。

具體加密過程,首先是將輸入的數(shù)據(jù)進(jìn)行初始換位( I P IP IP),即將明文 M M M 中數(shù)據(jù)的排列順序按一定的規(guī)則重新排列,生成新的數(shù)據(jù)序列,以打亂原來的次序。然后將變換后的數(shù)據(jù)平分成左右兩部分,左邊記為 L 0 L_{0} L0?,右邊記為 R 0 R_{0} R0?,然后對(duì) R 0 R_{0} R0? 實(shí)行在子密鑰(由加密密鑰產(chǎn)生)控制下的變換 f f f,結(jié)果記為 f ( R 0 , K 1 ) f(R_{0},K_{1}) f(R0?,K1?),再與 L 0 L_{0} L0? 做逐位異或運(yùn)算,其結(jié)果記為 R 1 R_{1} R1? R 0 R_{0} R0? 則作為下一輪的 L 1 L_{1} L1?。如此循環(huán) 16 輪,最后得到 L 16 L_{16} L16?、 R 16 R_{16} R16?。再對(duì) L 16 L_{16} L16?、 R 16 R_{16} R16? 實(shí)行逆初始置換 I P ? 1 IP^{-1} IP?1,即可得到加密數(shù)據(jù)。
解密過程與此類似,不同之處僅在于子密鑰的使用順序正好相反。

DES 全部 16 輪的加密過程如圖所示:
在這里插入圖片描述

1.3 基本功能函數(shù)

1.3.1 初始置換函數(shù) I P IP IP

它的作用是把輸入的 64 位數(shù)據(jù)塊的排列順序打亂,每位數(shù)據(jù)按照下面換位規(guī)則重新組合;即將第 58 位換到第 1 位,第 50 位換到第 2 位,……,依次類推;重組后的 64 位輸出分為 L 0 L_{0} L0?、 R 0 R_{0} R0?(左、右)兩部分,每部分分別為 32 位。初始置換如表如下所示:

在這里插入圖片描述

R 0 R_{0} R0? K 1 K_{1} K1? 經(jīng)過 變換后的輸出結(jié)果,再和 L 0 L_{0} L0?進(jìn)行異或運(yùn)算,輸出結(jié)果做為 R 1 R_{1} R1? R 0 R_{0} R0? 則賦給 L 1 L_{1} L1? L 1 L_{1} L1? R 1 R_{1} R1? 同樣再做類似運(yùn)算生成 L 2 L_{2} L2? R 2 R_{2} R2?,……,經(jīng)過 16次運(yùn)算后生成 L 16 L_{16} L16? R 16 R_{16} R16?。

1.3.2 f f f 輪函數(shù)

f f f 輪函數(shù)是多個(gè)置換函數(shù)和替代函數(shù)的組合函數(shù),它將 32 位比特的輸入變換為 32 位的輸出; R i R_{i} Ri? 經(jīng)過擴(kuò)展運(yùn)算 E E E 變換后擴(kuò)展為 48 位的 E ( R i ) E(R_{i}) E(Ri?) ,與 K i + 1 K_{i+1} Ki+1? 進(jìn)行異或運(yùn)算后輸出的結(jié)果分成 8 組,每組 6 比特的并聯(lián) B B B B B B= B 1 B_{1} B1? B 2 B_{2} B2? B 3 B_{3} B3? B 4 B_{4} B4? B 5 B_{5} B5? B 6 B_{6} B6? B 7 B_{7} B7? B 8 B_{8} B8?,再經(jīng)過 8 個(gè) S S S 盒的選擇壓縮運(yùn)算轉(zhuǎn)換為 4 位,8 個(gè) 4 位合并為 32 位后再經(jīng)過 P P P 變換輸出為 32 位的 f ( R i , K i + 1 ) f(R_{i},K_{i+1}) f(Ri?,Ki+1?) 。其中,擴(kuò)展運(yùn)算 E E E 與置換 P P P 主要作用是增加算法的擴(kuò)展效果。

f f f 輪函數(shù)處理流程如下圖所示:

在這里插入圖片描述

1.3.3 逆初始置換函數(shù) I P ? 1 IP^{-1} IP?1

它將 L 16 L_{16} L16? R 16 R_{16} R16? 作為輸入,進(jìn)行逆初始換位得到密文輸出。逆初始換位是初始位的逆運(yùn)算,逆初始置換的換位規(guī)則如下表所示:

在這里插入圖片描述

1.4 子密鑰的生成

具體子密鑰的產(chǎn)生流程如圖所示:
在這里插入圖片描述
輸入的初始密鑰值為 64 位;但 DES 算法規(guī)定,64 位初始密鑰中第 8、16、……、64 位是奇偶檢驗(yàn)位,不參與 DES 運(yùn)算。所以,實(shí)際可用位數(shù)只有56 位,經(jīng)過縮小選擇換位表即置換選擇 P C 1 PC1 PC1 的變換后,初始密鑰的位數(shù)由 64 位變成了 56 位,將其平分為兩部分 C 0 C_{0} C0?(28 位)、 D 0 D_{0} D0?(28 位)。然后,分別進(jìn)行第 1 次循環(huán)左移,得到 C 1 C_{1} C1? D 1 D_{1} D1?,需要注意的是,循環(huán)左移需經(jīng)過 16 輪次,第 i i i 輪迭代時(shí)對(duì)應(yīng)的左移位數(shù)要依據(jù)移位表的規(guī)則進(jìn)行。接著,將 C 1 C_{1} C1?、 D 1 D_{1} D1? 合并后得到 56 位的輸出結(jié)果,再經(jīng)過縮小選擇換位表即置換選擇 P C 2 PC2 PC2 ,從而得到了密鑰 K 1 K_{1} K1?(48 位),依次類推,便可得到 K 2 K_{2} K2?、……、 K 16 K_{16} K16?。

二、代碼實(shí)現(xiàn)

2.1 子密鑰生成實(shí)現(xiàn)

# ========================================
# 一、子密鑰生成
# (1) 初始置換 64->56
# 64位的種子密鑰經(jīng)過PC_1置換后,生成56位的密鑰
# (2) 劃分 56->(28,28)
# 經(jīng)過初始置換后的56位密鑰被均分成C0和D0兩部分
# (3) 循環(huán)左移
# 第一輪,C0和D0根據(jù)移位次數(shù)表各自進(jìn)行循環(huán)左移
# 得到C1和D1
# 每一輪的C和D值是由上一輪的C和D值循環(huán)左移得到的
# (4) 合并 (28,28)->56->48
# 左移后的兩部分再次合并,通過一個(gè)選擇壓縮表(PC_2)
# 得到這一輪的子密鑰
# (5)重復(fù)3、4操作,最終得到16個(gè)子密鑰
# ========================================# 置換選擇表1(PC_1) 64->56
PC_1 = [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]# 選擇壓縮表2(PC_2) 56->48
PC_2 = [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]# 移位次數(shù)表
shift_num = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]def pc_1_change(bin_key):"""初始置換64位的種子密鑰經(jīng)過PC_1置換后,生成56位的密鑰"""return [bin_key[i - 1] for i in PC_1]  # 列表形式def shift_left(bin_key, num):"""實(shí)現(xiàn)C和D的循環(huán)左移"""return bin_key[num:] + bin_key[:num]def pc_2_change(bin_key):"""選擇壓縮56位的密鑰經(jīng)過PC_2壓縮,生成48位子密鑰"""return ''.join([bin_key[i - 1] for i in PC_2])  # 列表轉(zhuǎn)字符串def get_subkey_list(bin_key):"""生成16輪的加解子密鑰"""subkey_list = []  # 存儲(chǔ)16輪子密鑰# 1. 初始置換 64->58temp = pc_1_change(bin_key)# 2. 循環(huán)左移for i in shift_num:temp[:28] = shift_left(temp[:28], i)  # C部分循環(huán)左移temp[28:] = shift_left(temp[28:], i)  # D部分循環(huán)左移subkey_list.append(pc_2_change(temp))  # 生成子密鑰return subkey_list

2.2 DES加解密實(shí)現(xiàn)

# ========================================
# 二、DES加解密實(shí)現(xiàn)
# ========================================# 初始置換表IP 64->64
IP = [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]# 逆置換表_IP 64->64
_IP = [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]# 擴(kuò)展置換表E 32->48
E = [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]# S盒 48->32
S1 = [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]
S2 = [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]
S3 = [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]
S4 = [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]
S5 = [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]
S6 = [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]
S7 = [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]
S8 = [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 = [S1, S2, S3, S4, S5, S6, S7, S8]# P盒
P = [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]# encrypt
def ip_change(bin_text):"""初始置換"""return [bin_text[i - 1] for i in IP]def s_box(bin_result):"""S盒替換"""int_result = []result = ''for i in range(8):# 二進(jìn)制行號(hào)bin_row = bin_result[i][0] + bin_result[i][5]# 二進(jìn)制列號(hào)bin_col = ''.join(bin_result[i][j] for j in range(1, 5))# 獲取對(duì)應(yīng)的十進(jìn)制數(shù)int_result.append(S[i][16 * int(bin_row, base=2) + int(bin_col, base=2)])# 十進(jìn)制轉(zhuǎn)成二進(jìn)制result += bin(int_result[-1])[2:].zfill(4)return resultdef p_box(result):"""P盒置換"""return ''.join(result[i - 1] for i in P)def f(R, bin_key):"""輪函數(shù)f()"""# 1.將R由32位擴(kuò)展成48位R_ext = [R[i - 1] for i in E]# 2.與子密鑰進(jìn)行逐位異或bin_temp = [str(int(r) ^ int(k)) for r, k in zip(R_ext, bin_key)]# 6個(gè)字符為一組,共8組bin_result = [''.join(bin_temp[i:i + 6]) for i in range(0, len(bin_temp), 6)]# 3.S盒替換 48->32result = s_box(bin_result)# 4.P盒置換 32->32return p_box(result)def _ip_change(bin_text):"""進(jìn)行IP-1逆置換"""return ''.join(bin_text[i - 1] for i in _IP)def des_cipher(bin_text, bin_key, reverse_keys=False):"""通用DES加密解密函數(shù)"""# 1. 初始置換IPbin_text = ip_change(bin_text)# 2. 分成左右兩部分L、RL, R = bin_text[:32], bin_text[32:]# 3. 獲得16輪子密鑰subkey_list = get_subkey_list(bin_key)if reverse_keys:subkey_list = subkey_list[::-1]  # 解密時(shí)反轉(zhuǎn)子密鑰列表# 4. 進(jìn)行16輪迭代for i in subkey_list:R_temp = R# 輪函數(shù)f()結(jié)果和L進(jìn)行異或R = ''.join(str(int(r) ^ int(l)) for r, l in zip(f(R, i), L))L = R_temp# 5. 進(jìn)行IP-1逆置換 64->64return _ip_change(R + L)  # 輸出二進(jìn)制字符串# 使用示例
def str2bin(text):"""字符串轉(zhuǎn)二進(jìn)制字符串"""return ''.join(bin(byte)[2:].zfill(8) for byte in text.encode())def bin2str(bin_text):"""二進(jìn)制字符串轉(zhuǎn)字符串"""# 1.將二進(jìn)制字符串按8位分割,并轉(zhuǎn)換為字節(jié)數(shù)組byte_array = bytearray(int(i, 2) for i in re.findall(r'.{8}', bin_text) if int(i, 2) != 0)# 2.將字節(jié)序列解碼為字符串return byte_array.decode()def is_valid_key(key):"""檢查密鑰是否有效 64bit"""return len(key.encode()) == 8def des_encrypt(plaintext, key):"""DES加密"""# 1.明文轉(zhuǎn)成二進(jìn)制字符串, 0填充至64的倍數(shù)bin_plaintext = str2bin(plaintext)padding_len = (64 - (len(bin_plaintext) % 64)) % 64bin_padding_plaintext = bin_plaintext + '0' * padding_len# 2.進(jìn)行64位分組加密bin_group_64 = re.findall(r'.{64}', bin_padding_plaintext)bin_ciphertext = ''for g in bin_group_64:bin_ciphertext += des_cipher(g, str2bin(key))# 3.密文轉(zhuǎn)為16進(jìn)制輸出bin_group_4 = re.findall(r'.{4}', bin_ciphertext)hex_ciphertext = ''for g in bin_group_4:hex_ciphertext += format(int(g, 2), 'x')return hex_ciphertextdef des_decrypt(hex_ciphertext, key):"""DES解密"""# 1.16進(jìn)制密文轉(zhuǎn)為2進(jìn)制字符串bin_ciphertext = ''.join(bin(int(h, 16))[2:].zfill(4) for h in hex_ciphertext)# 2.進(jìn)行64位分組解密bin_group_64 = re.findall(r'.{64}', bin_ciphertext)bin_deciphertext = ''for g in bin_group_64:bin_deciphertext += des_cipher(g, str2bin(key), reverse_keys=True)# 3.將解密密文轉(zhuǎn)為字符串輸出return bin2str(bin_deciphertext)

2.3 完整代碼

import re# ========================================
# 一、子密鑰生成
# (1) 初始置換 64->56
# 64位的種子密鑰經(jīng)過PC_1置換后,生成56位的密鑰
# (2) 劃分 56->(28,28)
# 經(jīng)過初始置換后的56位密鑰被均分成C0和D0兩部分
# (3) 循環(huán)左移
# 第一輪,C0和D0根據(jù)移位次數(shù)表各自進(jìn)行循環(huán)左移
# 得到C1和D1
# 每一輪的C和D值是由上一輪的C和D值循環(huán)左移得到的
# (4) 合并 (28,28)->56->48
# 左移后的兩部分再次合并,通過一個(gè)選擇壓縮表(PC_2)
# 得到這一輪的子密鑰
# (5)重復(fù)3、4操作,最終得到16個(gè)子密鑰
# ========================================# 置換選擇表1(PC_1) 64->56
PC_1 = [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]# 選擇壓縮表2(PC_2) 56->48
PC_2 = [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]# 移位次數(shù)表
shift_num = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]def pc_1_change(bin_key):"""初始置換64位的種子密鑰經(jīng)過PC_1置換后,生成56位的密鑰"""return [bin_key[i - 1] for i in PC_1]  # 列表形式def shift_left(bin_key, num):"""實(shí)現(xiàn)C和D的循環(huán)左移"""return bin_key[num:] + bin_key[:num]def pc_2_change(bin_key):"""選擇壓縮56位的密鑰經(jīng)過PC_2壓縮,生成48位子密鑰"""return ''.join([bin_key[i - 1] for i in PC_2])  # 列表轉(zhuǎn)字符串def get_subkey_list(bin_key):"""生成16輪的加解子密鑰"""subkey_list = []  # 存儲(chǔ)16輪子密鑰# 1. 初始置換 64->58temp = pc_1_change(bin_key)# 2. 循環(huán)左移for i in shift_num:temp[:28] = shift_left(temp[:28], i)  # C部分循環(huán)左移temp[28:] = shift_left(temp[28:], i)  # D部分循環(huán)左移subkey_list.append(pc_2_change(temp))  # 生成子密鑰return subkey_list# ========================================
# 二、DES加解密實(shí)現(xiàn)
# ========================================# 初始置換表IP 64->64
IP = [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]# 逆置換表_IP 64->64
_IP = [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]# 擴(kuò)展置換表E 32->48
E = [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]# S盒 48->32
S1 = [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]
S2 = [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]
S3 = [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]
S4 = [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]
S5 = [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]
S6 = [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]
S7 = [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]
S8 = [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 = [S1, S2, S3, S4, S5, S6, S7, S8]# P盒
P = [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]# encrypt
def ip_change(bin_text):"""初始置換"""return [bin_text[i - 1] for i in IP]def s_box(bin_result):"""S盒替換"""int_result = []result = ''for i in range(8):# 二進(jìn)制行號(hào)bin_row = bin_result[i][0] + bin_result[i][5]# 二進(jìn)制列號(hào)bin_col = ''.join(bin_result[i][j] for j in range(1, 5))# 獲取對(duì)應(yīng)的十進(jìn)制數(shù)int_result.append(S[i][16 * int(bin_row, base=2) + int(bin_col, base=2)])# 十進(jìn)制轉(zhuǎn)成二進(jìn)制result += bin(int_result[-1])[2:].zfill(4)return resultdef p_box(result):"""P盒置換"""return ''.join(result[i - 1] for i in P)def f(R, bin_key):"""輪函數(shù)f()"""# 1.將R由32位擴(kuò)展成48位R_ext = [R[i - 1] for i in E]# 2.與子密鑰進(jìn)行逐位異或bin_temp = [str(int(r) ^ int(k)) for r, k in zip(R_ext, bin_key)]# 6個(gè)字符為一組,共8組bin_result = [''.join(bin_temp[i:i + 6]) for i in range(0, len(bin_temp), 6)]# 3.S盒替換 48->32result = s_box(bin_result)# 4.P盒置換 32->32return p_box(result)def _ip_change(bin_text):"""進(jìn)行IP-1逆置換"""return ''.join(bin_text[i - 1] for i in _IP)def des_cipher(bin_text, bin_key, reverse_keys=False):"""通用DES加密解密函數(shù)"""# 1. 初始置換IPbin_text = ip_change(bin_text)# 2. 分成左右兩部分L、RL, R = bin_text[:32], bin_text[32:]# 3. 獲得16輪子密鑰subkey_list = get_subkey_list(bin_key)if reverse_keys:subkey_list = subkey_list[::-1]  # 解密時(shí)反轉(zhuǎn)子密鑰列表# 4. 進(jìn)行16輪迭代for i in subkey_list:R_temp = R# 輪函數(shù)f()結(jié)果和L進(jìn)行異或R = ''.join(str(int(r) ^ int(l)) for r, l in zip(f(R, i), L))L = R_temp# 5. 進(jìn)行IP-1逆置換 64->64return _ip_change(R + L)  # 輸出二進(jìn)制字符串# 使用示例
def str2bin(text):"""字符串轉(zhuǎn)二進(jìn)制字符串"""return ''.join(bin(byte)[2:].zfill(8) for byte in text.encode())def bin2str(bin_text):"""二進(jìn)制字符串轉(zhuǎn)字符串"""# 1.將二進(jìn)制字符串按8位分割,并轉(zhuǎn)換為字節(jié)數(shù)組byte_array = bytearray(int(i, 2) for i in re.findall(r'.{8}', bin_text) if int(i, 2) != 0)# 2.將字節(jié)序列解碼為字符串return byte_array.decode()def is_valid_key(key):"""檢查密鑰是否有效 64bit"""return len(key.encode()) == 8def des_encrypt(plaintext, key):"""DES加密"""# 1.明文轉(zhuǎn)成二進(jìn)制字符串, 0填充至64的倍數(shù)bin_plaintext = str2bin(plaintext)padding_len = (64 - (len(bin_plaintext) % 64)) % 64bin_padding_plaintext = bin_plaintext + '0' * padding_len# 2.進(jìn)行64位分組加密bin_group_64 = re.findall(r'.{64}', bin_padding_plaintext)bin_ciphertext = ''for g in bin_group_64:bin_ciphertext += des_cipher(g, str2bin(key))# 3.密文轉(zhuǎn)為16進(jìn)制輸出bin_group_4 = re.findall(r'.{4}', bin_ciphertext)hex_ciphertext = ''for g in bin_group_4:hex_ciphertext += format(int(g, 2), 'x')return hex_ciphertextdef des_decrypt(hex_ciphertext, key):"""DES解密"""# 1.16進(jìn)制密文轉(zhuǎn)為2進(jìn)制字符串bin_ciphertext = ''.join(bin(int(h, 16))[2:].zfill(4) for h in hex_ciphertext)# 2.進(jìn)行64位分組解密bin_group_64 = re.findall(r'.{64}', bin_ciphertext)bin_deciphertext = ''for g in bin_group_64:bin_deciphertext += des_cipher(g, str2bin(key), reverse_keys=True)# 3.將解密密文轉(zhuǎn)為字符串輸出return bin2str(bin_deciphertext)def des_run():"""DES啟動(dòng)界面"""flag = Truewhile flag:print('=' * 3, "DES加密解密", '=' * 3)print('[1]加密')print('[2]解密')print('[0]退出')choice = input('請(qǐng)輸入你的選擇:')match choice:case '0':flag = Falsecase '1':plaintext = input('請(qǐng)輸入明文:')key = input('請(qǐng)輸入密鑰(64bit):')if not is_valid_key(key):print('密鑰長(zhǎng)度錯(cuò)誤')continueciphertext = des_encrypt(plaintext, key)print(f'密文:{ciphertext}')case '2':ciphertext = input('請(qǐng)輸入密文:')key = input('請(qǐng)輸入密鑰(64bit):')if not is_valid_key(key):print('密鑰長(zhǎng)度錯(cuò)誤')continueprint(f'解密:{des_decrypt(ciphertext, key)}')case _:print('輸入錯(cuò)誤')print('=' * 15)if __name__ == '__main__':des_run()

三、演示效果

在這里插入圖片描述

http://www.risenshineclean.com/news/65585.html

相關(guān)文章:

  • 資陽(yáng)網(wǎng)站設(shè)計(jì)搜狗搜索網(wǎng)
  • 互聯(lián)網(wǎng)行業(yè) 英文郴州seo網(wǎng)絡(luò)優(yōu)化
  • 濟(jì)南做網(wǎng)站多少錢站長(zhǎng)工具pr值查詢
  • 全免費(fèi)云游戲網(wǎng)頁(yè)在線玩seo快速排名軟件價(jià)格
  • 東莞seo網(wǎng)站推廣個(gè)人怎么做免費(fèi)百度推廣
  • 重慶網(wǎng)站建設(shè)有限公司拼多多運(yùn)營(yíng)
  • 網(wǎng)站運(yùn)營(yíng)模式有哪些短網(wǎng)址鏈接生成
  • 現(xiàn)在最靠譜的購(gòu)物網(wǎng)站有哪些天津seo實(shí)戰(zhàn)培訓(xùn)
  • 網(wǎng)站開發(fā)師培訓(xùn)網(wǎng)絡(luò)營(yíng)銷手段有哪四種
  • 深圳網(wǎng)站開發(fā)優(yōu)化營(yíng)商環(huán)境 助推高質(zhì)量發(fā)展
  • 建設(shè)一個(gè)網(wǎng)站需要提供什么手續(xù)seo網(wǎng)絡(luò)推廣專員
  • 十堰建設(shè)網(wǎng)站首頁(yè)無錫seo公司
  • 怎樣查看網(wǎng)站是用什么cms 做的企業(yè)培訓(xùn)課程有哪些
  • 權(quán)重高的網(wǎng)站是幾vue seo優(yōu)化
  • 個(gè)人網(wǎng)站頁(yè)面設(shè)計(jì)需要那些步驟seo教學(xué)平臺(tái)
  • 北京朝陽(yáng)不限購(gòu)小戶型天津seo培訓(xùn)
  • 住房和城鄉(xiāng)建設(shè)部網(wǎng)站辦事大廳各大免費(fèi)推廣網(wǎng)站
  • 山東省住房和建設(shè)廳網(wǎng)站百度網(wǎng)址大全免費(fèi)下載
  • 延安免費(fèi)做網(wǎng)站怎么創(chuàng)作自己的網(wǎng)站
  • 設(shè)計(jì)師培訓(xùn)學(xué)費(fèi)長(zhǎng)春seo優(yōu)化企業(yè)網(wǎng)絡(luò)躍升
  • 水墨畫風(fēng)格網(wǎng)站網(wǎng)站快速排名互點(diǎn)軟件
  • 做兼職最好的網(wǎng)站杭州百度推廣開戶
  • 5g網(wǎng)絡(luò)快手seo關(guān)鍵詞優(yōu)化
  • 太原網(wǎng)站建設(shè)王道下拉惠整站seo排名要多少錢
  • 修水今日疫情長(zhǎng)沙官網(wǎng)seo
  • 東莞微聯(lián)建站網(wǎng)絡(luò)營(yíng)銷教學(xué)網(wǎng)站
  • 廣告網(wǎng)站設(shè)計(jì)公司好嗎做免費(fèi)推廣的平臺(tái)
  • 做網(wǎng)站簡(jiǎn)單嗎seo推廣公司招商
  • 嘉興推廣公司seo百度快速排名
  • 設(shè)計(jì)師逛的網(wǎng)站購(gòu)物網(wǎng)站