2010-04-06 6 views
1

Quelqu'un connaît l'implémentation correcte de Python de TEA (Tiny Encryption Algorithm)? J'ai essayé celui que j'ai trouvé ici: http://sysadminco.com/code/python-tea/ - mais il ne semble pas fonctionner correctement.Implémentation Python TEA

Il renvoie des résultats différents des autres implémentations en C ou en Java. Je suppose que c'est causé par des types de données complètement différents dans python (ou pas de types de données en fait).

Voici le code et un exemple:

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 

exemple 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 exemple:

#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** 

S'il vous plaît noter que les deux exemples ont été réalisés avec la même entrée données (v et clé), mais les résultats étaient différents. Je suis sûr que la mise en œuvre de C est correcte - elle vient d'un site référencé par wikipedia (je ne pouvais pas poster de lien car je n'ai pas assez de points de réputation - quelque chose d'antispam)

+0

La seule solution qui me vint à l'esprit est d'utiliser ctypes bibliothèque Python. Mais je ne suis pas sûr que cela fonctionnerait. – grzaks

+0

Cela ressemble plus à une implémentation de XTEA qu'à TEA. – abc

Répondre

10

Je l'ai corrigé.Ici travaille la mise en œuvre de TEA en python:

#!/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) 

Et un petit échantillon:

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

Comme TEA est un chiffrement par bloc et votre v est un bloc très petit, je suppose qu'il peut y avoir bloc différences de remplissage, ou note Wikipédia: http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm:

Notez que la mise en œuvre de référence est lié à un microprocesseur spécifique architecture signifiant que l'ordre des octets considérations sont importants lorsque cyphertext est partagé et traité sur différents systèmes. Le document original ne spécifie pas de détails sur l'architecture de microprocesseur et donc toute personne mettant en œuvre un système utilisant TEA aurait besoin de faire ces spécifications pour eux-mêmes.

Je n'ai inspecté aucune des implémentations en détail. Vos déclarations &= sont également suspectes.

0

Le thé est cassé, ne l'utilisez pas. XXTEA qui est sûr ne définit pas l'endianess et d'autres choses et vous devriez réinventer quand vous pouvez utiliser AES.

Il ne sert à rien d'utiliser la cryptographie non sécurisée.

Je strongy conseils que vous d'appliquer AES, il peut être mis en œuvre dans microcontolers 8bit Whit juste quelques ko code

EDIT

Avez-vous vérifié ce code? http://sysadminco.com/code/python-tea/

+0

Je ne peux pas changer l'algorithme de cryptographie dans cette application. L'implémentation côté serveur utilise TEA. – grzaks

+0

Oui, j'ai même référencé le même code dans mon premier post. – grzaks

+0

* "Il ne sert à rien d'utiliser la cryptographie non sécurisée." * Gur fgeratgu bs gur rapelcgvba arrqrq qrcraqf ba jub lbh ner gelvat gb uvqr vg sebz. – Seth