2012-11-28 5 views
4

1998 paper of Bruce Schneider에 설명 된대로 Twofish 사이퍼를 단계별로 구현하려고합니다. 그럼에도 불구하고, 나는 핵심 확장에 이미 실패했다. Twofish 키 확장

나는 다음과 같은 결과로, 파이썬에 용지 1 대 1의 세부 사항을 복사하려고 다음 test vectors에 지정된

#! /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 (0xABCDEFFEDCBA00112233445566778899AABBCCDDEEFF) 

하지만, 내 출력은 동일하지 않습니다. 나는 이미 다른 방법으로 바이트 (주석 처리 된 행)를 읽으려고했지만 아무 쓸모가 없습니다.

B89FF6F2 
B255BC4B 
45661061 
8E4447F7 

그리고이 내 다음과 같습니다 :

S0 = 0x612a646d 
S1 = 0x527cc87a 
S2 = 0x1482c008 
S3 = 0xa4d128ce 

사람이 내 오류를 볼 수를

이 테스트 벡터의 결과는?

+2

파이썬을위한 Twofish 구현이 존재합니다. 틀림없이 그 중 하나를 얻을 수 있고, 그 일과 구현에 풍부한 인쇄 진술을 추가하고 어디서 잘못되었는지 알아낼 수 있습니까? – kindall

+0

파이썬에서는'expandKey256 (key)'가 공백없이 쓰여지는 것이 일반적입니다.'expandKey256 (key)'http://www.python.org/dev/peps/pep-0008/#whitespace-in-expressions- and-statements – monkut

답변

6

적어도이 선

s = [ [0] * 4] * 4 

아마 당신이하고있는 생각하고 있지 않습니다. 동일한 일을하지 않습니다.

s = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 

그러나 모든 코드를 통과하지는 않았습니다.

편집은 분명히 OP는 증거가 더 필요합니다.

>>> 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이 제로의 또 다른 목록을 포함하는리스트를 생성 차이를 나타내는 IDLE 여기서 일부 출력은 다음 목록에 기준의 3 개 개의 복사본을 만든다. v = [0]*4; s=[v,v,v,v]

+0

나는 왜이 대답이 upvoted인지 이해하지 못한다. 파이썬 3.2 쉘에'[[0] * 4] * 4'라고 입력하고 결과를 확인하십시오. 편집 : 또한 python2.7에 – Hyperboreus

+0

@Hyperboreus : 확인. 입력 한 후 s [0] [0] + = 1을 수행 한 다음 s를 봅니다. –

+0

고맙습니다. 나로부터 upvote. – Hyperboreus