2010-04-06 177 views
1

任何人都知道TEA(Tiny Encryption Algorithm)的正確python實現嗎?我嘗試了我在這裏找到的那​​個:http://sysadminco.com/code/python-tea/ - 但它似乎不能正常工作。Python TEA實現

它會返回與C或Java中的其他實現不同的結果。我想這是由Python中完全不同的數據類型引起的(事實上沒有數據類型)。

下面的代碼和一個例子:

def encipher(v, k): 
    y=v[0];z=v[1];sum=0;delta=0x9E3779B9;n=32 
    w=[0,0] 
    while(n>0): 
     y += (z << 4^z >> 5) + z^sum + k[sum & 3] 
     y &= 4294967295L # maxsize of 32-bit integer 
     sum += delta 
     z += (y << 4^y >> 5) + y^sum + k[sum>>11 & 3] 
     z &= 4294967295L 
     n -= 1 

    w[0]=y; w[1]=z 
    return w 

def decipher(v, k): 
    y=v[0] 
    z=v[1] 
    sum=0xC6EF3720 
    delta=0x9E3779B9 
    n=32 
    w=[0,0] 
    # sum = delta<<5, in general sum = delta * n 

    while(n>0): 
     z -= (y << 4^y >> 5) + y^sum + k[sum>>11 & 3] 
     z &= 4294967295L 
     sum -= delta 
     y -= (z << 4^z >> 5) + z^sum + k[sum&3] 
     y &= 4294967295L 
     n -= 1 

    w[0]=y; w[1]=z 
    return w 

Python的例子:

>>> import tea 
>>> key = [0xbe168aa1, 0x16c498a3, 0x5e87b018, 0x56de7805] 
>>> v = [0xe15034c8, 0x260fd6d5] 
>>> res = tea.encipher(v, key) 
>>> "%X %X" % (res[0], res[1]) 
**'70D16811 F935148F'** 

C的例子:

#include <unistd.h> 
#include <stdio.h> 

void encipher(unsigned long *const v,unsigned long *const w, 
    const unsigned long *const k) 
{ 
    register unsigned long  y=v[0],z=v[1],sum=0,delta=0x9E3779B9, 
           a=k[0],b=k[1],c=k[2],d=k[3],n=32; 

    while(n-->0) 
     { 
     sum += delta; 
     y += (z << 4)+a^z+sum^(z >> 5)+b; 
     z += (y << 4)+c^y+sum^(y >> 5)+d; 
     } 

    w[0]=y; w[1]=z; 
} 

int main() 
{ 
     unsigned long v[] = {0xe15034c8, 0x260fd6d5}; 
     unsigned long key[] = {0xbe168aa1, 0x16c498a3, 0x5e87b018, 0x56de7805}; 

     unsigned long res[2]; 

     encipher(v, res, key); 

     printf("%X %X\n", res[0], res[1]); 

     return 0; 
} 

$ ./tea 
**D6942D68 6F87870D** 

請注意,這兩個例子都以相同的輸入運行數據(v和鍵),但結果不同。我非常肯定C的實施是正確的 - 它來自維基百科引用的網站(我無法發佈鏈接,因爲我沒有足夠的信譽點 - 一些反垃圾郵件)

+0

唯一的解決方案,它來到我的腦海是使用ctypes的Python庫。但我不確定這是否可行。 – grzaks 2010-04-06 21:19:07

+0

這看起來更像是XTEA而不是TEA的實現。 – abc 2010-04-07 11:26:39

回答

10

我修好了。在蟒蛇這裏工作TEA實現:

#!/usr/bin/env python 
#-*- coding: utf-8 -*- 

import sys 
from ctypes import * 

def encipher(v, k): 
    y = c_uint32(v[0]) 
    z = c_uint32(v[1]) 
    sum = c_uint32(0) 
    delta = 0x9e3779b9 
    n = 32 
    w = [0,0] 

    while(n>0): 
     sum.value += delta 
     y.value += (z.value << 4) + k[0]^z.value + sum.value^(z.value >> 5) + k[1] 
     z.value += (y.value << 4) + k[2]^y.value + sum.value^(y.value >> 5) + k[3] 
     n -= 1 

    w[0] = y.value 
    w[1] = z.value 
    return w 

def decipher(v, k): 
    y = c_uint32(v[0]) 
    z = c_uint32(v[1]) 
    sum = c_uint32(0xc6ef3720) 
    delta = 0x9e3779b9 
    n = 32 
    w = [0,0] 

    while(n>0): 
     z.value -= (y.value << 4) + k[2]^y.value + sum.value^(y.value >> 5) + k[3] 
     y.value -= (z.value << 4) + k[0]^z.value + sum.value^(z.value >> 5) + k[1] 
     sum.value -= delta 
     n -= 1 

    w[0] = y.value 
    w[1] = z.value 
    return w 

if __name__ == "__main__": 
    key = [1,2,3,4] 
    v = [1385482522,639876499] 
    enc = encipher(v,key) 
    print enc 
    print decipher(enc,key) 

和一個小樣本:

>>> v 
[1385482522, 639876499] 
>>> tea.decipher(tea.encipher(v,key),key) 
[1385482522L, 639876499L] 
1

由於TEA是分組密碼和你的v是一個非常小的塊,我猜有可能是塊填充的差異,或者維基百科指出: http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm

注意,參考實現 被綁定到特定的微處理器 體系結構意思是字節順序 考慮因素在時很重要cyphertext在不同系統上共享和處理。原紙 不指定任何細節約 微處理器架構等 人實現使用TEA 系統將需要使這些 規範自己。

我沒有檢查任何一個實現的細節。您的&=聲明也感到可疑。

0

茶壞了,不要使用它。

XXTEA是安全的沒有定義endianess和東西,你應該重新發明whell當你可以使用AES。

使用不安全的密碼術毫無意義。

我strongy建議您應用AES,它可以在8位microcontolers實施白衣只是碼數KB

編輯

你籤這個代碼? http://sysadminco.com/code/python-tea/

+0

我無法更改此應用程序中的加密算法。服務器端實現使用TEA。 – grzaks 2010-04-06 22:04:15

+0

是的,我甚至在第一篇文章中引用了相同的代碼。 – grzaks 2010-04-07 07:58:51

+0

*「使用不安全的加密技術沒有意義。」* Gur fgeratgu bs gur rapelcgvba arrqrq qrcraqf ba jub lbhner gelvat gb uvqr vg sebz。 – Seth 2010-04-19 21:50:16