import Crypto.Cipher.DES
import struct
def rol32(x, y):
ret = ((x<<y)&0xFFFFFFFF)|((x>>(32-y))&0xFFFFFFFF)
#print 'rol32', hex(x), hex(y), hex(ret)
return ret
def sub32(x, y):
ret = (x & 0xFFFFFFFF) - (y & 0xFFFFFFFF)
if ret < 0: ret += 0x100000000
#print 'sub32', hex(x), hex(y), hex(ret)
return ret
def mul32(x, y):
ret = (x * y) & 0xFFFFFFFF
#print 'mul32', x, y
return ret
d = Crypto.Cipher.DES.new('\xcd\x67\x98\xf2\xa4\xb6\x70\x76', Crypto.Cipher.DES.MODE_ECB)
def decrypt(offset, f):
out_buf = []
b = f.read(16)
buf = d.decrypt(b)
buf = buf[8:] + buf[:8]
for i in range(0,4):
val = struct.unpack('<I', buf[i*4:i*4+4])[0]
val = sub32((sub32(0x8927462, mul32(offset, 0x3210789B)) ^ rol32(val, offset % 32)), 0x12345678)
tmp = struct.pack('<I', val)
out_buf.append(ord(tmp[0]))
out_buf.append(ord(tmp[1]))
out_buf.append(ord(tmp[2]))
out_buf.append(ord(tmp[3]))
for i in range(len(out_buf)-1,len(out_buf)-16,-1):
out_buf[i] ^= out_buf[i-1]
out_buf[len(out_buf)-16] ^= (offset & 0xFF) ^ ((offset >> 14) & 0xFF)
return out_buf
答案 0 :(得分:0)
没有。肯定不是CTR模式。 它看起来像disc encryption mode。特别是加密模式与LRW略有相似之处。主要思想是根据块编号调整输入,以便多次加密同一块不会产生相同的密文。 它允许部分重新加密消息,但攻击者会注意到,明文的哪些部分会发生变化。
因此有一些小的信息泄漏。由于我也没有看到任何身份验证,我认为我不喜欢这种加密模式。