首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Twofish键扩展

Twofish键扩展
EN

Stack Overflow用户
提问于 2012-11-29 07:24:42
回答 1查看 562关注 0票数 4

我正在尝试按照1998 paper of Bruce Schneider中的描述一步一步地实现Twofish密码。然而,我已经在密钥扩展上失败了。

我尝试将论文的详细信息一对一地复制到python中,结果如下:

代码语言:javascript
复制
#! /usr/bin/python3.2

def expandKey256 (key):
    m = [0] * (32)
    for i in range (32):
        m [i] = (key >> (i * 8) ) & 0xff
        #m [31 - i] = (key >> (i * 8) ) & 0xff
    print ('m = {}\n'.format ( [hex (b) for b in m] ) )

    M = [0] * 8
    for i in range (8):
        for j in range (4):
            M [i] += m [4 * i + j] * 2 ** (8 * j)
    print ('M = {}\n'.format ( [hex (b) for b in M] ) )

    Me = [M [0], M [2], M [4], M [6] ]
    Mo = [M [1], M [3], M [5], M [7] ]
    print ('Me = {}\n'.format ( [hex (b) for b in Me] ) )
    print ('Mo = {}\n'.format ( [hex (b) for b in Mo] ) )

    RS = [ [0x01, 0xA4, 0x55, 0x87, 0x5A, 0x58, 0xDB, 0x9E],
        [0xA4, 0x56, 0x82, 0xF3, 0x1E, 0xC6, 0x68, 0xE5],
        [0x02, 0xA1, 0xFC, 0xC1, 0x47, 0xAE, 0x3D, 0x19],
        [0xA4, 0x55, 0x87, 0x5A, 0x58, 0xDB, 0x9E, 0x03] ]

    s = [ [0] * 4] * 4
    S = [0] * 4
    for i in range (4):
        for j in range (4):
            for k in range (8):
                s [i] [j] += m [8 * i + k] * RS [j] [k]
                s [i] [j] &= 0xff
            S [i] += s [i] [j] * 2 ** (8 * j)
    for i in range (4):
        print ('S{} = {}'.format (i, hex (S [i] ) ) )

expandKey256 (0x0123456789ABCDEFFEDCBA987654321000112233445566778899AABBCCDDEEFF)

但是,我的输出与test vectors中指定的输出不同。我已经尝试以相反的方式读取字节(注释行),但是没有用。

以下是测试向量的结果:

代码语言:javascript
复制
B89FF6F2
B255BC4B
45661061
8E4447F7

这些是我的:

代码语言:javascript
复制
S0 = 0x612a646d
S1 = 0x527cc87a
S2 = 0x1482c008
S3 = 0xa4d128ce

有人能看到我的错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-29 08:22:56

至少这一行

代码语言:javascript
复制
s = [ [0] * 4] * 4

可能不是在做你认为它在做的事情。它做的事情不同于

代码语言:javascript
复制
s = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

然而,我并没有看完所有的代码。

编辑

显然行动需要更多的证据。下面是IDLE的一些输出,显示了它们之间的差异

代码语言:javascript
复制
>>> s = [ [0] * 4] * 4
>>> s
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> s[0][0] += 1
>>> s
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
>>> s = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> s
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> s[0][0] += 1
>>> s
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> 

表达式s = [ [0] * 4] * 4创建一个包含另一个0列表的列表,然后再创建3个对该列表的引用副本。它等同于v = [0]*4; s=[v,v,v,v]

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13616234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档