2010-04-06 4 views
1

누구나 TEA (Tiny Encryption Algorithm)의 올바른 Python 구현을 알고 있습니까? 나는 여기에서 찾은 하나를 시도했다 : http://sysadminco.com/code/python-tea/ -하지만 제대로 작동하지 않는 것 같습니다.Python TEA 구현

그것은 C 또는 Java에서 다른 구현과는 다른 결과를 반환합니다. 파이썬에서 완전히 다른 데이터 유형 (또는 실제로는 데이터 유형이 없음)으로 인해 발생했다고 생각합니다.

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 

파이썬 예 :

>>> 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의 구현이 정확하다는 것을 확신한다 - wikipedia가 참조하는 사이트에서 나온다. (아직 평판 포인트가 충분하지 않기 때문에 링크를 게시 할 수 없다. - 스팸 방지 스킬)

+0

유일한 해결책 내 마음에 와서하는 ctypes에게 파이썬 라이브러리를 사용하는 것입니다. 하지만 그게 효과가 있을지 모르겠습니다. – grzaks

+0

이것은 TEA가 아닌 XTEA의 구현과 비슷합니다. – abc

답변

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

TEAhttp://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm : 참조 구현 이 특정 마이크로 프로세서 바인딩되는

참고 블록 암호와 v가 매우 작은 블록, 난 위키 백과 노트 거기 블록 패딩의 차이, 또는 수 있습니다 추측에는 요 아키텍처는 바이트 순서가 일 때 중요하다는 것을 의미합니다. 서로 다른 시스템에서 사이퍼 텍스트가 공유되고 처리됩니다. 원본 문서는 마이크로 프로세서 아키텍처에 대한 세부 정보를 지정하지 않으므로 TEA 을 사용하는 시스템을 구현하는 모든 사용자는 사양을 만들어야합니다.

나는 상세하게 구현 중 하나를 검사하지 않았다. &= 진술도 의심 스럽습니다.

0

차 고장, 사용하지 마십시오. 안전

XXTEA은 엔디안 및 재료를 정의하지 않습니다 당신은 AES를 사용할 수있을 때 당신은 뻑를 재발견해야한다.

는 안전하지 않은 암호를 사용하여 아무 문제가 없습니다.

내가 조언을 strongy 당신은 AES를 적용, 그것은 8 비트 microcontolers 코드의 단지 몇 킬로바이트 엉 구현 될 수

는이 코드를 확인 했 EDIT? http://sysadminco.com/code/python-tea/

+0

이 응용 프로그램에서 암호 알고리즘을 변경할 수 없습니다. 서버 측 구현은 TEA를 사용합니다. – grzaks

+0

그래, 심지어 내 첫 번째 게시물에서 동일한 코드를 참조했습니다. – grzaks

+0

* "안전하지 않은 암호를 사용하여 아무 소용이 없습니다."* 구르 fgeratgu 학사 GUR rapelcgvba arrqrq qrcraqf 바 JUB LBH NER gelvat 기가 바이트 uvqr VG sebz. – Seth