退出 DES,进入 Rijndael

原文出自IBM:http://www.ibm.com/developerworks/cn/security/s-rijn/

DES 算法是全世界最广泛使用的加密算法。最近,就在 2000 年 10 月,它在其初期就取得的硬件方面的优势已经阻碍了其发展,作为政府加密技术的基础,它已由“高级加密标准”(AES) 中包含的另一种加密算法代替了。AES 是指定的标准密码系统,未来将由政府和银行业用户使用。AES 用来实际编码数据的加密算法与以前的 DES 标准不同。我们将讨论这是如何发生的,以及 AES 中的 Rijndael 算法是如何取代 DES 的算法的。

DES:首要步骤

1973 年 5 月 15 日,美国国家标准局 (NBS) 在“联邦注册”上发布了一条通知,征求密码算法,用于在传输和存储期间保护数据。IBM 提交了一个候选算法,它是 IBM 内部开发的,名为 LUCIFER。在美国国家安全局 (NSA) 的“指导”下完成了算法评估之后,在 1977 年 7 月 15 日,NBS 采纳了 LUCIFER 算法的修正版作为新的数据加密标准。这导致了联邦信息处理标准 (FIPS) 46(以后更新成 FIPS 46-3)的产生(请参阅 参考资料),它描述了 DES 和当前 DES 3 标准的用法。

除政府以外,银行业是加密的最大用户。所有用普通电话线处理业务的电子汇款 (EFT) 和自动取款机 (ATM) 都必须加密其财务数据,使外表安全。大规模银行业的标准是由美国国家标准学会 (ANSI) 制定的。1980 年采用的 ANSI X3.92 指定了要使用 DES 算法。现在,ATM 仍例行公事地使用着 DES。


DES 的工作方式:可怕的细节

DES 将消息分成 64 位(即 16 个十六进制数)一组进行加密。DES 使用“密钥”进行加密,从符号的角度来看,“密钥”的长度是 16 个十六进制数(或 64 位)。但是,由于某些原因(可能是因为 NSA 给 NBS 的“指引”),DES 算法中每逢第 8 位就被忽略。这造成密钥的实际大小变成 56 位。编码系统对“强行”或“野蛮”攻击的抵抗力与其密钥空间或者系统可能有多少密钥有直接关系。使用的位数越多转换出的密钥也越多。密钥越多,就意味着强行攻击中计算密钥空间中可能的密钥范围所需的时间就越长。从总长度中切除 8 位就会在很大程度上限制了密钥空间,这样系统就更容易受到破坏。

DES 是块加密算法。这表示它处理特定大小的纯文本块(通常是 64 位),然后返回相同大小的密码块。这样,64 位(每位不是 0 就是 1)有 264 种可能排列,DES 将生成其中的一种排列。每个 64 位的块都被分成 L、R 左右两块,每块 32 位。

DES 算法使用以下步骤:

  1. 创建 16 个子密钥,每个长度是 48 位。根据指定的顺序或“表”置换
    64 位的密钥。如果表中的第一项是 "27",这表示原始密钥 K 中的第 27 位将变成置换后的密钥 K+ 的第一位。如果表的第二项是 36,则这表示原始密钥中的第 36 位将变成置换后密钥的第二位,以此类推。这是一个线性替换方法,它创建了一种线性排列。置换后的密钥中只出现了原始密钥中的 56 位。

    接着,将这个密钥分成左右两半,C0 和 D0,每一半 28 位。定义了 C0 和 D0 之后,创建 16 个 Cn 和 Dn 块,其中 1<=n<=16。每一对 Cn 和 Dn 块都通过使用标识“左移位”的表分别从前一对 Cn-1 和 Dn-1 形成,n = 1, 2, ..., 16,而“左移位”表说明了要对哪一位进行操作。在所有情况下,单一左移位表示这些位轮流向左移动一个位置。在一次左移位之后,28 个位置中的这些位分别是以前的第 2、3……28 位。

    通过将另一个置换表应用于每一个 CnDn 连接对,从而形成密钥 Kn,1<=n<=16。每一对有 56 位,而置换表只使用其中的 48 位,因为每逢第 8 位都将被忽略。

  2. 编码每个 64 位的数据块。
    64 位的消息数据 M 有一个初始置换 IP。这将根据置换表重新排列这些位,置换表中的项按这些位的初始顺序描述了它们新的排列。我们以前见过这种线性表结构。

    使用函数 f 来生成一个 32 位的块,函数 f 对两个块进行操作,一个是 32 位的数据块,一个是 48 位的密钥 Kn,连续迭代 16 次,其中 1<=n<=16。用 + 表示 XOR 加法(逐位相加,模除 2)。然后,n 从 1 到 16,计算 Ln = Rn-1 Rn = Ln-1 + f(Rn-1,Kn) 。即在每次迭代中,我们用前一结果的右边 32 位,并使它们成为当前步骤中的左边 32 位。对于当前步骤中的右边 32 位,我们用算法 f XOR 前一步骤中的左边 32 位。

    要计算 f,首先将每一块 Rn-1 从 32 位扩展到 48 位。可以使用选择表来重复 Rn-1 中的一些位来完成这一操作。这个选择表的使用就成了函数 f。因此 f(Rn-1) 的输入块是 32 位,输出块是 48 位。f 的输出是 48 位,写成 8 块,每块 6 位,这是通过根据已知表按顺序选择输入中的位来实现的。

    我们已经使用选择表将 Rn-1 从 32 位扩展成 48 位,并将结果 XOR 密钥 Kn。现在有 48 位,或者是 8 组,每组 6 位。每组中的 6 位现在将经历一次变换,该变换是算法的核心部分:在叫做“S 盒”的表中,我们将这些位当作地址使用。每组 6 位在不同的 S 盒中表示不同的地址。该地址中是一个 4 位数字,它将替换原来的 6 位。最终结果是 8 组,每组 6 位变换成 8 组,每组 4 位(S 盒的 4 位输出),总共 32 位。

    f 计算的最后阶段是对 S 盒输出执行置换 P,以得到 f 的最终值。f 的形式是 f = P(S1(B1)S2(B2)...S8(B8)) ))。置换 P 根据 32 位输入,在以上的过程中通过置换输入块中的位,生成 32 位输出。

解密只是加密的逆过程,使用以上相同的步骤,但要逆转应用子密钥的顺序。DES 算法是可逆的。

三重 DES(官方叫做 DES 3)只是以某种特殊的顺序使用 2 个密钥执行三次 DES。三重 DES 也可以使用三个单独密钥,而不只使用两个。DES 3 中可能的密钥有 2 112个,而在 DES 中只有 2 56个可能的密钥。


“高级加密标准”成就

早在 1993 年,政府就意识到 DES 安全性将会受到危害。即使我们假定 NSA 在 DES 中构建了一个后门以允许政府可以对 DES 消息进行常规解密(如公钥发现者 Diffie 和 Hellman 在 1975 年给 NSA 的信中声称的那样),DES 是日趋过时的加密算法。这并不是那么有效的方法。它在硬件上表现并不如人意(如“智能卡”已开始显示其缺点)。但直到 1997 年,美国国家科学技术研究所 (NIST) 才开始打着 AES 项目的旗帜征集其接任者。

1997 年 4 月的一个 AES 研讨会宣布了以下 AES 成就的最初目标:

  • 可供政府和商业使用的功能强大的加密算法
  • 支持标准密码本方式

    注:DES 算法将消息块置换成密码块。如果每一块都单独加密,那么加密方式叫做电子代码书 (Electronic Code Book) (ECB) 方式。DES 加密有另外两种方式,分别叫链块编码 (Chain Block Coding) (CBC) 和密码反馈 (Cipher Feedback) (CFB),它们使每个密码块都依赖于初始 XOR 操作中所有以前的消息块。由于政府/银行业都使用这三种方式,所以需要 AES 如何处理信息方面的兼容性。

  • 要明显比 DES 3 有效
  • 密钥大小可变,这样就可在必要时增加安全性
  • 以公正和公开的方式进行选择
  • 可以公开定义
  • 可以公开评估

AES 的草案中最低可接受要求和评估标准是:

A.1 AES 应该可以公开定义。

A.2 AES 应该是对称的块密码。

A.3 AES 应该设计成密钥长度可以根据需要增加。

A.4 AES 应该可以在硬件和软件中实现。

A.5 AES 应该 a) 可免费获得,或 b) 遵守与美国国家标准学会 (ANSI) 专利政策一致的规定获得。
注:这意味着将把受专利权保护的算法(受 ANSI 政策影响的算法)也考虑在内。已经放弃了这种想法,因此确保了不受保护(即,无专利)的算法成为唯一的选择。

A.6 将根据以下要素评价符合上述要求的算法:

  1. 安全性(密码分析所需的努力)
  2. 计算效率
  3. 内存需求
  4. 硬件和软件可适用性
  5. 简易性
  6. 灵活性
  7. 许可证需求(见上面的 A5)

Rijndael:AES 算法获胜者

2000 年 10 月,NIST 选择 Rijndael(发音为 "Rhine dale")作为 AES 算法。它目前还不会代替 DES 3 成为政府日常加密的方法,因为它还须通过测试过程,“使用者”将在该测试过程后发表他们的看法。但相信它可以顺利过关。

Rijndael 是带有可变块长和可变密钥长度的迭代块密码。块长和密钥长度可以分别指定成 128、192 或 256 位。

Rijndael 中的某些操作是在字节级上定义的,字节表示有限字段 GF(2 8) 中的元素,一个字节中有 8 位。其它操作都根据 4 字节字定义。

加法照例对应于字节级的简单逐位 EXOR。

在多项式表示中,GF(2 8) 的乘法对应于多项式乘法模除阶数为 8 的不可约分二进制多项式。(如果一个多项式除了 1 和它本身之外没有其它约数,则称它为不可约分的。)对于 Rijndael,这个多项式叫做 m(x),其中: m(x) = (x 8 + x 4 + x 3 + x + 1) 或者十六进制表示为 '11B'。其结果是一个阶数低于 8 的二进制多项式。不像加法,它没有字节级的简单操作。



不使用 Feistel 结构!

在大多数加密算法中,轮回变换都使用著名的 Feistel 结构。在这个结构中,中间 State 的位部分通常不做更改调换到另一个位置。(这种线性结构的示例是我们在 DES 部分中讨论的那些表,即使用固定表的形式交换位。)Rijndael 的轮回变换不使用这个古老的 Feistel 结构。轮回变换由三个不同的可逆一致变换组成,叫做层。(“一致”在这里表示以类似方法处理 State 中的位。)

线性混合层保证了在多个轮回后的高度扩散。非线性层使用 S 盒的并行应用,该应用程序有期望的(因此是最佳的)最差非线性特性。S 盒是非线性的。依我看来,这就 DES 和 Rijndael 之间的密钥概念差异。密钥加法层是对中间 State 的轮回密钥 (Round Key) 的简单 EXOR,如以下所注。

轮回变换由四个不同的变换组成。在伪 C 表示法中,它们是:

Round(State,RoundKey)
            {
            ByteSub(State);
            ShiftRow(State);
            MixColumn(State);
            AddRoundKey(State,RoundKey); (EXORing a Round Key to the State)
            }
            

加密算法的最后一个轮回稍有不同。它由以下代码定义:

FinalRound(State,RoundKey)
            {
            ByteSub(State);
            ShiftRow(State);
            AddRoundKey(State,RoundKey);
            }
            

在这个表示法中,“函数”(Round, ByteSub, ShiftRow,...) 对那些被提供指针 (State, RoundKey) 的数组进行操作。ByteSub 变换是非线性字节交换,各自作用于每个 State 字节上。在 ShiftRow 中,State 的行按不同的偏移量循环移位。在 MixColumn 中,将 State 的列视为 GF(2 8) 多项式,然后乘以固定多项式 c( x ) 并模除 x 4 + 1,其中 c( x ) = '03' x 3 + '01' x 2+ '01' x + '02' 。这个多项式与 x 4 + 1 互质,因此是可逆的。

轮回密钥通过密钥计划方式从密码密钥 (Cipher Key) 派生而出。它有两个组件:密钥扩展 (Key Expansion) 和轮回密钥选择 (Round Key Selection)。轮回密钥的总位数等于块长度乘以轮回次数加 1(例如,块长度等于 128 位,10 次轮回,那么就需要 1408 个轮回密钥位)。

密码密钥扩充成扩展密钥 (Expanded Key)。轮回密钥是通过以下方法从这个扩展密钥中派生的:第一个轮回密钥由前 Nb(Nb = 块长度)个字组成,第二个由接着的 Nb 个字组成,以此类推。

加密算法由以下部分组成:初始轮回密钥加法、Nr-1 个轮回和最后一个轮回。在伪 C 代码中:

Rijndael(State,CipherKey)
            {
            KeyExpansion(CipherKey,ExpandedKey);
            AddRoundKey(State,ExpandedKey);
            For( i=1 ; i<Nr ; i++ ) Round(State,ExpandedKey + Nb*i);
            FinalRound(State,ExpandedKey + Nb*Nr).
            }
            

如果已经预先执行了密钥扩展,则可以根据扩展密钥指定加密算法。

Rijndael(State,ExpandedKey)
            {
            AddRoundKey(State,ExpandedKey);
            For( i=1 ; i<Nr ; i++ ) Round(State,ExpandedKey + Nb*i);
            FinalRound(State,ExpandedKey + Nb*Nr);
            }
            

由于 Rijndael 是可逆的,解密过程只是颠倒上述的步骤。可以在 Rijndael 规范(请参阅 参考资料)中找到详细技术信息。

最后,开发者将仔细考虑如何集成这种安全性进展,使之成为继 Rijndael 之后又一个得到广泛使用的加密算法。AES 将很快应一般商业团体的要求取代 DES 成为标准,而该领域的发展进步无疑将追随其后。

posted on 2007-12-25 19:56  Mainz  阅读(658)  评论(1编辑  收藏  举报

导航