《常见密码算法总结--(1)分组对称密码》见http://bbs.pediy.com/showthread.php?t=113921http://blog.csdn.net/NJZhuJinhua/archive/2010/05/27/5629455.aspx《常见密码算法总结--(3)加密模式的openssl代码分析》见http://bbs.pediy.com/showthread.php?t=114170http://blog.csdn.net/NJZhuJinhua/archive/2010/05/30/5635343.aspxNJZhuJinhua@csdn May.30, 2010http://bbs.pediy.com/showthread.php?t=114169http://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模式效果一样。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)