Реализация Python TEA

1

Кто-нибудь знает правильную реализацию Python для TEA (Tiny Encryption Algorithm)? Я попробовал тот, который я нашел здесь: http://sysadminco.com/code/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 верна - она ​​исходит от сайта, на который ссылается wikipedia (я не мог опубликовать ссылку на него, потому что у меня пока нет достаточных точек репутации - какая-то антиспамная вещь)

  • 0
    Единственное решение, которое пришло мне в голову - это использовать библиотеку Python ctypes. Но я не уверен, что это сработает.
  • 1
    Это больше похоже на реализацию XTEA, чем на TEA.
Показать ещё 1 комментарий
Теги:
encryption

3 ответа

10
Лучший ответ

Я исправил его. Здесь выполняется реализация TEA в 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)

И небольшой образец:

>>> 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.

Нет смысла использовать незащищенную криптографию.

Я настоятельно рекомендую вам применить AES, он может быть реализован в 8-битных микроконтентерах, но всего несколько килобайт кода

ИЗМЕНИТЬ

Вы проверили этот код? http://sysadminco.com/code/python-tea/

  • 0
    Я не могу изменить алгоритм криптографии в этом приложении. Реализация на стороне сервера использует TEA.
  • 0
    Да, я даже ссылался на тот же код в моем первом посте.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню