RC5

✍ dations ◷ 2025-08-02 14:30:43 #RC5

在密码学中,RC5是一种因简洁著称的对称分组加密算法。由罗纳德·李维斯特于1994年设计,“RC”代表“Rivest Cipher”,或者“Ron's Code”(相较于RC2和RC4)。RC6算法是基于RC5的。

和许多加密方法不同,RC5支持可变的块大小(32、64或128比特),密钥长度(0至2040位)和加密轮数(0~255)。最初建议选择的参数是64位的块大小,128位的密钥和12轮加密。

RC5的一个关键特征是使用基于数据的置换。RC5的其中一个目标是促进对于这类作为原始密码的操作的研究和评估。RC5也包括一些的取模加法和逻辑异或(XOR)运算。这个加密的一般结构是一种类费斯妥网络。加密和解密程序可以用几行代码写完,但密钥的生成算法更复杂。密钥扩展使用了e和黄金比例代入一个单向函数,将所得值作为“袖子里是空的(英语:Nothing-up-my-sleeve number)”数字(即无任何来源依据的魔法数字)。算法的诱人的简洁性和基于数据的置换的特性,让RC5吸引了众多密码研究人员将其作为研究对象。RC5通常被记为RC5-w/r/b,w=字的大小(以bit为单位),r=加密轮数,b=密钥的字节数。

RC5加密和解密都将随机的密钥扩展成2(r+1)个字,在加密和解密的过程中,这些字将会被按顺序使用(而且每个字只使用一次)。以下的所有内容都来自Rivest的修订后的RC5的论文

密钥扩展算法将会在下面讲解,首先以伪代码表示,之后是用从参考资料中的论文附录中直接复制的C语言代码。

以下是论文中的命名方案,使用了这些变量名:

# Break K into words# u = w / 8c = ceiling( max(b, 1) / u )# L is initially a c-length list of 0-valued w-length wordsfor i = b-1 down to 0 do:    L = (L << 8) + K     # Initialize key-independent pseudorandom S array# S is initially a t=2(r+1) length list of undefined w-length wordsS = P_wfor i = 1 to t-1 do:    S = S + Q_w    # The main key scheduling loopi = j = 0A = B = 0do 3 * max(t, c) times:    A = S = (S + A + B) <<< 3    B = L = (L + A + B) <<< (A + B)    i = (i + 1) % t    j = (j + 1) % c# return S

实例源码由Rivest的RC5论文的附录提供。这个代码实现对应 w = 32, r = 12, b = 16。

void RC5_SETUP(unsigned char *K){   // w = 32, r = 12, b = 16   // c = max(1, ceil(8 * b/w))   // t = 2 * (r+1)   WORD i, j, k, u = w/8, A, B, L;      for(i = b-1, L = 0; i != -1; i--)      L = (L << 8) + K;      for(S = P, i = 1; i < t; i++)      S = S + Q;      for(A = B = i = j = k = 0; k < 3 * t; k++, i = (i+1) % t, j = (j+1) % c)   {      A = S = ROTL(S + (A + B), 3);      B = L = ROTL(L + (A + B), (A + B));   }}

加密

加密涉及的一个简单的函数的几轮加密。基于安全需要和时间方面的考虑,12或20轮是建议的值。除了上述使用的变量,以下变量在算法之中使用:

A = A + SB = B + Sfor i = 1 to r do:    A = ((A ^ B) <<< B) + S    B = ((B ^ A) <<< A) + S# The ciphertext block consists of the two-word wide block composed of A and B, in that order.return A, B

Rivest给出的示例C源码如下

void RC5_ENCRYPT(WORD *pt, WORD *ct){   WORD i, A = pt + S, B = pt + S;      for(i = 1; i <= r; i++)   {      A = ROTL(A ^ B, B) + S;      B = ROTL(B ^ A, A) + S;   }   ct = A; ct = B;}

解密

解密实际上就是直接把加密过程颠倒。以下代码展示了这个过程。

for i = r down to 1 do:    B = ((B - S) >>> A) ^ A    A = ((A - S) >>> B) ^ BB = B - SA = A - Sreturn A, B

Rivest给出的示例C源码如下。

void RC5_DECRYPT(WORD *ct, WORD *pt){   WORD i, B=ct, A=ct;      for(i = r; i > 0; i--)   {      B = ROTR(B - S, A) ^ A;      A = ROTR(A - S, B) ^ B;   }      pt = B - S; pt = A - S;}

密码分析

12轮RC5(64位块)容易受到使用了244的选定的明文的差分攻击。 18–20轮加密则被认为可以提供足够的保护。

拥有其算法专利的公司RSA安全, 提供一系列的10,000美元的奖金作为破译用RC5加密的密文的奖励,但这些竞赛已经在2007年5月停止。其中的一部分已经在Distributed.net组织下利用分布式计算破解。Distributed.net暴力破解了用56位和64位密钥的RC5加密的密文,正在尝试破解72位密钥的密文;截至2018年2月,5.02%的密钥空间已被遍历。以目前的速度,这将需要大约166年以测试的每一个可能的剩余密钥,以此才能保证项目的完成。这项任务启发了许多在集群计算领域的新兴的开发研究。

相关