누구나 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가 참조하는 사이트에서 나온다. (아직 평판 포인트가 충분하지 않기 때문에 링크를 게시 할 수 없다. - 스팸 방지 스킬)
유일한 해결책 내 마음에 와서하는 ctypes에게 파이썬 라이브러리를 사용하는 것입니다. 하지만 그게 효과가 있을지 모르겠습니다. – grzaks
이것은 TEA가 아닌 XTEA의 구현과 비슷합니다. – abc