Twofish Key Extension

I am trying to follow Twofish step by step as described in a 1998 document by Bruce Schneider . However, I am already failing with a key extension.

I tried to copy the details of a 1-in-1 article in python with the following result:

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

However, my conclusion does not coincide with that indicated in the test vectors . I already tried reading bytes in the opposite direction (commented out line), but it did not help.

These are the results of the test vector:

 B89FF6F2 B255BC4B 45661061 8E4447F7 

And these are mine:

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

Can anyone see my mistake?

+4
source share
1 answer

At least this line

 s = [ [0] * 4] * 4 

may not do what you think is doing. It does not do the same as

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

However, I have not used all the code.

EDIT

OP seems to require more evidence. Here is some output from IDLE showing the difference

 >>> 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]] >>> 

The expression s = [ [0] * 4] * 4 creates a list containing another list of zeros, then makes 3 more copies of the link to the list. This is equivalent to v = [0]*4; s=[v,v,v,v] v = [0]*4; s=[v,v,v,v]

+6
source

All Articles