RC6加密算法

1、rc6的来历

1997年NIST(NationalInstituteofStandardsandTechnology)向全世界招募在21世纪替代DES的高级加密标准AES(AdvancedEncryptionStandard),1999年,NIST宣布有5个加密算法作为最后的候选者接受全世界将近一年的考察。这其中就有RC6加密算法算法。

RC6加密算法是在RC5基础上发展起来的,按照AES的要求设计的新型加密算法。跟RC5类似,RC6使用的是相关数据循环移位的思想。RC5本身是一个非常快的分组密码,但它在处理128位分组块时使用2个64位的工作寄存器,而AES目前在讲究效率和简洁方面不支持64位操作,所以RC6对此做了修改,改用四个32位工作寄存器,这样使得在每次循环中要做两次循环移位操作,让更多的数据位来决定循环次数。RC6中又添加了整数乘法操作。乘法操作在RC6中被用来计算循环移位的位数,使得循环移位的位数将与另一个寄存器中的所有位相关,因此RC6每次循环都比RC5有更快的扩散性。这使得RC6可以利用较少的循环次数达到要求的安全性能,从而提高了数据的吞吐能力。

RC6加密算法的性能

算法时间测试

 

 

以上数据取的是时间平均值,每个测试执行10遍,并统一换算到200MHzCPU的情况下。从上表可以看出,RC6的加密速度很快。在VPN的加密方案中,由于为了确保要求的安全性往往会影响到数据的传输速率。RC6在这一方面有很强的优势。

RC6加密算法的安全性
这里假设攻击RC6加密算法最好的途径是穷举法,穷举b位的密钥(或者扩展密钥),这种野蛮的攻击方式对任何的块加密都适用,但只能在一定长度的密钥下进行分析。

 

从数据上可以看出,RC6加密算法在加入了二次函数f(x)=x(2x+1)以及二次函数变换,大大提高了密码扩散性和密码的非线性。而且,RC6的加解密的时间都与数据无关,可以有效地避免“时间攻击”。

 

参考:浅析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]即为子密钥
 

继续rc6加解密算法。

 

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是Python实现RC6加密算法的代码: ```python def rotate_left(n, d): return ((n << d) | (n >> (32 - d))) & 0xFFFFFFFF def rotate_right(n, d): return ((n >> d) | (n << (32 - d))) & 0xFFFFFFFF def expand_key(key, word_size=32, rounds=20): c = len(key) // (word_size // 8) L = [key[i:i+4] for i in range(0, len(key), 4)] P = 0xB7E15163 Q = 0x9E3779B9 K = [0] * (2 * rounds + 4) K[0] = P for i in range(1, 2 * rounds + 4): K[i] = (K[i-1] + Q) & 0xFFFFFFFF A = B = i = j = 0 v = 3 * max(c, (2 * rounds + 4)) for s in range(v): A = K[i] = rotate_left((K[i] + A + B) & 0xFFFFFFFF, 3) B = L[j] = rotate_left((L[j] + A + B) & 0xFFFFFFFF, (A + B) & 0x1F) i = (i + 1) % (2 * rounds + 4) j = (j + 1) % c return K def encrypt_block(M, K, word_size=32, rounds=20): A = int.from_bytes(M[:4], byteorder='little') B = int.from_bytes(M[4:], byteorder='little') P = 0xB7E15163 Q = 0x9E3779B9 for i in range(1, rounds + 1): t = rotate_left((B * (2 * B + 1)) & 0xFFFFFFFF, int(math.log(word_size, 2))) u = rotate_left((A * (2 * A + 1)) & 0xFFFFFFFF, int(math.log(word_size, 2))) A = rotate_left((A ^ t) & 0xFFFFFFFF, u % word_size) + K[2*i-1] B = rotate_left((B ^ u) & 0xFFFFFFFF, t % word_size) + K[2*i] A = (A + K[2*rounds+1]) & 0xFFFFFFFF B = (B + K[2*rounds+2]) & 0xFFFFFFFF return A.to_bytes(4, byteorder='little') + B.to_bytes(4, byteorder='little') def encrypt(plaintext, key, word_size=32, rounds=20): ciphertext = b'' K = expand_key(key, word_size=word_size, rounds=rounds) for i in range(0, len(plaintext), 8): block = plaintext[i:i+8] ciphertext += encrypt_block(block, K, word_size=word_size, rounds=rounds) return ciphertext # Example usage plaintext = b'Hello, world!' key = b'This is a key.' ciphertext = encrypt(plaintext, key) print(ciphertext) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落花逐流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值