常见密码算法总结--(2)分组密码加密模式

 

 


《常见密码算法总结--(1)分组对称密码》见
http://bbs.pediy.com/showthread.php?t=113921

http://blog.csdn.net/NJZhuJinhua/archive/2010/05/27/5629455.aspx

 

《常见密码算法总结--(3)加密模式的openssl代码分析》见
http://bbs.pediy.com/showthread.php?t=114170
http://blog.csdn.net/NJZhuJinhua/arc...0/5635343.aspx

 


NJZhuJinhua@csdn May.30, 2010
http://bbs.pediy.com/showthread.php?t=114169
http://blog.csdn.net/NJZhuJinhua/archive/2010/05/30/5635313.aspx
转载请注明出处。

 

 


(二)分组密码的工作模式
本来计划第二节写非对称密码的,但发在pediy看雪后读者说第一篇写的太粗,特决定把openssl的实现一起拉进来结合其代码分析学习。

本节讲分组密码的工作模式。

 

为了对长度超过密码算法分组大小的明文进行加密,设计到分组密码的工作模式的问题,简单说就是分组块进行加密时的链接关系。也可以理解为密码算法如DES,AES等解决的是一个分组长度的明文加密成密文的过程,而对于任意长度的明文的加密过程则以加密算法为基础,并在某种工作模式下来完成加密过程。因而单独说此数据采用什么算法加密的是没意义的,同样是aes加密,模式不一样时,密文不一样。有了密文,有了密钥,不知道加密模式的话一样无法解密。

 

分组密码的工作模式主要有
(1)电子密码本模式ECB
(2)密码分组链接模式CBC
(3)密码反馈模式CFB
(4)输出反馈模式OFB
(5)计数器模式CTR

(6)密文挪用模式CTS

 

 

 

(1)电子密码本模式ECB
将明文的各个分组独立的使用相同的密钥进行加密,这种方式加密时各分组的加密独立进行互不干涉,因而可并行进行。同样因为各分组独立加密的缘故,相同的明文分组加密之后具有相同的密文。该模式容易暴露明文分组的统计规律和结构特征。不能防范替换攻击。
其实照实现来看,ECB的过程只是把明文进行分组,然后分别加密,最后串在一起的过程。当消息长度超过一个分组时,不建议使用该模式。在每个分组中增加随机位(如128位分组中96位为有效明文,32位的随机数)则可稍微提高其安全性,但这样无疑造成了加密过程中数据的扩张。

 


(2)密码分组链接模式CBC
该模式将当前分组的明文与前一个分组的密文的异或作为加密算法的输入。加密后的密文继续参与下一个分组的加密过程。在第一个分组的加密时需要一个初始向量IV,起到虚拟的第0个分组的密文的作用。


记c_0=IV的话
第i个分组m_i的加密过程可以表示为c_i=E_k(m_i /oplus c_{i-1})
(这里及以后的下标等表示采用TEX语法。)


解密过程也是从第一个分组开始,第i个密文分组c_i的解密为m_i=E_k^{-1}(c_i) /oplus c_{i-1}。


在CBC模式下,相同的明文经相同密钥及IV下,将产生相同的密文。改变任一个,密文则不同。这一性质说明CBC模式可以用于消息认证,即用来产生消息认证吗MAC。将MAC附着在明文分组的后面,使接收消息的人可以确认消息的来源正确且中途没有被篡改过。


CBC模式的自同步:由于CBC链接属性,使密文c_i依赖于m_i以及c_{i-1},而c_{i-1}又依赖于i-1明文及i-2的密文,因而c_i相当于依赖于m_i及前面所有的明文分组。因而过程中明文一位的改变影响后面所有密文的值。而解密过程中密文中一位的改变仅影响本分组以及下一个分组的解密,对于再下一个密文分组的解密则无影响。CBC模式是自同步或密文自动密钥,对于位错误或丢失整个分组情况下,很快能恢复。但是,对于位丢失这样的分组边界错位则没办法了。

 

 

 

(3)密码反馈模式CFB
CFB模式时产生一个密钥流并与分组中的一部分尽心运算。可以将一个大分组分成很多小部分,如128位分组分成16份,每份8位进行一次运算,可以即时输出8位的密文。甚至可以分成128份,每次一位的输出,但如此依赖循环次数大大增加,效率极低。

加密过程可以描述为
设c_0=IV
第i部分的密文为c_i=m_i /oplus Z_i其中
Z_i=E_k(c_{i-1})。
CFB模式的加密过程与解密过程完全相同,不能用于公钥算法

 

 

 

(4)输出反馈模式OFB
与CFB相同的是都是利用分组密码产生流密码的密钥流,不同的是密钥流与密文无关了,而仅与IV及密钥K有关。
加密过程可以描述为
设Z_0=IV
第i部分的密文为c_i=m_i /oplus Z_i其中
Z_i=E_k(Z_{i-1})。

解密时直接生成Z=Z_1|Z_2|Z_3|Z_4|Z_5...;
然后M=m_1|m_2|m_3...=c_1 /oplus Z_1 | c_2 /oplus Z_2 |...

 

 

(5)计数器模式CTR
计数器模式类似于OFB,差别是构造密钥流的方式不一致:计数器模式的密钥流是通过使用密钥K加密系列计数器产生的。
选择一个计数器ctr,是一个长度与明文分组长度相同的比特串,首先构造一系列长度为分组长度的比特串,记为:
Z=Z_1|Z_2|Z_3|Z_4|Z_5...
Z_i=(ctr+i-1)mod 2^n  这里n为分组长。

 则
加密过程表示为c_i=m_i /oplus Z_i
解密过程表示为m_i=c_i /oplus Z_i

 

 

(6)CTS密文挪用模式
用于处理任意长度明文数据,并产生相同长度的密文数据。除最后两个明文分组外,对前面的所有块CTS模式与CBC模式效果一样。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值