RC5加密

背景

RC5全称Rivest Cipher5,,是1994年Ron Rivest设计的(原始论文)。AES的候选算法之一RC6就是基于RC5开发的。这种算法具有块可变,秘钥长度可变,加密轮数可变的特点,非常灵活。并且,操作简单,仅需加法、移位、异或即可完成,而且内存占用极少

基本原理

首先加密前要确定块长,轮数和秘钥长度,确定后不可改变。其中块长可选16,32或64位。轮数介于1-255之间,秘钥长度介于0-255字节。为了便于记忆,我们定义RC5-w/r/b表示一个实例,w/r/b分别表示一个字的长度(算法以两个字位一单位),轮数和秘钥长。推荐的最低安全标准为RC5-32/16/16

加密时都先将明文块分两部分,用这两部分开始若干轮计算,每轮都涉及相加、移位和异或,最后输出密文

详细流程

初始化操作

首相将明文分为A,B两部分。然后A与子秘钥S[0]相加,B与子秘钥S[1]相加,结果分别用2^w求模,得到C,D

每一轮细节

  1. C和D异或得E
  2. E循环左移D位
  3. E与子秘钥S[2i]相加得F。同样也要模2^w,i表示第几轮
  4. D与F异或得G
  5. G循环左移F位
  6. G与子秘钥S[2i+1]相加得H。同样也要模2^w,i表示第几轮
  7. 若还有轮数则C=F,D=H

基本可以写成下列形式

A = A + S[0]
B = B + S[1]
for i = 1 to r:
    A = ((A XOR B) <<< B) + S[2i]
    B = ((B XOR A) <<< A) + S[2i+1]

秘钥计算

子秘钥生成

首先取两个常亮P、Q。P与Q在不同的w也就是字长下有不同值:

W P Q
16 0xB7E1 0x9E37
32 0xB7E15163 0x9E3779B9
64 0xB7E151628AED2A6B 0x9E3779B97F4A7C15

P、Q计算公式分别如下:

第一个公式中的e表示自然常数,即2.71828… 第二个公式中的φ表示黄金比例,即1.618….。odd表示取最接近给定输入的奇数。P、Q都是魔法数字,没有任何来源根据.

得到两个常数后,令S[0] = P,从i=1开始循环,i每个循环递增1,每次循环计算A = S[i-1]+Q,B = A mod 2^w,S[i] = B。一直循环2(r+1)-1次。表示如下

s[0] = P
for i = 1 to 2(r+1)-1:
    s[i] = (s[i-1]+Q) mod 2^w

子秘钥混合

该阶段将子秘钥S与秘钥L进行混合

i = j = 0
A = B = 0
do 3 * max(2(r+1), (b*8)/w) times:
    A = S[i] = (S[i] + A + B) <<< 3
    B = L[j] = (L[j] + A + B) <<< (A + B)
    i = (i + 1) mod 2(r+1)
    j = (j + 1) mod (b*8)/w

解密

解密就是将加密过程颠倒

for i = r to 1:
    A = ((B - S[2i+1])>>>A) XOR A
    B = ((A - S[2i])>>>B) XOR B

B = B - S[1]
A = A - S[0]

安全性

12轮RC5(64位块)容易受到使用了2^44的选定的明文的差分攻击。18–20轮加密则被认为可以提供足够的保护。更大的安全性可以通过增加轮数获得,其代价是减少密码的吞吐量。

实现

论文附录中作者给出了详细实现,这里不再列出。

题图来自unsplash:https://unsplash.com/photos/WhRsHmFtFXQ