RISC-V MCU中文社区

【分享】 RC5算法协处理器设计实现一

发表于 全国大学生集成电路创新创业大赛 2021-06-10 16:05:44
0
1383
1

队伍编码:CICC1905   队伍名称:青稞战队

1、RC5算法参数选择

通过三个可变参数可确定一组加密算法,可表示为RC5-w/r/b。w表示明文/秘文字分组后的字长,完整明文/秘文字长为2w;w一般长度为16,32,64。r表示加密轮数,0

2、 RC5涉及的运算符 

表1-1 RC5涉及的运算符

Tab.1-1 Operators involved in RC5

符号

含义

X<<

X循环左移Ybit

+

模2^w加

^

逐为异或

 

/3、 RC5密钥扩展  

第一步:初始化两个有w决定的常数Pw和Qw,。这两个常数的定义如下:

Pw = Odd((e-2)*2^w)

Qw =Odd((q-1)*2^w)

其中e=2.718281828459...(自然对数的底),q=1.618033988749...(黄金分割),Odd[x]表示距离x最近的奇数,对于w=16,32,64时,Pw,Qw用十六进制表示如表1-1所示:

表1-2 Pw、Qw的十六进制表示

Table 1-2 Hexadecimal representation of PW and QW

w

16

32

64

Pw

b7e1

b7e15163

b7e151628aed2a6b

Qw

9e37

9e377b9

9e3779b97f4a7c15

第二步:将密钥由字节数组Key[0,...,b-1]填充得到数组L[0,...,c-1],c= [b/u],u= w/8, 在这w=32,故u=4,c=4,填充时从地位到高位按自然顺序填充,即L[0] = key[31:24] key [23:16] key [15:8] key [7:0];L[1] = key [63:56] key [55:48] key [47:40] key [39:32];L[2] = key [95:88] key [87:80] key [79:72] key [71:64];L[3] = key [127:120] key [119:112] key [111:104] key[103:96][2];算法描述为

i=j=0,x=y=0

Do 3*max(t,c)times;

S[i]=(S[i]+s+y)<<<3;x=S[i];i=(i+1)mod(t);

L[j]=(L[j]+x+y)<<<(x+y);x=L[j];j=(j+1)mod(c);

其中t=2r+2;

第三步:经26轮的迭代循环密钥混合后的得出26个子密钥。

i=j=0;

A =B =0;

Do 3*max(t,c)times;

A=S[i]=(S[i]+A+B)<<<3;

B=L[j]=(L[j]+A+B)<<<(A+B);

i=(i+1)mod(t);

j=(j+1)mod(c);

RC5密钥扩展算法的流程图,如图1.2.1是基于RC5-w/r/b=RC5-32、12、16的流程图

  

图1-1 RC5-w/r/b=RC5-32、12、16

Fig.1-1 RC5-W/R/B = RC5-32, 12, 16

用于存放子密钥的变量s被定义为832bit,以存放26个子密钥,s的初始值设为0,通过逐个加32’h9e3779b9形成固定的26个初始化密钥。该加法过程描述如下:

S[31:0] = 32’d0+32’h9e3779b9;

S[63:32] = S[31:0] + 32’h9e3779b9;

...

S[831:800] = S[799:768]+ 32’h9e3779b9;

4、加密算法 

RC5加密算法的加密过程需要输入2wbit的明文,分别存于a和b两个寄存器,加密步骤描述如下:

先用a和b分别模2^w加上s[0]和s[1],再赋值给a,b,完成a和b的初始化;

(1)a和b异或赋给a,a再循环左移bit;

(2)a模2^w加s[2*i],再赋给a,此时a为这一轮的最新值;

(3)a的最新值异或b,存入b;

(4)把b循环左移abit,注意要用a的最新值;

(5)B模2^w加s[2*i+1],存入b;

(8)回到(1),重复复执行r轮。

伪代码描述如下:

A = A + S[0]

B = B + S[1]

for i = 1 to r do:

A = ((A ^ B) <<< B) + S[2 * i]

B = ((B ^ A) <<< A) + S[2 * i + 1]

return A, B

5、 解密算法

加密的逆过程即为解密,用伪代码描述如下:

for i = r down to 1 do:

  B = ((B - S[2 * i + 1]) >>> A) ^ A

    A = ((A - S[2 * i]) >>> B) ^ B

B = B - S[1]

A = A - S[0]

return A, B

喜欢1
用户评论
aaaa

aaaa 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板