代码之家  ›  专栏  ›  技术社区  ›  Danielius

RC-6密文与非0向量不匹配

  •  1
  • Danielius  · 技术社区  · 6 年前

    我遇到了这个问题,我的RC-6算法没有产生密码文本。为了更清楚,让我给你一个例子

    enter image description here 正如您所看到的,当纯文本和键由零字节组成时,它通过了两个测试->密文和解密文本测试

    为了进一步澄清这一点,加密后的密码值(正确和错误)也以小端方式排序。

    所以我的问题是- 我应该在哪里查找无效代码?

    我觉得这与字节排序有关,然后再将其传递给加密或密钥调度函数。

    我传递给密钥调度和加密函数的值是32位字的直接数组(例如。 [0x00,0x10,0x00,0x00] )然后我将一个直接移到算法(我在编写时查看了伪代码),因此在此之前没有其他格式。

    它们也从以下方面开始:

    def encrypt(plaintext,S):   
        A,C = plaintext[0],plaintext[2] 
        B = modulus(plaintext[1]+S[0])
        D = modulus(plaintext[3]+S[1])  
        for i in range(1,r+1):
             ....
    def keyGenerator(L):
        c = len(L)
        S = [int(0)]* (2*r+4)
        S[0] = P
        ....
    

    我需要任何帮助。。

    提前感谢您!

    顺便说一下,官方的测试向量可能 THIS 文件附录

    1 回复  |  直到 6 年前
        1
  •  1
  •   Danielius    6 年前

    所以我找到了这个案子的症结所在。交换字节确实有问题。由于0是对称输入,因此它将通过,并且具有混合值的输入可以工作,但是给出了错误的答案。

     def swap32(x):
        return (((x << 24) & 0xFF000000) |((x <<  8) & 0x00FF0000) |
            ((x >>  8) & 0x0000FF00) |((x >> 24) & 0x000000FF)) 
    

    在我的例子中,这个用于交换8字节块的函数非常有用。我必须刷密钥字节,加密时刷明文字节,加密结束时刷,解密时刷,解密结束时刷。
    我希望将来有人会发现这很有用,不会像我一样被困在同一个地方。。 干杯