【密码学】三、分组密码

1. 基本概念

1.1 分组密码的长度

其中 L 称为分组规模,t称为分组密码的密钥长度
按目前的国际标准,L一般为128比特,t一般有三种比特长度:128,192,256。

1.2 分组密码安全性的要求
  1. 分组长度足够大:以抵抗频次分析。
  2. 密钥量足够大:以抵抗穷尽攻击。
  3. 密码变换足够复杂:采用弱的****函数多次迭代,即所谓的乘积密码。
    总之,能够抵抗目前已知的所有攻击。
1.3 分组密码遵从的基本指导原则
  1. 扩散:①扩散是指将每一位明文的影响尽可能迅速作用到较多的输出密文位中去,以便隐藏明文的统计特征。②也就是说,当一个明文比特或密钥比特发生变化时,每个密文比特都有可能发生变化。③扩散原则一方面要求具有一定结构和统计规律的明文经过变换后,使得密文不再显示出任何形式的规律性;另一方面要求密钥的每一比特要影响尽可能多的密文比特,使得密钥的每一比特在密文中都得到充分扩散。

  2. 混乱:①混乱是指密文与明文之间的统计特征尽可能的复杂化。所谓乘积密码,即是指迭代密码,通过圈函数的多次迭代,实现扩散与混乱。②破译密码无外乎解析法和统计法。③因此混乱原则一方面要求密文应当是明文和密钥足够复杂的函数,另一方面要求密文与其对应的明文和密钥之间不存在任何形式的统计相关性。

1.4 分组密码的实现原则
  1. 硬件实现原则
    ①加、脱密结构相同
    ②规则的编码结构
    ③设计成迭代型
    ④选择易于硬件实现的编码环节
  2. 软件实现原则
    ①加、脱密结构相似
    ②使用子块
    ③设计成迭代型
    ④尽量使用既简单又易于软件实现的运算
1.4 des 结构、Feistel 结构

Feistel 结构:
https://blog.csdn.net/Drifter_Galaxy/article/details/107702084

1.5 Feistel 结构的实现

参数和特性:
1. 分组大小: 分组越大则安全性越高,但加密速度就越慢。
2. 密钥大小:密钥越长则安全性越高,但加密速度就越慢。
3. 轮数:单轮结构远不足以保证安全性,但多轮结构可提供足够的安全性。典型地,轮数取为16。
4. 子密钥产生算法:该算法的复杂性越大,则密码分析的困难性就越大。
5. 轮函数:轮函数的复杂性越大,密码分析的困难性也越大。

在设计 Feistel 网络时,还有以下两方面需要考虑:
1. 快速的软件实现:在很多情况中,算法是被镶嵌在应用程序中,因而无法用硬件实现。此时算法的执行速度是考虑的关键。

2. 算法容易分析:如果算法能被无疑义地解释清楚,就可容易地分析算法抵抗攻击的能力,有助于设计高强度的算法。

1.6 DES 基本参数

1. 分组长度:64比特
2. 密钥长度:64比特
3. 有效密钥长度:56比特
4. 迭代圈数:16圈
5. 每圈子密钥长度:48比特

1.7 AES 算法参数

分组长度:128 比特
密钥长度:128、192 或 256 比特
圈数:

密钥长度128192265
圈数101214
1.8 AES 基本运算由以下四个环节组成

在这里插入图片描述

1.9 分组密码常见的工作模式

1. 电码本模式 ECB
ECB模式是将明文的各个分组独立地使用同一密钥k加密。
优点:
(1)实现简单;
(2)不同明文分组的加密可并行实施。
缺点:
(1)相同明文分组对应相同密文分组,因而不能隐蔽明文分组的统计规律和结构规律;
(2)不能抵抗替换攻击。

为了克服ECB的安全性缺陷,我们希望设计一种工作模式,可以使得当同一个明文分组重复出现时产生不同的密文分组。

一个简单的方法是密文分组链接,使得各输出分组不仅与当前输入分组有关,而且与以前各输入分组和输出分组有关。

2. 密文分组链接模式 CBC

3. 密文反馈模式 CFB
在CBC模式下,加密算法的输入是当前明文组与前一密文组的异或
优点:
(1)适用于用户数据格式的需要。例如对于数据库加密,要求加密时不能改变明文的字节长度,这时就要以明文字节为单位进行加密。
(2)具有有限步(l+1步)的错误传播,可用于认证。
(3)可实现自同步。
缺点:
(1)错误传播:若一个j比特块密文错误,具有l+1步的错误传播。
(2)加密效率低:一次只能完成j个比特的明文数据加密。

4. 输出反馈模式 OFB
OFB模式在结构上类似于CFB模式,但反馈的内容是加密算法输出的乱数而不是密文!
优点:
(1)这是将分组密码当作序列密码使用的一种方式,但乱数与明文和密文无关;
(2)不具有错误传播特性,是一种同步序列密码。
缺点:
(1)加密效率低;
(2)乱数序列的周期可能有短周期现象。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: AES(Advanced Encryption Standard)是一种常用的分组密码算法,它支持128、192和256位的密钥长度。AES算法是由美国国家标准与技术研究院(NIST)于2001年发布的,并且已经被广泛应用在各个领域中。 在进行AES加密操作前,首先需要确定密钥的长度,并通过密钥扩展算法生成相关的轮密钥。轮密钥是通过对原始密钥进行一系列运算,产生多个轮次的中间结果得到的。 在加密操作中,AES算法将明文分为多个长度为128位(16字节)的数据块,并通过多轮的混淆和替代操作,将每个数据块转换为密文数据块。这其中包括4个阶段的处理:字节代换、行移位、列混淆和轮密钥加。 在解密操作中,AES算法将密文数据块通过逆向处理,逐步还原为明文数据块。解密过程包括4个阶段的处理:逆字节代换、逆行移位、逆列混淆和逆轮密钥加。 AES算法的加密解密操作是可逆的,即通过正确的密钥和操作步骤,可以将密文还原为明文或者将明文转换为密文。 总之,AES算法是一种高效且安全的分组密码算法,它通过多次迭代的混淆和替代操作,对输入数据进行加密操作。通过正确的密钥和步骤,可以将密文还原为明文,或者将明文转换为密文。这种算法被广泛应用于数据加密和保护隐私信息的场景中。 ### 回答2: AES(高级加密标准)是一种分组密码算法,用于加密和解密操作。它是一种对称密钥算法,意味着使用相同的密钥进行加密和解密。 AES算法使用一个称为"轮"的重复过程,通过多次迭代的代换和置换操作来加密和解密数据。它支持个不同的密钥长度:128位、192位和256位。 在使用AES算法进行加密时,明文被分成相同长度的块,每个块都会经过一系列的替代、置换、混淆等操作。然后,使用加密密钥对每个块进行处理,这个密钥必须是与解密操作使用的密钥相同。最后得到密文。 在解密操作中,使用相同的密钥对密文进行处理,逆转替代、置换、混淆等操作,然后得到原始的明文。 C语言可以用来实现AES加密解密操作。通常,需要引入一个密码库,如OpenSSL,以便使用其中的AES函数库。可以通过定义并初始化密钥、明文、密文等变量,然后使用AES加密函数来进行加密,使用AES解密函数来进行解密。 需要注意的是,在使用AES加密解密操作时,密钥的安全性至关重要。密钥必须安全保存,以防止被未经授权的人访问。 总之,AES是一种分组密码算法,用于加密和解密操作。通过使用C语言中的密码库,可以实现AES加密解密操作。但在使用时,需注意密钥的安全性。 ### 回答3: AES(Advanced Encryption Standard)是一种常见的对称分组密码算法,被广泛应用于数据加密和保护的领域中。 AES加密解密操作C使用C语言编写,通过调用相应的AES算法库来实现加密和解密的过程。下面将以C语言为例,使用AES算法库进行AES加密和解密的操作。 首先,需要在C语言代码中引入相关的AES库文件,声明相应的函数和变量。然后创建密钥和待加密的明文数据,并设置相应的加密模式和填充模式。接下来,使用AES算法库提供的函数,将明文数据与密钥进行加密操作。最后将得到的密文数据进行输出。 示例代码如下: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/aes.h> void encryptAES(char *key, char *plainText, unsigned char *ciphertext){ AES_KEY aesKey; if (AES_set_encrypt_key((unsigned char *)key, 128, &aesKey) < 0) { fprintf(stderr, "Unable to set encryption key in AES\n"); exit(1); } AES_encrypt((unsigned char *)plainText, ciphertext, &aesKey); } void decryptAES(char *key, unsigned char *ciphertext, char *deciphertext){ AES_KEY aesKey; if (AES_set_decrypt_key((unsigned char *)key, 128, &aesKey) < 0) { fprintf(stderr, "Unable to set decryption key in AES\n"); exit(1); } AES_decrypt(ciphertext, (unsigned char *)deciphertext, &aesKey); } int main(){ char key[] = "0123456789abcdef"; char plainText[] = "Hello,AES!"; unsigned char ciphertext[AES_BLOCK_SIZE]; char deciphertext[AES_BLOCK_SIZE]; encryptAES(key, plainText, ciphertext); printf("Ciphertext: "); for(int i=0; i<AES_BLOCK_SIZE; i++){ printf("%02x", ciphertext[i]); } printf("\n"); decryptAES(key, ciphertext, deciphertext); printf("Deciphertext: %s\n", deciphertext); return 0; } ``` 以上示例代码实现了AES加密和解密的操作,并输出了加密后的密文和解密后的明文。其中使用的密钥为"0123456789abcdef",待加密的明文为"Hello,AES!"。 这就是一个简单的使用C语言进行AES加密解密操作的实例。当然,在实际应用中,我们还需要考虑更多的安全性和实用性考量,例如密钥的生成与管理、数据分块处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值