c语言实现rc6,RC6加密解密算法实现(C语言)

这次是RC6加解密算法。RC6继承了RC5的优点,在加密过程中不需要查表,加上算法中的乘法运算可以用平方代替,所以该算法对内存要求极低,这使得RC6适合在单片机上实现。至于RC6的安全性,对RC6最为有效的攻击是强力攻击。但由于分组长度和密钥都至少是128bit,穷举法并不可行。对20轮的RC6,用线性分析法至少需要2^155个明文,用查分分析法至少需要2^238个明文。

RC6分组长度为128bit,使用了4个寄存器,并使用32bit的整数模乘运算,用于加强扩散特性。RC6更精确的表示是RC6-w/r/b,其中字长为w bit,r为加密轮数,b为加密密钥用字节表示的长度。通常令w=32,r=20,b=16(24,32)。

加密过程:(把128bit明文放入4个32bit的寄存器A、B、C、D中)

B=B+S[0] (S为密钥)

D=D+S[1]

for i=1 to r do

t=ROL(B*(2B+1),log2w)

u=ROL(D*(2D+1),log2w)

A=ROL(A⊕t,u)+S[2i]

C=ROL(C⊕u,t)+S[2i+1]

(A,B,C,D)=(B,C,D,A)

A=A+S[2r+2]

C=C+S[2r+3]

A、B、C、D即为密文。

解密过程:(把128bit密文放入4个32bit的寄存器A、B、C、D中)

C=C-S[2r+3]

A=A-S[2r+2]

for i=r down to 1 do

(A,B,C,D)=(D,A,B,C)

u=ROL(D*(2D+1),log2w)

t=ROL(B*(2B+1),log2w)

C=ROR(C-S[2i+1],t)⊕u

A=ROR(A-S[2i],u)⊕t

D=D-S[1]

B=B-S[0]

A、B、C、D即为明文。

密钥扩展方案:(在密钥扩展中用到两个常数P、Q,P=0xB7E15163,Q=0x9E3779B9。

首先,将用户密钥输入到c个w比特字的L[0],...,L[c-1]阵列,若不够,用0字节填充,其中c为8b/w的整数部分)

个人理解:每个L阵列可以存放4个字符,即若c为4时,密钥密钥最长为16个字符。

S[0]=P

for i=1 to 2r+3 do

S[i]=S[i-1]+Q

用户密钥混合到S中

A=B=i=j=0

v=3*max{c,2r+4}

for s=1 to v do循环体循环v次

A=S[i]=ROL(S[i]+A+B,3)

B=L[j]=ROL(L[j]+A+B,A+B)

i=(i+1)mod(2r+4)

j=(j+1)modc

输出S[0],S[1],...,S[2r+3]即为子密钥

个人心得:1、将需要处理的数据统一当做十六进制运算,输入字符的asc码可以通过位移运算处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值