Проблема шифрования J2ME TEA в старых телефонах - PullRequest
0 голосов
/ 14 сентября 2011

Эй, ребята, у меня огромная проблема при шифровании сообщения в старом телефоне по сравнению с более новым.

Я скомпилировал код для запуска на более старом оборудовании (CLDC1.0, MIDP2.0) и по какой-то причине, когда я выполняю шифрование TEA в Nokia N70, в результате получается один разрушенный характер, когда он переходит от простого текста к чаю. (да, я знаю, из многих символов только один маленький символ разрушается ...)

Когда я запускаю одно и то же приложение на N8 и других более поздних телефонах, я шифрую его правильно.

прежде, чем я отправлю код, вот небольшое объяснение того, что он делает: в основном он получает String и логические входы, логические состояния, если это для целей шифрования или дешифрования, в то время как строка - это то, что я хочу кодировать или декодировать.

оттуда я в основном разбрасываю String в байтовый массив, обрабатываю его соответствующим образом (для шифрования или дешифрования), а затем превращаю в String, которую затем возвращаю (расшифровываю) или кодирую в Base64 (шифровать).

Причиной инкапсуляции в Base64 является то, что она может быть отправлена ​​с помощью смс, поскольку в этой кодировке используются не специальные символы, она поддерживает ограничение по смс до 160 символов, что желательно для приложения.

теперь для кода:

private String HandleTEA(String input, boolean aIsEncryption) throws UnsupportedEncodingException
 {
     System.out.println(input);
     String returnable = "";
     try
     {
         TEAEngine e = new TEAEngine(); 
         if (aIsEncryption)
         {
             e.init(true, TEAkey); 
         }
         else
         {
             if(getDebug())
             {
                input = input.substring(1);

             }
             input = base64.decodeString(input);
             e.init(false, TEAkey);

         }
         byte[] aData = input.getBytes("ISO-8859-1");

         byte[] textToUse = aData;

         int len = ((textToUse.length + 16 - 1) / 16) * 16;

         byte[] secondUse = new byte[len];


         for(int i = 0; i < textToUse.length; i++)
         {
            secondUse[i] = textToUse[i];
         }

         for(int i = textToUse.length; i < secondUse.length; i++)
         {
            secondUse[i] = 0;
         }

         int blockSize = e.getBlockSize();

         byte[] outBytes = new byte[secondUse.length];

         for (int chunkPosition = 0; chunkPosition < secondUse.length; chunkPosition += blockSize)
         {
             int chunkSize = Math.min(blockSize, (textToUse.length - (chunkPosition * blockSize)));
             e.processBlock(secondUse, chunkPosition, outBytes, chunkPosition);
         }

         if(aIsEncryption)
         {
             Baseless = new String(outBytes, "ISO-8859-1");
             String encodedString = base64.encodeString(Baseless);
             char[] theChars = new char[encodedString.length()+1];

             for(int i = 0; i < theChars.length; i++)
             {
                 if(i == 0)
                 {
                     theChars[i] = '1';
                 }
                 else
                 {
                     theChars[i] = encodedString.charAt(i-1);
                 }
             }

             byte[] treating = new byte[theChars.length];

                for(int i = 0; i < theChars.length; i++)
                {
                    treating[i] = (byte)theChars[i];
                }
             returnable = new String(treating, "ISO-8859-1");
         }
         else
         {
             char[] theChars = new String(outBytes, "ISO-8859-1").toCharArray();
            String fixed ="";
            for(int i = 0; i < theChars.length; i++)
            {
                char c = theChars[i];
                if (c > 0) fixed = fixed + c;
            }
             returnable = fixed;
         }
     }
     catch(Exception e)
     {
         e.printStackTrace();
     }
     return returnable;
 }

Кто-нибудь имеет представление о том, что может происходить?

для сравнения вот что я получаю от N70: e+TgV/fU5RUOYocMRfG7vqpQT+jKlujU6eIzZfEjGhXdFwNB46wYNSiUj5H/tWbta26No6wjQylgTexhS6uqyw==

и из N8: e+TgV/fU5RUOYocMRfG7vqpQT+jKlujU6eIzZfEjgBXdFwNB46wYNSiUj5H/tWbta26No6wjQylgTexhS6uqyw==

как вы можете видеть, все выглядит аналогично, но в середине кода то, что кодируется как Gh на N70, отображается как gB на N8 ...

при расшифровке данных, зашифрованных N70, мы получаем несколько странных символов:

will add this here tomorrow since I don't have the saved output with me

оба используют один и тот же ключ (в реальной жизни они будут использовать ключ, который генерируется случайным образом при запуске)

вот ключ, используемый: 0b1b5e0167aaee06

Надеюсь, вы поможете мне с этим, и спасибо за ваш интерес и помощь!

1 Ответ

1 голос
/ 15 сентября 2011

ваш код сложен для понимания, но Baseless = new String(outBytes, "ISO-8859-1"); и любые подобные конструкции почти наверняка неверны.Почему вы хотите сделать строку из шифра?Просто base64 кодирует outBytes напрямую.

...