2010-08-24 60 views
0
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

不,這肯定不是CTR模式。 它看起來像一個disc encryption mode。特別是加密模式與LRW稍有相似之處。主要思想是根據塊號調整輸入,以便多次加密相同的塊不會導致相同的密文。 它允許部分重新加密消息,但攻擊者會注意到,明文的哪些部分發生了變化。

因此存在一些小的信息泄漏。由於我也沒有看到任何身份驗證,我不認爲我喜歡這種加密模式。

+0

謝謝,這是有道理的。 – meeuw 2010-08-27 17:48:09