五种(ECB,CBC,CFB,OFB,Counter)常见的分组密码的工作模式介绍

2023-12-13 21:25:46

1. 电码本(ECB)模式

ECB(Electronic Codebook)模式是一种最简单的块密码工作模式,用于加密数据。在ECB模式中,明文被分成固定大小的块,然后每个块都被独立加密,每个块的加密结果作为密文输出。这意味着相同的明文块会始终产生相同的密文块,因此ECB模式不提供语义安全性,这意味着它不适合加密长文本或需要高度安全性的应用。

下面是ECB模式的工作原理:

  1. 分块:将明文分成固定大小的块,通常是64位或128位。如果明文的长度不是块大小的整数倍,通常会使用填充来填充最后一个块。

  2. 独立加密:每个块都被独立加密,使用相同的密钥和加密算法。这意味着相同的明文块将始终生成相同的密文块。

  3. 输出密文:将所有加密后的块按照它们的顺序连接起来,形成最终的密文。

ECB模式的优点是简单和并行化处理,因为每个块都可以独立加密,不需要依赖前一块的结果。然而,它有一些重要的缺点:

  1. 重复块:相同的明文块会生成相同的密文块,这导致了信息泄露的风险。攻击者可以通过分析密文模式来获取一些信息,这对安全性是有害的。

  2. 不适合长文本:ECB模式不提供语义安全性,因此不适合加密长文本,因为它无法隐藏文本的模式或结构。

以下是ECB模式的简单示例,以Python中的伪代码形式展示:

from Crypto.Cipher import AES

# 创建AES加密器,使用相同的密钥
key = b'SecretKey1234567'
cipher = AES.new(key, AES.MODE_ECB)

# 明文块的大小为16字节(128位)
plaintext_block = b'This is a test!'

# 使用AES加密器加密明文块
ciphertext_block = cipher.encrypt(plaintext_block)

# 打印密文块
print("Cipher Text:", ciphertext_block.hex())

在ECB模式中,每个明文块都独立加密,因此如果相同的明文块在不同位置出现,它们将生成相同的密文块。这可能导致一些安全问题,因此在实际应用中,通常建议使用更安全的加密模式,如CBC(Cipher Block Chaining)或GCM(Galois/Counter Mode),以提供更好的随机性和安全性。

2. 密码分组链接(CBC)模式

CBC(Cipher Block Chaining)模式是一种块密码工作模式,用于加密数据块,以提供更高级的安全性比ECB模式。它在加密过程中引入了前一个块的密文作为当前块的输入,从而隐藏了相同明文块的模式。下面是CBC模式的详细介绍:

  1. 初始向量(Initialization Vector,IV):CBC模式需要一个初始向量,通常是随机生成的。IV的大小与块大小相同。IV在加密和解密过程中都需要使用,并且必须保密。IV的作用是为了使每个消息的加密过程都不相同,即使是相同的明文块。

  2. 分块和填充:与ECB模式类似,明文会被分成固定大小的块,通常是64位或128位。如果明文的长度不是块大小的整数倍,CBC模式通常会使用填充来填充最后一个块,确保每个块都有相同的大小。

  3. 初始步骤:将初始向量(IV)与第一个明文块异或(XOR)在一起,然后使用加密算法对结果进行加密。这个加密结果就是第一个密文块。

  4. 迭代加密:对于接下来的每个明文块,将它与前一个密文块进行XOR运算,然后再使用加密算法对结果进行加密。这个过程的结果是当前明文块的密文块。

  5. 输出密文:将所有加密后的块按它们的顺序连接起来,形成最终的密文。

在解密时,需要进行反向操作:

  1. 初始步骤:将初始向量(IV)与第一个密文块进行解密,然后与后续的密文块进行XOR运算,得到第一个明文块。

  2. 迭代解密:对于每个密文块,将其与前一个密文块进行解密,然后与解密结果进行XOR运算,得到当前明文块。

  3. 输出明文:将所有解密后的块按它们的顺序连接起来,得到最终的明文。

CBC模式的优点包括隐藏了相同明文块的模式,提供了更高级的安全性,并且可以用于加密长文本。然而,它需要额外的处理来管理初始向量(IV)并且不适用于并行处理,因为每个块的加密依赖于前一个块的密文。此外,IV的选择和管理是至关重要的,因为它们直接影响了加密的安全性。

下面是CBC(Cipher Block Chaining)模式的加密和解密示例

from Crypto.Cipher import AES
import hashlib
import os

# 密钥和明文
key = b'SecretKey123456'
plaintext = b'This is a CBC mode encryption example.'

# 生成随机的初始向量(IV)
iv = os.urandom(16)

# 使用MD5哈希函数生成16字节的密钥
md5 = hashlib.md5()
md5.update(key)
key = md5.digest()

# 创建AES加密器和解密器
cipher = AES.new(key, AES.MODE_CBC, iv)

# 加密
ciphertext = cipher.encrypt(plaintext)

# 输出密文和IV
print("Cipher Text:", ciphertext.hex())
print("IV:", iv.hex())

# 创建新的AES解密器,使用相同的密钥和IV
decipher = AES.new(key, AES.MODE_CBC, iv)

# 解密
decrypted_text = decipher.decrypt(ciphertext)

# 去除填充
padding_length = decrypted_text[-1]
decrypted_text = decrypted_text[:-padding_length]

# 输出明文
print("Decrypted Text:", decrypted_text.decode('utf-8'))

这个示例使用Python的Crypto库来演示CBC模式的加密和解密过程。首先,我们生成一个随机的初始向量(IV),然后使用MD5哈希函数将密钥转换为16字节的密钥。接下来,我们创建AES加密器,使用CBC模式和生成的密钥和IV来加密明文。密文和IV被输出。

在解密部分,我们创建一个新的AES解密器,使用相同的密钥和IV。解密后,我们去除填充以获取原始明文。最后,输出解密后的明文。

总之,CBC模式是一种比ECB模式更安全的块密码工作模式,常用于数据加密和保护隐私。

3. 密码反馈(CFB)模式

CFB(Cipher Feedback)模式是一种块密码工作模式,用于加密数据块,它允许以比块更小的单位进行加密。CFB模式提供了一定程度的反馈,使得相同明文块不会总是生成相同的密文块,因此适用于流式数据或需要实时加密的应用。以下是CFB模式的详细介绍:

  1. 参数设置:与其他块密码模式一样,CFB模式需要选择一个块密码算法(如AES)和一个密钥。此外,还需要确定反馈位数(Feedback Size)n,通常可以选择8位或更多。

  2. 初始向量(Initialization Vector,IV):与CBC模式类似,CFB模式需要一个初始向量,通常是随机生成的,其大小等于块大小(n位)。IV必须保密,因为它影响了加密的安全性。

  3. 分块和填充:明文可以被分成块,但与其他模式不同,CFB模式允许以比块更小的单位进行加密,通常是位或字节。如果明文长度不是n位的整数倍,可以使用填充来使其满足要求。

  4. 加密过程:CFB模式的加密过程如下:

    a. 初始步骤:将IV输入块密码算法中,然后得到输出密文块。

    b. 反馈:将输出密文块的最后n位与明文的第一个n位进行XOR运算,得到第一个密文单位(通常是位或字节)。

    c. 移位:将输出密文块向左移动一个单位(位或字节),然后将明文的下一个单位与移位后的输出密文块进行XOR运算,得到下一个密文单位。

    d. 重复:重复步骤b和c,直到整个明文被加密。

  5. 输出密文:将所有密文单位按它们的顺序连接起来,形成最终的密文。

在解密时,CFB模式也需要进行反向操作:

  1. 初始步骤:将IV输入块密码算法中,然后得到输出密文块。

  2. 反馈和移位:与加密过程类似,但这次将密文输入块密码算法,然后将输出与密文进行XOR运算,得到明文单位。

  3. 重复:重复反馈和移位过程,直到整个密文被解密。

  4. 输出明文:将所有明文单位按它们的顺序连接起来,得到最终的明文。

下面是一个示例CFB模式的加密和解密的Python代码

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# 初始化AES加密器和初始向量
key = get_random_bytes(16)  # 128位密钥
cipher = AES.new(key, AES.MODE_CFB)
iv = get_random_bytes(16)   # 与密钥长度相同的初始向量

# 明文
plaintext = b'This is a test message.'

# 加密
ciphertext = cipher.encrypt(plaintext)

# 解密
decipher = AES.new(key, AES.MODE_CFB, iv=iv)
decrypted = decipher.decrypt(ciphertext)

# 打印结果
print(f'明文: {plaintext}')
print(f'加密后的密文: {ciphertext}')
print(f'解密后的明文: {decrypted}')

这个代码示例使用了Python的Crypto库来演示AES算法在CFB模式下的加密和解密过程。关键点包括:

  1. 密钥生成:使用get_random_bytes函数生成一个随机的128位(16字节)密钥。

  2. 初始向量(IV)生成:同样使用get_random_bytes生成与密钥长度相同的初始向量。IV在CFB模式中起着重要的作用,确保每个字节的加密都是独立的。

  3. 加密:使用AES.new创建一个AES加密器,指定MODE_CFB模式,并使用密钥和IV进行初始化。然后,使用encrypt方法将明文加密。

  4. 解密:同样使用AES.new创建一个AES解密器,使用相同的密钥和IV进行初始化。然后,使用decrypt方法将密文解密。

CFB模式的优点包括允许以比块更小的单位进行加密,适用于流式数据和实时加密。它也隐藏了相同明文块的模式。然而,与其他模式一样,选择和管理IV非常重要,因为它直接影响了加密的安全性。此外,CFB模式不适用于并行处理,因为每个单位的加密依赖于前一个单位的输出。

总之,CFB模式允许将块密码算法用于流式数据,它的特点是每个字节都是独立加密的,而不需要将数据分成块。这使得它适用于加密实时数据流或需要流式加密的应用场景。

4. 输出反馈(OFB)模式

OFB(Output Feedback)模式是一种块密码工作模式,用于加密数据块,但与其他模式不同,它可以实现流密码,允许以比块更小的单位进行加密。OFB模式的主要特点是不受明文块长度限制,因此适用于流式数据和实时加密。以下是OFB模式的详细介绍:

  1. 参数设置:与其他块密码模式一样,OFB模式需要选择一个块密码算法(如AES)和一个密钥。此外,还需要确定反馈位数(Feedback Size),通常可以选择8位或更多。反馈位数决定了每个加密步骤的输出大小。

  2. 初始向量(Initialization Vector,IV):OFB模式需要一个初始向量,通常是随机生成的,其大小等于块大小(n位)。IV必须保密,因为它影响了加密的安全性。

  3. 加密过程:OFB模式的加密过程如下:

    a. 初始步骤:将IV输入块密码算法中,然后得到输出密文块。

    b. 输出反馈:将输出密文块的最后n位作为密文输出。

    c. 反馈:将输出密文块的整个块(通常与明文块大小相同)作为下一个加密步骤的输入。

    d. 重复:重复步骤a、b、c,每次得到一个输出密文块,直到整个明文被加密。

  4. 输出密文:将所有输出的密文块按照它们的顺序连接起来,形成最终的密文。

在解密时,OFB模式也需要进行反向操作:

  1. 参数设置:使用相同的参数和密钥来配置解密。

  2. 初始步骤:将IV输入块密码算法中,然后得到输出密文块。

  3. 输出反馈:将输出密文块的最后n位作为明文输出。

  4. 反馈:将输出密文块的整个块(通常与明文块大小相同)作为下一个解密步骤的输入。

  5. 重复:重复步骤2、3、4,每次得到一个输出明文块,直到整个密文被解密。

  6. 输出明文:将所有输出的明文块按照它们的顺序连接起来,得到最终的明文。

以下是一个简单的示例:

# 导入加密库
import crypto_library

# 设置块大小(以字节为单位)
block_size = 16

# 设置初始向量(IV),与块大小相同
iv = generate_random_iv(block_size)

# 设置密钥
key = generate_encryption_key()

# 明文数据
plaintext = "This is the plaintext."

# 将明文分成块
plaintext_blocks = split_into_blocks(plaintext, block_size)

# 初始化加密器,使用初始向量和密钥
cipher = crypto_library.initialize_cipher(iv, key)

# 初始化密文
ciphertext = ""

# 加密每个块并追加到密文中
for block in plaintext_blocks:
    # 加密块
    encrypted_block = cipher.encrypt(block)
    # 将密文块追加到密文中
    ciphertext += encrypted_block

# 输出密文
print("Ciphertext:", ciphertext)

# 解密过程与加密过程类似
# 初始化解密器,使用初始向量和密钥
decipher = crypto_library.initialize_cipher(iv, key)

# 初始化明文
decrypted_text = ""

# 解密每个块并追加到明文中
for block in ciphertext_blocks:
    # 解密块
    decrypted_block = decipher.decrypt(block)
    # 将明文块追加到明文中
    decrypted_text += decrypted_block

# 输出明文
print("Decrypted Text:", decrypted_text)

在上述伪代码中,我们使用一个块密码库(crypto_library)来处理加密和解密操作。OFB模式的关键点是使用初始向量(IV)和密钥初始化加密器和解密器,然后依次处理每个明文块,并将加密或解密的块追加到密文或明文中。

OFB模式的优点包括允许以比块更小的单位进行加密,适用于流式数据和实时加密。它也隐藏了相同明文块的模式。与其他模式一样,选择和管理IV非常重要,因为它直接影响了加密的安全性。OFB模式不适用于并行处理,因为每个输出块独立于前一个块的加密。与其他模式不同,OFB模式的解密和加密步骤是相同的,因此非常简单和高效。

5. 计数器(Counter)模式

计数器模式(Counter Mode,简称CTR模式)是一种块密码工作模式,用于加密数据块,但与其他模式不同,它可以实现流密码,允许以比块更小的单位进行加密。CTR模式的主要特点是不受明文块长度限制,因此适用于流式数据和实时加密。以下是CTR模式的详细介绍:

  1. 参数设置:与其他块密码模式一样,CTR模式需要选择一个块密码算法(如AES)和一个密钥。此外,需要确定一个初始计数器(Counter),通常是一个随机数,其大小等于块大小(n位)。计数器的作用是生成不同的密钥流,以加密明文。

  2. 加密过程:CTR模式的加密过程如下:

    a. 初始步骤:将初始计数器输入块密码算法中,然后得到一个密钥流块。

    b. 明文加密:将得到的密钥流块与明文进行XOR运算,得到密文块。

    c. 计数器递增:增加计数器的值,通常是加1,以生成下一个密钥流块。

    d. 重复:重复步骤a、b、c,每次得到一个密文块,直到整个明文被加密。

  3. 输出密文:将所有生成的密文块按照它们的顺序连接起来,形成最终的密文。

在解密时,CTR模式也需要进行反向操作:

  1. 参数设置:使用相同的参数和密钥来配置解密。

  2. 加密过程:与加密过程完全相同,只是将密文输入块密码算法中,然后得到密钥流块,再与密文进行XOR运算,得到明文块。

  3. 输出明文:将所有生成的明文块按照它们的顺序连接起来,得到最终的明文。

以下是CTR模式的简要示例代码,使用Python来说明:

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# 初始化AES加密器,选择密钥长度(128、192或256位)
key = get_random_bytes(16)  # 128位密钥
cipher = AES.new(key, AES.MODE_CTR)

# 初始化计数器(nonce),通常随机生成
nonce = get_random_bytes(8)

# 加密明文
plaintext = b'This is the plaintext message.'
ciphertext = cipher.encrypt(plaintext)

# 解密密文
cipher = AES.new(key, AES.MODE_CTR, nonce=nonce)  # 使用相同的密钥和nonce来解密
decrypted_text = cipher.decrypt(ciphertext)

print("Original:  ", plaintext)
print("Decrypted: ", decrypted_text)

在上述示例中,我们使用PyCryptodome库来演示CTR模式。首先,我们初始化一个AES加密器,并生成一个随机的密钥和一个随机的nonce(计数器初始值)。然后,我们使用该加密器来加密明文并解密密文。CTR模式的特点在于,它不需要填充(因为不受明文块大小的限制),并且可以与块密码算法一起用于加密流数据。

CTR模式的优点包括允许以比块更小的单位进行加密,适用于流式数据和实时加密。与其他模式一样,选择和管理初始计数器非常重要,因为它直接影响了加密的安全性。CTR模式不适用于并行处理,因为每个密文块的加密是独立的,不依赖于前一个块的加密。CTR模式的解密和加密步骤是相同的,因此非常简单和高效。CTR模式还可以通过预先生成计数器值来实现加速,从而提高性能。

文章来源:https://blog.csdn.net/Bright20040513/article/details/132718408
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。