【问题标题】:J2ME TEA Encryption problem in older phones旧手机中的 J2ME TEA 加密问题
【发布时间】:2011-09-14 19:31:24
【问题描述】:

大家好,与新手机相比,在旧手机中加密消息时,我遇到了一个大问题。

我已经编译了代码以在较旧的硬件(CLDC1.0、MIDP2.0)上运行,并且由于某种原因,当我在诺基亚 N70 中执行TEA 加密时,我最终得到了一个损坏的字符从纯文本到 TEA。 (是的,我知道,从很多字符中只有一个小字符被破坏了......)

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

在我发布代码之前,这里有一个关于它的作用的小解释: 基本上它接收一个字符串和一个布尔输入,布尔状态是用于加密还是解密,而字符串是我想要编码或解码的。

从那里,我基本上将字符串剥离为字节数组,对其进行相应处理(如果用于加密或解密),然后将其转换为字符串,然后我将其返回(解密)或在 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

希望您能帮我解决这个问题,感谢您的关注和帮助!

【问题讨论】:

    标签: encryption mobile java-me base64


    【解决方案1】:

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

    【讨论】:

    • 是的,ISO-8859-1 不能从每个字节中解码一个字符。因此,当您使用随机字节(密文)创建String 时,某些字符将被错误地替换为 � 或 ?,从而导致数据丢失。
    • Baseless 的使用基本上是用于控制台调试...(我使用的是 J2ME IDE,它似乎没有任何像样的调试功能)使用 ISO-8859-1 是由于手机和网关之间的奇偶校验......我以前没有遇到过这种特殊编码的任何问题,但是在某些情况下,我最终会遇到最终结果的问题...... PS:如果我将编码切换为 UTF,也会发生同样的事情-8/UTF-16 顺便说一句。
    • 实际上,当使用 UTF-8 和 16 时,我得到的绝对是乱码
    • 无论您指定什么字符集,您都不能使用 String 来保存任意随机字节。
    • 嗯,这个想法是用密码发送短信。但是,如果直接使用 byte 或 char 数组进行处理,仍然会给出不正确的加密,因此,这不是使用 String 的问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多