密码学 - 加解密算法 - 加解密模式

说明

  • 大部分对称加密算法支持多种加密模式,每种模式的运算结果也不相同。
  • 加解密模式是分组加密算法通用的机制,不同算法可能支持相同的加密模式,不同算法支持的加密模式也可能不同。
  • 加密和解密需要使用相同的模式才能得到正确的结果。
  • 不同的加解密算法区别在于单次加解密运算的不同,而加解密模式的不同体现在iv的使用和组与组的关联上。

基础模式

ECB(Electronic Code Book/电码本模式)

  • ECB 模式是加解密算法支持的最基础,最简单的模式,ECB只依赖key(秘钥)。
  • 注意:在任何情况下都不推荐使用ECB模式。

实现原理

  • 使用key分别对每一组明文进行加密,之后按照顺序将每组加密后的数据连在一起即可,加解密过程中各组数据互不影响。
    在这里插入图片描述

优缺点

  1. 优点
  • 简单
  • 组与组之间没有关联,利于并行计算,误差不会被传递。
  1. 缺点
  • 暴露明文的一些规律,重复的明文组会得到重复的密文。
  • 当密文被篡改时,解密后对应的明文分组也会出错,且解密者察觉不到密文被篡改了,ECB完全没有支持对密文的完整性校验。

CBC(Cipher Block Chaining/加密分组链接模式)

  • 为了解决ECB模式重复明文组产生重复密文的问题,CBC模式使用反馈机制使每组数据加密过程链接在一起,有了关联。
  • CBC模式依赖key和iv(初始化向量)。

实现原理

  1. 使用IV和第一组明文作异或运算,再将异或后的数据使用key加密,加密后得到第一组密文。
  2. 使用第一组密文和第二组明文作异或运算,再将异或后的数据使用key加密,加密后得到第二组密文,后面的组依此类推。
  • 注意: 初始化向量(iv)只在第一组明文中使用,所有明文组加密使用相同密钥。
    在这里插入图片描述

优缺点

  1. 优点
  • 安全性好于ECB,不容易主动攻击,适合传输长度长的报文,是SSL、IPSec的标准,每个密文块依赖于所有的信息块,明文消息中一个改变会影响所有密文块。
  1. 缺点
  • 更复杂,运算量更大些,
  • 发送方和接收方都需要知道初始化向量
  • 加密过程是串行的,无法被并行化(在解密时,从两个邻接的密文块中即可得到一个平文块。因此,解密过程可以被并行化)。

CFB(加密反馈模式)

  • 加密反馈模式中,数据用更小的单元加密(可以是8位,即一个字符的长度),这个长度小于定义的块长(通常是64位)。假设我们一次处理j位(j通常取8)。
  • CFB模式每一组加密后需要将密文填入下一组的iv最后面。

实现原理

  1. 采用64位iv,iv使用key加密后生成 已加密的iv。
  2. 加密后的初始化向量(iv)最左边的j位与明文前j位进行异或运算,产生第一组密文C。
  3. 初始化向量(iv)左移j位, 将第一组密文C填入iv的最右边 j位。
  • 后面的组依此类推。

OFB(输出反馈模式)

  • OFB模式和CFB很类似,区别在于:OFB模式是将iv加密的输出填入下一组的iv中。

实现原理

  1. 采用64位iv,iv使用key加密后生成 已加密的iv。
  2. 加密后的初始化向量(iv)最左边的j位与明文前j位进行异或运算,产生第一组密文C。
  3. 初始化向量(iv)左移j位, 将第一组已加密的iv填入iv的最右边 j位。
  • 后面的组依此类推。

CTR(计数器模式)

  • 计数器模式使用序号(称为计数器,通常是一个常数)作为算法的输入。

实现原理

  1. 使用key对counter进行加密,生成已加密的counter。
  2. 使用已加密的counter与第一组明文做异或运算,得到第一组密文。
  3. counter递增(通常是增加1)。
  • 后面的组依此类推。

总结

  1. ECB和CBC使用key加密明文,而CFB、OFB、CTR使用key加密iv。

复杂模式

  • 基础模式(ECB、CFB、CFB等)不能提供密文的完整性和正确性保证,如果在消息传输或者黑客攻击等情况下,密文存在缺失或者部分数据错误,解密后的数据实际上是不对的,用户无法感知的,并且可能将解密后错误的数据当做明文。
  • 密文完整性和正确性的校验需要借助一类算法(MAC)的帮助。

MAC(Message Authentication Code/消息认证码)

  • MAC是一类算法,使用秘钥(key)和消息生成固定长度的数据,也称为Auth Tag。
  • MAC跟哈希算法有点像,但比哈希要复杂,Mac的生成和验证过程都是需要密钥。

工作流程

  1. 消息发送者(Sender)和接收者(Receiver)共享同一个Key,并且约定使用同一个MAC算法 Algorithm。
  2. Sender把要传递的消息Message使用Key和MAC Algorithm计算出MAC,将 Message和MAC一起发送给Receiver。
  3. Receiver收到Message和MAC后,将Message使用约定的Key和MAC算法 Algorithm计算出MAC_1,通过对比MAC和MAC_1 来判断消息是否已被更改。

GMAC(Galois Message Authentication Code/伽罗瓦消息验证码)

  • GMAC是一种MAC算法,利用伽罗华域(Galois Field,GF,有限域)乘法运算来计算消息的 MAC 值。

GCM(Galois/Counter Mode)

  • GCM模式,G是指GMAC,C是指 CTR,在CTR模式基础上增加GMAC算法校验,解决了CTR 不能对加密消息进行完整性校验的问题。

引用

  • https://blog.csdn.net/new9232/article/details/122670049
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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加密解密操作的实例。当然,在实际应用中,我们还需要考虑更多的安全性和实用性考量,例如密钥的生成与管理、数据分块处理等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值