【发布时间】: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