信安备考——密码学(DES)
DES(Date Encrytion Standard),DES是分组加密算法,支持64比特明文块加密,使用56比特有效密钥(实际密钥长度为64比特,但包含8比特奇偶校验位)。为了增强其加密程度,中间过渡使用三重DES(TDEA),其中作为对明文进行"加密-->解密-->加密",对DES加密后的密文进行加密后解密再加密,则解密过程为(解密-->加密-->解密)。
假设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,I代表明文输入,O代表密文输出。
则TDEA加密过程为:
I --> Ek1() --> Dk2() --> Ek3() --> O
解密流程:
O --> Dk3() --> Ek2() --> Dk1() --> I
加密流程:
明文 I → [加密 Ek1] → 中间值 → [解密 Dk2] → 中间值 → [加密 Ek3] → 密文 O
解密流程:
密文 O → [解密 Dk3] → 中间值 → [加密 Ek2] → 中间值 → [解密 Dk1] → 明文 I
1. DES加密Python脚本
from Crypto.Cipher import DES
from Crypto.Random import random, get_random_bytes
key = get_random_bytes(8)
print(f"生成的密钥为:{key}")
print(f"生成的密钥为:{key.hex()}")
user_plaintext = input("请输入64比特明文:")
plaintext = user_plaintext.encode('utf-8')
print(f"编码后的内容为:{plaintext}")
#加密
cipher = DES.new(key,DES.MODE_ECB) #创建对象
ciphertext = cipher.encrypt(plaintext) #进行加密
print(f"加密后的结果是:{ciphertext}")
#解密
decrypted = cipher.decrypt(ciphertext)
print(f"解密后的结果是:{decrypted}")
2. TDEA(三重DES)加密Python脚本
TDEA使用三个独立密钥。
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
# TDEA加密函数:Ek1 -> Dk2 -> Ek3
def tdea_encrypt(plaintext, key1, key2, key3):
# 第一步:加密 with K1
cipher1 = DES.new(key1, DES.MODE_ECB)
step1 = cipher1.encrypt(pad(plaintext, DES.block_size))
# 第二步:解密 with K2(注意:即使解密,也使用解密函数)
cipher2 = DES.new(key2, DES.MODE_ECB)
step2 = cipher2.decrypt(step1) # 使用解密函数
# 第三步:加密 with K3
cipher3 = DES.new(key3, DES.MODE_ECB)
ciphertext = cipher3.encrypt(step2)
return ciphertext
# TDEA解密函数:Dk3 -> Ek2 -> Dk1
def tdea_decrypt(ciphertext, key1, key2, key3):
# 第一步:解密 with K3
cipher3 = DES.new(key3, DES.MODE_ECB)
step1 = cipher3.decrypt(ciphertext)
# 第二步:加密 with K2(注意:即使加密,也使用加密函数)
cipher2 = DES.new(key2, DES.MODE_ECB)
step2 = cipher2.encrypt(step1) # 使用加密函数
# 第三步:解密 with K1
cipher1 = DES.new(key1, DES.MODE_ECB)
plaintext = unpad(cipher1.decrypt(step2), DES.block_size)
return plaintext
# 示例使用
if __name__ == "__main__":
# 生成三个随机8字节密钥(每个64比特,总168比特)
key1 = get_random_bytes(8)
key2 = get_random_bytes(8)
key3 = get_random_bytes(8)
plaintext = b"HelloTDEA" # 明文,需要填充到64比特倍数
# 加密
ciphertext = tdea_encrypt(plaintext, key1, key2, key3)
print("TDEA加密结果:", ciphertext.hex())
# 解密
decrypted = tdea_decrypt(ciphertext, key1, key2, key3)
print("TDEA解密结果:", decrypted.decode())
拓展:DES拥有多种加密模式
1. ECB (Electronic Codebook, 电子密码本)
核心概念:最简单的模式。将明文分割成多个独立的64位分组,每个分组用相同的密钥进行加密。像查密码本一样,相同的明文分组总是生成相同的密文分组。
2. CBC (Cipher Block Chaining, 密码分组链接)
核心概念:引入初始化向量(IV)。每个明文分组在加密前,先与前一个密文分组进行异或操作。第一个分组与IV异或。
3. CFB (Cipher Feedback, 密码反馈)
核心概念:将DES转换为流密码。它加密的是前一个密文分组(或IV),然后将结果与明文分组进行异或来产生密文。
4、OFB (Output Feedback, 输出反馈)
核心概念:也是流密码模式。它加密的是前一个加密操作的输出(而不是密文),然后将结果与明文分组异或。密钥流(Keystream)的产生与明文无关。
5. CTR (Counter, 计数器模式)
核心概念:一种高效的流密码模式。它加密一个计数器(一个随时序递增的值),然后将结果与明文分组异或。

浙公网安备 33010602011771号