-ECB模式
ECB(Electronic Code Book,电码本)模式是分组密码的一种最基本的工作模式。在该模式下,明文数据被分为大小合适的分组,然后对每个分组独立进行加密或解密,如下图所示。
如果两个明文块相同(如明文块1和明文块2),则加密输出相同的密文块(如密文块1和密文块2)。
ECB模式的优点在于操作简单,易于实现。由于分组的独立性,利于实现并行处理,并能很好地防止误码扩散。由于所有分组的加密方式一致,明文中重复内容(即模式)会在密文中有所体现,因此难以抵抗统计分析攻击。
ECB模式一般用于小数据量的字符信息的安全性保护,例如密钥保护。
加密框架支持分组算法的ECB模式,实现源码为。
-CBC模式
1976年,IBM发明了密码分组链接(CBC,cipher-block chaining)模式。在该模式中,每个明文块先与前一个密文块进行异或后,再进行加密,如下图所示。
如上图所示,每个密文块都依赖于它前面所有的明文块,同时为保证每条消息的唯一性,在第一个块中需要使用初始向量IV。若第一个块的下标为1,则CBC模式的加密过程为Ci=Ek(Pi⊕Ci-1),C0=IV,而其解密过程为Pi=Dk(Ci)⊕Ci-1,C0=IV,其中Pi表示第i个明文块,Ci表示第i个密文块,E和D分别为加密器和解密器,k为密钥。
CBC模式的主要缺点在于加密过程是串行的,无法被并行化,而且明文数据必须被填充到块大小的整数倍。加密时,明文中的微小改变会导致气候的全部密文块都发生变化(即误码扩散)。解密时,从两个邻接的密文块即可得到一个明文块,因此解密过程可以被并行化,而解密时密文中一位的改变只会导致其对应的明文块完全改变和下一个明文块中对应位发生改变,不会影响到其他明文块的内容。
加密框架支持分组算法的CBC模式,实现源码为。
-CTR模式
CTR(Counter,计数器)模式将块密码变为流密码,通过一个递增的加密计数器以产生连续的密码流,其中计数器可以是任意保证不产生长时间重复输出的函数,使用要给普通的计数器是最简单和最常见的做法。
采用普通计数器的CTR加密流程如下所示。
图中Nonce(随机数)和计数器可以通过级联、相加或异或等运算使得相同的明文产生不同的密文。
CTR模式被广泛用于ATM网络安全和IPSEC应用中,与其他模式相比,具有以下特点:
1)高效率,允许进行并行计算,可以很好地应用CPU流水等并行技术;
2)随机访问,可以随机地对任意一个密文分组进行解密,对该密文的处理与其他密文无关;
3)简单性,与其他模式不同,CTR模式仅要求实现加密算法,但不要求实现解密算法。对AES等加解密本质上不同的算法来说,这种简化是巨大的。
4)预处理,算法和加密器的输出不依赖于明文和密文的输入,因此如果有足够的保证安全的存储器,加密算法将仅仅是一系列异或运算,浙江极大地提高吞吐量。
5)无填充,可以高效地作为流密码使用。
加密框架支持分组算法的CTR模式,实现源码为。
-PCBC模式
PCBC(Propagating Cipher Block Chaining,填充密码块链接)模式,是一种可以使密文的微小改动在解密时导致明文大部分错误的模式,并在加密时也具有相同的特性。PCBC模式的加密流程如下所示。
PCBC模式的加解密算法描述如下:
1)加密算法:Ci=Ek(Pi⊕Pi-1⊕Ci-1),P0⊕C0=IV,i=1,2,…,n。
2)解密算法:Pi=Dk(Ci)⊕Pi-1⊕Ci-1, P0⊕C0=IV,i=1,2,…,n。
对于使用PCBC模式加密的消息,互换两个邻接的密文块,不会对后续块的解密产生影响。
加密框架支持分组算法的PCBC模式,实现源码为。
注:PCBC模式或称为明文密码块链接(Plaintext Cipher Block Chaining)模式。
-CCM模式
CCM(Counter with Cipher
Block Chaining-Message Authentication Code)模式是一种同时提供加密服务和认证服务的算法模式,其中加密服务由CTR模式提供,认证服务由CBC-MAC模式提供。CCM模式融合了CTR模式和CBC-MAC模式的优点。
使用CCM模式的基本条件包括分组算法E、密钥K、计数器发生函数C(Counter Generation Function)、格式化函数F(Formating Function)和认证数据Tag长度Tlen。
在发送方,CCM模式的输入包括随机值N、有效载荷P和附加数据A,计算步骤如下所述:
1)执行格式化函数F(N,A,P),产生128bit/块的数据块序列B0、B1、…、Br。
2)对数据B(B=B0||B1||…||Br)计算CBC-MAC值T,认证数据长度为Tlen。
3)执行计数器发生函数C,产生128bit/块的计数器块ctr0、ctr1、…、ctrm,其中m=PLen/128,按照CTR模式计算Sj=Ek(ctrj)(j=0,1,…,m),再计算有效载荷P的密文C’=P⊕MSBplen(S),其中S=S1||S2||…||Sm。
4)按如下公式计算CCM模式输出密文C=C’||(T⊕MSBtlen(S0))。
当接收方接收到N、A和C时,对密文C首先进行解密得到有效载荷T和CBC-MAC值T,然后再对N、A、P计算CBC_MAC值T‘。如果T’=T说明认证通过,表示接收方从密文中解密得到的有效载荷P是真实有效的,否则表示得到的有效载荷P是无效的。
CCM模式的认证流程和加密流程如下所示。
1)认证流程
2)加密流程
加密框架支持分组算法的CCM模式,实现源码为。在中,除支持标准的CCM模式(记为ccm)外,还支持基本的CCM模式(记为ccm_base)和基于RFC4309的CCM模式(记为rfc4309,即CCM(AES))。ccm和ccm_base两种CCM模式的区别在于输入参数和衍生算法的算法命名,ccm只需要一个输入参数,即基础算法名cipher_name,然后构造出CTR模式算法(即ctr(cipher_name))和CCM模式算法(即ccm(cipher_name)),而ccm_base的输入参数除基础算法名cipher_name外还包括CTR模式算法名ctr_name,构造出的CCM算法名为ccm_base(ctr_name,cipher_name)。
注:RFC4309:Using Advanced Encryption Standard(AES) CCM Mode with IPSEC Encapsulating Security Payload(ESP)。
-GCM
同CCM模式,GCM模式(Galois/Counter Mode)也是一种同时提供加密服务和认证服务的算法模式,其中加密服务由CTR模式提供,认证服务由定义在伽罗华(Galois)域内的泛散Hash函数提供。GCM模式是建立在128比特分组密钥基础上的。
(加密原理太复杂,暂时未搞明白)
加密框架支持分组算法的GCM模式,实现源码为。同CCM模式相同,中定义了标准GCM模式(记为gcm)、基础GCM模式(记为gcm_base)和基于RFC4106的GCM模式(记为rfc4106)共三种不同GCM模式。
注:RFC4106:The use of Galios/Counter Mode(GCM) in IPSEC Encapsulating Security Payload(ESP)。
-CTS模式
CTS模式(Cipher Text Stealing Mode,密文窃取模式)可以处理任意长度的明文,产生与明文相匹配的密文。CTS模式除明文的最后两个块外的其他块的处理方式与CBC模式相同。
将明文的最后开两个块为Pn-1和Pn,其中Pn-1的长度等于块长度BB,Pn的长度Ln为1到BB的任意值,处理流程如下所示。
1)Xn-1=Pn-1⊕Cn-2,其中Cn-2为Pn-1前一个块Pn-2对应的密文;
2)En-1=Ek(Xn-1),Cn=MSBln(En-1);
3)在Pn末尾填充0创建长度为BB的Pn’;
4)Dn=En-1⊕Pn’,Cn-1=Ek(Dn)。
经过上述计算得到明文最后两个块Pn-1和Pn的密文Cn-1和Cn。
加密框架支持分组算法的CTS模式,实现源码为。
-LRW模式
LRW模式采用可调分组密码模块,曾经是IEEE P1619窄块加密标准候选算法模式中最有希望的。由于使用非链式结构,因此LRW模式可以有效支持并行操作。除明文和密钥外,LRW模式还有第3个输入,叫扰乱因子,其作用非常类似于CBC模式中的初始向量,但具有易变性。根据定义,可调分组密码应该具有改变扰乱因子的性能,这样比更换密钥更有效率。
加密框架支持分组算法的LRW模式,实现源码为。
-XTS模式
XTS模式是基于XEX的密文窃取可调密码模块,被认为是当前最适合于磁盘加密的窄块加密模式,已经被IEEE P1619标准采用。
加密框架支持分组算法的XTS模式,实现源码为。
-CMAC模式
除HMAC外,还有一种常见的MAC运算,即CMAC。CMAC全称为Cipher-based MAC,即基于AES等对称加密方式实现的消息认证。最常见的CMAC是基于分组密码的CBC模式构造的MAC,即CBC-MAC,被很多国际组织和结构定为标准,如标准ANSI X9.9,FIPS PUB 113和ISO/IEC 9797,是金融贸易中使用最为广泛的消息认证码。
由于CBC模式加密时,当改变一个明文分组时,其对应密文分组及气候的密文分组都会受到影响,这一性质使CBC模式能被用来产生一个消息认证码,它能使消息接收方相信给定的明文序列的确来自合法的发送者,而没有被篡改。
CMAC共使用三条密钥,一个位长为k的加密密钥,用于密文分组链接的每一步,两个位长为n的密钥,分别用于满分组和不满分组的最后一个明文分组的处理。两个位长为n的密钥可以从加密密钥导出,无需单独提供。
满分组时CMAC计算流程:
不满分组时CMAC计算流程:
注:CMAC于2005年通过NIST认证。
-XCBC模式
XCBC模式(Extend Cipher Block Chaining Mode)由美国学者John Black和Phillip Rogaway于2000年提出的,作为CBC模式的扩展,已被美国*采纳为标准。XCBC模式和CBC模式的区别在于最后一个数据块的处理方式不同,XCBC模式不像CBC模式要求最后一个数据块必须是整块,也可以是短块。XCBC模式具有CBC模式的所有优缺点。
加密框架支持分组算法的XCBC模式,实现源码为,但不是作为一种分组加密模式,而是用来构造MAC,即XCBC-MAC。
相关文章
- Linux加密框架中的算法和算法模式(二)
- 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)
- .net 反射访问私有变量和私有方法 如何创建C# Closure ? C# 批量生成随机密码,必须包含数字和字母,并用加密算法加密 C#中的foreach和yield 数组为什么可以使用linq查询 C#中的 具名参数 和 可选参数 显示实现接口 异步CTP(Async CTP)为什么那样工作? C#多线程基础,适合新手了解 C#加快Bitmap的访问速度 C#实现对图片文件的压
- 【PS算法理论探讨一】 Photoshop中两个32位图像混合的计算公式(含不透明度和图层混合模式)。
- Java 数据结构-特点: 代表一个队列,通常按照先进先出(FIFO)的顺序操作元素。 实现类: LinkedList, PriorityQueue, ArrayDeque。 堆(Heap) 堆(Heap)优先队列的基础,可以实现最大堆和最小堆。 PriorityQueue<Integer minHeap = new PriorityQueue<>; PriorityQueue<Integer maxHeap = new PriorityQueue<>(Collections.reverseOrder); 树(Trees) Java 提供了 TreeNode 类型,可以用于构建二叉树等数据结构。 class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 图(Graphs) 图的表示通常需要自定义数据结构或使用图库,Java 没有内建的图类。 以上介绍的只是 Java 中一些常见的数据结构,实际上还有很多其他的数据结构和算法可以根据具体问题选择使用。 其他一些说明 以下这些类是传统遗留的,在 Java2 中引入了一种新的框架-集合框架(Collection),我们后面再讨论。 枚举(Enumeration) 枚举(Enumeration)接口虽然它本身不属于数据结构,但它在其他数据结构的范畴里应用很广。 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式。 例如,枚举定义了一个叫nextElement 的方法,该方法用来得到一个包含多元素的数据结构的下一个元素。 关于枚举接口的更多信息,请参见枚举(Enumeration)。 位集合(BitSet) 位集合类实现了一组可以单独设置和清除的位或标志。 该类在处理一组布尔值的时候非常有用,你只需要给每个值赋值一"位",然后对位进行适当的设置或清除,就可以对布尔值进行操作了。 关于该类的更多信息,请参见位集合(BitSet)。 向量(Vector) 向量(Vector)类和传统数组非常相似,但是Vector的大小能根据需要动态的变化。 和数组一样,Vector对象的元素也能通过索引访问。 使用Vector类最主要的好处就是在创建对象的时候不必给对象指定大小,它的大小会根据需要动态的变化。 关于该类的更多信息,请参见向量(Vector) 栈(Stack) 栈(Stack)实现了一个后进先出(LIFO)的数据结构。 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部。 当你从栈中取元素的时候,就从栈顶取一个元素。换句话说,最后进栈的元素最先被取出。 关于该类的更多信息,请参见栈(Stack)。 字典(Dictionary) 字典(Dictionary) 类是一个抽象类,它定义了键映射到值的数据结构。 当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用 Dictionary。 由于 Dictionary 类是抽象类,所以它只提供了键映射到值的数据结构,而没有提供特定的实现。 关于该类的更多信息,请参见字典( Dictionary)。 Dictionary 类在较新的 Java 版本中已经被弃用(deprecated),推荐使用 Map 接口及其实现类,如 HashMap、TreeMap 等,来代替 Dictionary。
- 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)
- 常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES
- 串匹配模式中的BF算法和KMP算法
- C#中的SHA1和MD5加密和PHP中相应算法结果为什么不同
- 算法导论(第三版)Exercises2.3(归并排序、二分查找、计算集合中是否有和为X的2个元素)