python代码实现des加密运算
时间: 2024-10-10 11:12:21 浏览: 93
DES(Data Encryption Standard),数据加密标准,是一种古老的对称加密算法。在Python中,我们可以使用第三方库如`pycryptodome`来实现DES加密。下面是一个简单的DESEDE加密的示例:
```python
from Crypto.Cipher import DES3
# 密钥和IV(初始化向量)
key = b'sixteen_byte_key' # 需要是16字节
iv = b'eight_byte_initialization_vector' # 需要是8字节
# 加密函数
def des_encrypt(plaintext):
cipher = DES3.new(key, DES3.MODE_CBC, iv)
ciphertext = cipher.encrypt(plaintext)
return ciphertext
# 测试加密
plaintext = b'this is a test string'
ciphertext = des_encrypt(plaintext)
print("原始文本:", plaintext)
print("加密后的文本:", ciphertext)
# 相关问题--
1. 使用DES3而不是DES的原因是什么?
2. 如果需要解密怎么办?
3. DES加密是否安全?它有哪些局限性?
```
注意:实际应用中,你需要妥善管理密钥和IV的安全,因为它们直接影响到数据的安全性。
相关问题
python手动实现des加密和解密算法,并且输出明文,密钥每轮的加密结果
下面是手动实现DES加密和解密算法的Python代码:
``` python
# -*- coding:utf-8 -*-
# 定义DES加密中用到的置换表
IP_TABLE = [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_INV_TABLE = [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]
E_TABLE = [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_TABLE = [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]
PC1_TABLE = [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]
PC2_TABLE = [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]
S_BOX = [
# 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]
]
]
SHIFT_TABLE = [1, 1, 2, 2, 2, 2, 2, 2,
1, 2, 2, 2, 2, 2, 2, 1]
# 将16进制字符串转化为二进制字符串
def hex_to_binary(hex_str):
return bin(int(hex_str, 16))[2:].zfill(64)
# 将二进制字符串转化为16进制字符串
def binary_to_hex(binary_str):
return hex(int(binary_str, 2))[2:]
# 生成子密钥
def generate_subkey(key):
subkeys = []
# 将密钥进行PC-1置换
key_bits = [int(key[index - 1]) for index in PC1_TABLE]
# 将置换后的密钥分为左右两部分
left_key = key_bits[:28]
right_key = key_bits[28:]
for shift in SHIFT_TABLE:
# 分别对左右两部分进行循环左移
left_key = left_key[shift:] + left_key[:shift]
right_key = right_key[shift:] + right_key[:shift]
# 将左右两部分组合后进行PC-2置换,生成子密钥
subkey = [left_key[index - 1] for index in PC2_TABLE[:28]]
subkey += [right_key[index - 29] for index in PC2_TABLE[28:]]
subkeys.append(subkey)
return subkeys
# 对明文进行初始置换
def initial_permutation(plaintext):
return [int(plaintext[index - 1]) for index in IP_TABLE]
# 对密文进行逆置换
def inverse_permutation(ciphertext):
return [int(ciphertext[index - 1]) for index in IP_INV_TABLE]
# 将48位密钥扩展为64位
def expand_key(key):
return [int(key[index - 1]) for index in E_TABLE]
# 进行S盒替换
def substitute(box, bits):
row = int(str(bits[0]) + str(bits[5]), 2)
col = int(''.join([str(bit) for bit in bits[1:5]]), 2)
return '{0:04b}'.format(box[row][col])
# 进行Feistel轮
def feistel(right, subkey):
# 将右半部分进行扩展
expanded = expand_key(right)
# 将扩展后的右半部分与子密钥进行异或操作
xored = [expanded[index] ^ subkey[index] for index in range(48)]
# 将异或的结果分为8组,每组6位,进行S盒替换
sboxed = [substitute(S_BOX[index], xored[index * 6:(index + 1) * 6]) for index in range(8)]
# 将S盒替换后的结果合并为一个32位的二进制字符串
sboxed_str = ''.join(sboxed)
# 将32位二进制字符串进行P置换,得到Feistel轮的结果
return [int(sboxed_str[index - 1]) for index in P_TABLE]
# 进行一轮加密
def encrypt_block(block, subkeys):
# 将明文进行初始置换
block_bits = initial_permutation(block)
left = block_bits[:32]
right = block_bits[32:]
# 进行16轮Feistel运算
for index in range(16):
new_right = [left[j] ^ feistel(right, subkeys[index])[j] for j in range(32)]
left = right
right = new_right
# 将左右两部分交换,进行逆置换,得到密文
block_bits = inverse_permutation(right + left)
return ''.join([str(bit) for bit in block_bits])
# 进行一轮解密
def decrypt_block(block, subkeys):
# 将密文进行初始置换
block_bits = initial_permutation(block)
left = block_bits[:32]
right = block_bits[32:]
# 进行16轮Feistel运算,加密的子密钥需逆序使用
for index in range(15, -1, -1):
new_right = [left[j] ^ feistel(right, subkeys[index])[j] for j in range(32)]
left = right
right = new_right
# 将左右两部分交换,进行逆置换,得到明文
block_bits = inverse_permutation(right + left)
return ''.join([str(bit) for bit in block_bits])
# 加密函数
def des_encrypt(plaintext, key):
# 将密钥转化为二进制字符串
key_bits = hex_to_binary(key)
# 生成子密钥
subkeys = generate_subkey(key_bits)
# 将明文按照64位一组分块
blocks = [plaintext[index:index + 16] for index in range(0, len(plaintext), 16)]
# 对每一组进行加密
ciphertext = ''
for block in blocks:
ciphertext += encrypt_block(hex_to_binary(block), subkeys)
# 将密文转化为16进制字符串
return binary_to_hex(ciphertext)
# 解密函数
def des_decrypt(ciphertext, key):
# 将密钥转化为二进制字符串
key_bits = hex_to_binary(key)
# 生成子密钥
subkeys = generate_subkey(key_bits)
# 将密文按照64位一组分块
blocks = [
des加密算法实现python
### DES加密算法的Python实现
#### 1. 初始化和常量定义
为了实现DES加密算法,首先需要定义一些必要的常量和初始化参数。这些包括初始置换表(IP)、逆初始置换表(IP^-1)以及其他用于密钥生成和轮函数的关键表格。
```python
_IP_table = [
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_inv_table = list(range(64))
for i in range(len(_IP_table)):
_IP_inv_table[_IP_table[i]-1] = i+1
_PC_1_table = ... # 密钥压缩置换表
_PC_2_table = ... # 子密钥选择表
_E_expansion_table = ... # 扩展置换表
_S_boxes = [...] # S盒替换矩阵
_P_permutation_table = ... # P置换表
```
#### 2. 初始置换 (Initial Permutation)
在实际编码时,可以创建一个名为`initialPermute()`的方法来执行此操作:
```python
def initialPermute(block):
permuted_block = [''] * len(_IP_table)
for i in range(len(_IP_table)):
permuted_block[i] = block[_IP_table[i]-1]
return ''.join(permuted_block)
```
#### 3. 反向初始置换(Inverse Initial Permutation)
同样地,对于反向过程也有相应的函数:
```python
def inverseIP(afterF):
ciphertext = ''
for i in _IP_inv_table:
ciphertext += afterF[i-1]
return ciphertext
```
#### 4. 轮函数(Round Function)
这是整个算法的核心部分之一,在这里实现了Feistel结构中的非线性变换。具体来说就是通过扩展E-box、S-boxes以及P-box完成一系列复杂的位运算。
```python
def roundFunction(Ln_minus_one, Rn_minus_one, K_round):
expanded_Rn = expandBits(Rn_minus_one, _E_expansion_table)
xor_result = bitwiseXOR(expanded_Rn, K_round)
sbox_output_bits = []
for box_index in range(8):
row = int(xor_result[box_index*6][:1]+xor_result[box_index*6][5:], 2)
col = int(''.join([str(int(bit)) for bit in xor_result[box_index*6][1:5]]), 2)
value_from_sbox = bin(_S_boxes[box_index][row][col])[2:].zfill(4)
sbox_output_bits.append(value_from_sbox)
concatenated_bits = ''.join(sbox_output_bits)
final_output = permutate(concatenated_bits, _P_permutation_table)
new_Ln = Rn_minus_one
new_Rn = bitwiseXOR(final_output, Ln_minus_one)
return new_Ln, new_Rn
```
#### 5. 主要逻辑流程控制
最后一步是编写主程序入口点,负责调用上述各个组件并管理整体工作流。
```python
class DESCipher(object):
def __init__(self, key):
self.key_schedule = generateKeySchedule(key)
def encrypt(self, plaintext):
blocks = divideIntoBlocks(padPlaintext(plaintext))
encrypted_blocks = []
for block in blocks:
L, R = splitBlock(initialPermute(block))
for round_num in range(16):
L, R = roundFunction(L, R, getRoundSubkey(round_num))
combined = combineLR(R, L)
cipher_text_block = inverseIP(combined)
encrypted_blocks.append(cipher_text_block)
return joinEncryptedBlocks(encrypted_blocks)
if __name__ == "__main__":
des_cipher = DESCipher("your_secret_key")
result = des_cipher.encrypt("hello world!")
print(result)
```
以上代码片段展示了如何使用纯Python代码构建完整的DES加解密功能[^1]。需要注意的是,由于篇幅所限,并未给出所有辅助性的内部方法(如padPlaintext(), divideIntoBlocks()等),但在真实应用中这些都是不可或缺的部分。
阅读全文
相关推荐














