旧手机中的J2ME TEA加密问题

时间:2011-09-14 19:31:25

标签: encryption mobile java-me base64

嘿伙计们,当我们在较旧的手机中加密邮件时,我遇到了一个很大的问题。

我已编译代码以在较旧的硬件(CLDC1.0,MIDP2.0)上运行,出于某种原因,当我在诺基亚N70中进行TEA加密时,我最终会遇到一个破坏的字符当它从纯文本转到TEA时。 (是的,我知道,从很多角色中只有一个小小的字符被毁了......)

当我在N8和其他更近期的手机上运行完全相同的应用程序时,我会正确加密。

在我发布代码之前,这里有一个关于它的作用的小解释: 基本上它接收一个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==

你可以看到一切看起来很相似,但在代码中间,在N70上被编码为Gh的内容在N8上显示为gB ...

在解密由N70加密的数据时,我们得到一些非常奇怪的字符:

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

两者都使用相同的密钥(在现实生活中,他们将使用在启动时随机生成的密钥)

这是使用的密钥: 0b1b5e0167aaee06

希望你能帮助我解决这个问题并感谢你的关心和帮助!

1 个答案:

答案 0 :(得分:1)

您的代码很难理解,但Baseless = new String(outBytes, "ISO-8859-1");和任何类似的构造几乎肯定是不正确的。你为什么要用密码制作一个字符串?只需base64直接编码outBytes。