2012-06-29 2 views
0

Bouncy castle уже обеспечивает шифрование XTEA с использованием класса XTEAEngine. Атрибуты класса выглядеть следующим образом:Реализация XTEA для BC не работает, почему?

private static final int rounds  = 32, 
         block_size = 8, 
         key_size = 16, 
         delta  = 0x9E3779B9, 
         d_sum  = 0xC6EF3720; // sum on decrypt 

Но с закрытым исходным кодом C++ приложение использует следующие параметры (32 раундов):

uint32 delta = 0x61C88647; uint32 sum = 0xC6EF3720;

Так, чтобы изменить его, я скопировал весь код BC XTEAEngine, назвал его XTEAEngine2 при измененной дельта. Но теперь шифрование не работает, как ожидалось:

arr given : [11, 0, 10, 8, 0, 72, 105, 32, 116, 104, 101, 114, 101, 0, 0, 0] 
arr encrypted: [-128, -26, -32, 17, 7, 98, 80, -112, 26, -83, -11, 47, -124, -50, -80, 59] 
arr decrypted: [-106, 62, 110, -40, -56, -58, 18, -101, -38, -73, -83, 95, 18, -99, -84, -37] 

Перед моим изменить все было хорошо:

arr given : [11, 0, 10, 8, 0, 72, 105, 32, 116, 104, 101, 114, 101, 0, 0, 0] 
arr encrypted: [89, -95, -88, 120, -117, 39, 57, -126, 23, -74, 35, 105, -23, -7, -109, -27] 
arr decrypted: [11, 0, 10, 8, 0, 72, 105, 32, 116, 104, 101, 114, 101, 0, 0, 0] 

И я использую BouncyCastle XTEA так:

BlockCipher engine = new XTEAEngine[2](); 
BufferedBlockCipher cipher = new BufferedBlockCipher(engine); 
KeyParameter kp = new KeyParameter(keyArr); 
private byte[] callCipher(byte[] data) 
    throws CryptoException { 
     int size = 
       cipher.getOutputSize(data.length); 
     byte[] result = new byte[ size ]; 
     int olen = cipher.processBytes(data, 0, 
       data.length, result, 0); 
     olen += cipher.doFinal(result, olen); 

     if(olen < size){ 
      byte[] tmp = new byte[ olen ]; 
      System.arraycopy(
        result, 0, tmp, 0, olen); 
      result = tmp; 
     } 

     return result; 
    } 


public synchronized byte[] encrypt(byte[] data) 
    throws CryptoException { 
     if(data == null || data.length == 0){ 
      return new byte[0]; 
     } 

     cipher.init(true, kp); 
     return callCipher(data); 
    } 

    public synchronized byte[] decrypt(byte[] data) 
    throws CryptoException { 
     if(data == null || data.length == 0){ 
      return new byte[0]; 
     } 

     cipher.init(false, kp); 
     return callCipher(data); 
    } 

ли кто-нибудь может указать мою ошибку? Потому что я считаю, что я где-то сделал. Я даже реализовал XTEA полностью самостоятельно, используя спецификацию алгоритма из Википедии, но то же самое произошло.

+1

Вы уверены, что это не закрытое приложение-источник, который виноват? –

+0

Я на 100% уверен. Уже есть приложение с открытым исходным кодом, которое использует обратный инженерный протокол этого закрытого исходного приложения, а закрытый клиент-клиент работает с открытым исходным кодом. –

ответ

3

0x9E3779B9 является дополнением дна от 0x61C88647; это подсказывает мне, что есть дополнение к вычитанию где-то.

+0

О, как всегда, U2. это все объясняет! Я уже упоминал в своем предыдущем вопросе, что я пропустил все свои занятия в отношении двух дополнений: < –