2017-06-06 28 views
0

我無法將一些C代碼翻譯成Python。我盡我所能來模擬C語言的整數溢出的性質,但迄今爲止一直不成功。如果有人有一些洞察力,這將是非常感謝,因爲我是新的python。加密解密&爲:嘗試將XTea加密算法從C移植到Python

iterations = 32 
delta = 0x9e3779b9 
xTeaKey = [<some int32>, <some int32>, <some int32>, <some int32>] 

def int_overflow(val): 
    maxint = 2147483647 

    if not -maxint-1 <= val <= maxint: 
     val = (val + (maxint + 1)) % (2 * (maxint + 1)) - maxint - 1 

    if not -maxint-1 <= val <= maxint: 
     print "AAAAAH" 

    return val 

def xTeaShuffle(x, sum, sumOffset) : 
    e1 = (x << 4) & 0xffffffff 
    e2 = x >> 5 
    e3 = e1^e2 
    e4 = int_overflow(e3 + x) 

    e5a = int_overflow(sum + xTeaKey[(sum & 0x03)]); 
    e5b = int_overflow(sum + xTeaKey[((sum >> 11) & 0x03)]); 
    e5 = e5b if sumOffset else e5a 

    result = e4^e5 

    return result 

def xTeaEncode(data, length) : 
    i = 0 

    while i < length: 
     sum = 0 
     x1 = (data[i] << 16) + data[i + 1] 
     x2 = (data[i + 2] << 16) + data[i + 3] 

     iter = iterations 

     while iter > 0 : 
      x1 = int_overflow(x1 + xTeaShuffle(x2, sum, False)) 
      sum = int_overflow(sum + delta); 
      x2 = int_overflow(x2 + xTeaShuffle(x1, sum, True)) 
      iter -= 1 

     data[i] = (x1 >> 16) & 0xffff 
     data[i + 1] = x1 & 0xffff 
     data[i + 2] = (x2 >> 16) & 0xffff 
     data[i + 3] = x2 & 0xffff 

     i += 4 

    return 

def xTeaDecode(data, length) : 
    i = 0 

    while i < length: 
     sum = int_overflow(delta * iterations) 
     x1 = (data[i] << 16) + data[i + 1] 
     x2 = (data[i + 2] << 16) + data[i + 3] 

     while (sum != 0) : 
      x2 = int_overflow(x2 - xTeaShuffle(x1, sum, True)) 
      sum = int_overflow(sum - delta) 
      x1 = int_overflow(x1 - xTeaShuffle(x2, sum, False)) 

     data[i] = (x1 >> 16) & 0xffff 
     data[i + 1] = x1 & 0xffff 
     data[i + 2] = (x2 >> 16) & 0xffff 
     data[i + 3] = x2 & 0xffff 

     i += 4 

    return 

和原來的C代碼

DllExport void _stdcall XTEAEncode16(unsigned short *data, unsigned char dataLength) 
{ 
    unsigned char i = 0; 
    int x1; 
    int x2; 
    int sum; 
    unsigned char iterationCount; 

    while (i < dataLength) 
    { 
     sum = 0; 
     x1 = ((unsigned int)data[i] << 16) + (unsigned int)data[i+1]; 
     x2 = ((unsigned int)data[i+2] << 16) + (unsigned int)data[i+3]; 
     iterationCount = NUM_ITERATIONS; 

     while (iterationCount > 0) 
     { 
      x1 += (((x2 << 4)^(x2 >> 5)) + x2)^(sum + XTEAKey[(sum & 0x03)]); 
      sum += DELTA; 
      x2 += (((x1 << 4)^(x1 >> 5)) + x1)^(sum + XTEAKey[((sum >> 11) & 0x03)]); 
      iterationCount--; 
     } 
     data[i] = (unsigned short)((unsigned int)x1>>16);  /* take upper half as an int*/ 
     data[i+1] = (unsigned short)(unsigned int)x1;   /* take lower half */ 
     data[i+2] = (unsigned short)((unsigned int)x2>>16);  /* take upper half as an int*/ 
     data[i+3] = (unsigned short)(unsigned int)x2;   /* take lower half */ 

     i += 4; 
    } 
} 

/** 
* Decodes (deciphers) data. 
* Note that data length must be a multiple of 4 words (64 bit). 
*//* *< 16-bit data array *//* *< length of data array */ 
DllExport void _stdcall XTEADecode16(unsigned short* data, unsigned char dataLength) 
{ 
    unsigned char i = 0; 
    int x1; 
    int x2; 
    int sum; 
    unsigned char iterations; 

    iterations = NUM_ITERATIONS; 

    while (i < dataLength) 
    { 
     sum = DELTA * iterations; 
     x1 = ((unsigned int)data[i] << 16) + (unsigned int)data[i+1]; 
     x2 = ((unsigned int)data[i+2] << 16) + (unsigned int)data[i+3]; 

     while (sum != 0) 
     { 
      x2 -= (((x1 << 4)^(x1 >> 5)) + x1)^(sum + XTEAKey[((sum >> 11) & 0x03)]); 
      sum -= DELTA; 
      x1 -= (((x2 << 4)^(x2 >> 5)) + x2)^(sum + XTEAKey[(sum & 0x03)]); 
     } 
     data[i] = (unsigned short)((unsigned int)x1 >> 16); /* take upper half as an int*/ 
     data[i+1] = (unsigned short)((unsigned int)x1);   /* take lower half */ 
     data[i+2] = (unsigned short)((unsigned int)x2 >> 16); /* take upper half as an int*/ 
     data[i+3] = (unsigned short)((unsigned int)x2);   /* take lower half */ 

     i += 4; 
    } 
} 

從我的實驗,加密似乎是確定的,但我永遠不能解密正確的值。任何有識之士將不勝感激。

回答

0

解決了!這裏有一個小問題:

當向右移位(取決於實現)時,位可以填充0或1,具體取決於最左邊的位。這是爲了保留二進制數字的符號。所以當模擬一個c整數的移位時,如果我們不模擬符號,我們必須用1填充左邊,如果這是最左邊的位。