我正在尝试在Python中测试this xtea算法的实现。我找到的唯一测试向量是these。 如何测试算法的输出,以便我可以按字节进行比较? 我应该选择哪个密码/密钥?哪个端是最好的? (我在64位xubuntu / x86 / little endian上)
XTEA
# 64 bit block of data to encrypt
v0, v1 = struct.unpack(endian + "2L", block)
# 128 bit key
k = struct.unpack(endian + "4L", key)
sum, delta, mask = 0L, 0x9e3779b9L, 0xffffffffL
for round in range(n):
v0 = (v0 + (((v1<<4 ^ v1>>5) + v1) ^ (sum + k[sum & 3]))) & mask
sum = (sum + delta) & mask
v1 = (v1 + (((v0<<4 ^ v0>>5) + v0) ^ (sum + k[sum>>11 & 3]))) & mask)
return struct.pack(endian + "2L", v0, v1)
初始64位测试输入
# pack 000000 in 64 bit string
byte_string = ''
for c in range(56, -8, -8):
byte_string += chr(000000 >> c & 0xff)
Testvectors(从here复制)
tean values
These are made by starting with a vector of 6 zeroes,
data followed by key, and coding with one cycle then
moving the six cyclically so that n becomes n-1 modulo 6.
We repeat with 2-64 cycles printing at powers of 2 in
hexadecimal. The process is reversed decoding back
to the original zeroes which are printed.
1 0 9e3779b9 0 0 0 0
2 ec01a1de aaa0256d 0 0 0 0
4 bc3a7de2 4e238eb9 0 0 ec01a1de 114f6d74
8 31c5fa6c 241756d6 bc3a7de2 845846cf 2794a127 6b8ea8b8
16 1d8e6992 9a478905 6a1d78c8 8c86d67 2a65bfbe b4bd6e46
32 d26428af a202283 27f917b1 c1da8993 60e2acaa a6eb923d
64 7a01cbc9 b03d6068 62ee209f 69b7afc 376a8936 cdc9e923
1 0 0 0 0 0 0
答案 0 :(得分:2)
你链接的C代码似乎假设long有32位 - XTEA使用由两个uint32组成的64位块;代码使用了一些 long ,并且没有做任何事情来处理在sum / leftshift(并传播到以后的计算中)时发生的溢出。
python代码允许你选择字节序,而C代码将这些数字视为......好吧,数字,所以如果你想比较它们,你需要选择字节序(或者如果你是懒惰的,试试两者和看看是否匹配:)
关于密钥,我不确定你的问题是什么,所以我猜:如果你不是C程序员,行static long pz[1024], n, m;
是静态声明,意味着所有这些值都被隐式初始化为零。
我错过了什么?