信安备考——密码学(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位分组,每个分组用​​相同的密钥​​进行加密。像查密码本一样,相同的明文分组总是生成相同的密文分组。

flowchart TD subgraph ECB_Mode[ECB 模式] direction LR P1[明文分组 1] --> E[加密<br>Ek] --> C1[密文分组 1] P2[明文分组 2] --> E2[加密<br>Ek] --> C2[密文分组 2] P3[明文分组 ...] --> E3[加密<br>Ek] --> C3[密文分组 ...] P4[明文分组 N] --> E4[加密<br>Ek] --> C4[密文分组 N] end
2. CBC (Cipher Block Chaining, 密码分组链接)

核心概念​​:引入​​初始化向量(IV)​​。每个明文分组在加密前,先与​​前一个密文分组​​进行异或操作。第一个分组与IV异或。

flowchart TD subgraph CBC_Mode[CBC 模式] direction LR IV[初始化向量 IV] --> XOR1[⊕] P1[明文分组 1] --> XOR1 XOR1 --> E1[加密<br>Ek] --> C1[密文分组 1] --> XOR2[⊕] P2[明文分组 2] --> XOR2 XOR2 --> E2[加密<br>Ek] --> C2[密文分组 2] --> XOR3[⊕] P3[明文分组 ...] --> XOR3 XOR3 --> E3[加密<br>Ek] --> C3[密文分组 ...] --> XOR4[⊕] P4[明文分组 N] --> XOR4 XOR4 --> E4[加密<br>Ek] --> C4[密文分组 N] end
3. CFB (Cipher Feedback, 密码反馈)

核心概念​​:将DES转换为​​流密码​​。它加密的是前一个密文分组(或IV),然后将结果与明文分组进行异或来产生密文。

flowchart TD subgraph CFB_Mode[CFB 模式] direction LR IV[移位寄存器] --> E[加密<br>Ek] E --> S[选择最左s位<br>s=8] P1[明文分组 1<br>8位] --> XOR1[⊕] S --> XOR1 XOR1 --> C1[密文分组 1<br>8位] C1 --> Feedback[反馈至寄存器] end
4、OFB (Output Feedback, 输出反馈)

核心概念​​:也是流密码模式。它加密的是前一个加密操作的​​输出​​(而不是密文),然后将结果与明文分组异或。密钥流(Keystream)的产生与明文无关。

flowchart TD subgraph OFB_Mode[OFB 模式] direction LR IV[移位寄存器] --> E1[加密<br>Ek] --> K[密钥流] P1[明文分组 1] --> XOR1[⊕] K --> XOR1 XOR1 --> C1[密文分组 1] K --> Feedback[反馈至寄存器] end
5. CTR (Counter, 计数器模式)

核心概念​​:一种高效的流密码模式。它加密一个计数器(一个随时序递增的值),然后将结果与明文分组异或。

flowchart TD subgraph CTR_Mode[CTR 模式] direction LR Counter[计数器<br>Nonce + Count] --> E[加密<br>Ek] --> K[密钥流] P1[明文分组 1] --> XOR1[⊕] K --> XOR1 --> C1[密文分组 1] Counter --> NextCount[计数器递增] end
posted @ 2025-08-27 22:37  ykkx  阅读(53)  评论(0)    收藏  举报