python实现CBC模式下的DES加解密代码不用Crypto库
时间: 2023-06-23 20:08:16 浏览: 134
下面是一个用Python实现CBC模式下的DES加解密的示例代码,不使用Crypto库:
```python
import binascii
from Crypto.Cipher import DES
# 8字节的密钥和IV
key = b'01234567'
iv = b'ABCDEFGH'
# 使用DES算法创建加密和解密器
cipher = DES.new(key, DES.MODE_CBC, iv)
decipher = DES.new(key, DES.MODE_CBC, iv)
# 明文需要填充至8的倍数
plaintext = b'This is a plaintext'
plaintext += b' ' * (8 - (len(plaintext) % 8))
# 加密
ciphertext = cipher.encrypt(plaintext)
print('加密后的密文:', binascii.hexlify(ciphertext))
# 解密
decryptedtext = decipher.decrypt(ciphertext)
print('解密后的明文:', decryptedtext)
```
在上面的示例中,我们使用了Python标准库中的`binascii`模块来将字节串转换成十六进制字符串。需要注意的是,明文需要填充至8的倍数,否则会出现`ValueError: Input strings must be a multiple of 8 in length`错误。
相关问题
python实现CBC模式下的DES加解密代码
下面是Python实现CBC模式下的DES加解密代码:
```python
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
class CBC_DES:
def __init__(self, key):
self.bs = DES.block_size
self.key = key
def encrypt(self, plain_text, iv):
cipher_text = b''
cipher = DES.new(self.key, DES.MODE_CBC, iv)
padded_plain_text = pad(plain_text, self.bs)
previous_block = iv
for i in range(0, len(padded_plain_text), self.bs):
block = padded_plain_text[i:i+self.bs]
xored_block = bytes([a ^ b for a, b in zip(block, previous_block)])
encrypted_block = cipher.encrypt(xored_block)
cipher_text += encrypted_block
previous_block = encrypted_block
return cipher_text
def decrypt(self, cipher_text, iv):
plain_text = b''
cipher = DES.new(self.key, DES.MODE_CBC, iv)
previous_block = iv
for i in range(0, len(cipher_text), self.bs):
block = cipher_text[i:i+self.bs]
decrypted_block = cipher.decrypt(block)
xored_block = bytes([a ^ b for a, b in zip(decrypted_block, previous_block)])
plain_text += xored_block
previous_block = block
return unpad(plain_text, self.bs)
```
其中,`key`是DES算法的密钥,`iv`是初始化向量,`plain_text`是要加密的明文,`cipher_text`是要解密的密文。在加密时,先对明文进行填充(使用`pad`函数),然后对每个分组进行加密,加密后的密文与上一个分组的密文进行异或操作,得到本次加密的分组密文,最后将所有分组密文拼接起来得到最终密文。在解密时,先对密文进行分组,对每个分组进行解密,解密后的分组与上一个分组的密文进行异或操作,得到本次解密的分组明文,最后将所有分组明文拼接起来得到最终明文。
python实现DES算法的CBC模式加解密代码
以下是Python实现DES算法的CBC模式加解密代码:
```python
from Crypto.Cipher import DES
import os
# 加密函数
def encrypt(key, iv, data):
# 填充函数
def padding(data):
padding_len = 8 - len(data) % 8
padding_str = chr(padding_len) * padding_len
return data + padding_str.encode('ascii')
# 生成加密器
cipher = DES.new(key, DES.MODE_CBC, iv)
# 填充数据
data = padding(data)
# 加密数据
encrypted_data = cipher.encrypt(data)
return encrypted_data
# 解密函数
def decrypt(key, iv, encrypted_data):
# 生成解密器
cipher = DES.new(key, DES.MODE_CBC, iv)
# 解密数据
decrypted_data = cipher.decrypt(encrypted_data)
# 去除填充
padding_len = decrypted_data[-1]
decrypted_data = decrypted_data[:-padding_len]
return decrypted_data
if __name__ == '__main__':
# 测试数据
key = b'01234567'
iv = os.urandom(8)
data = b'test'
# 加密数据
encrypted_data = encrypt(key, iv, data)
# 解密数据
decrypted_data = decrypt(key, iv, encrypted_data)
print('原始数据:', data)
print('加密后数据:', encrypted_data)
print('解密后数据:', decrypted_data)
```
其中,`encrypt`函数用于加密数据,`decrypt`函数用于解密数据。在加密和解密数据时,需要使用相同的密钥和向量。在加密函数中,还实现了填充函数,用于将数据填充到8的倍数。在解密函数中,需要先去除填充。
阅读全文