嘿伙计们,当我们在较旧的手机中加密邮件时,我遇到了一个很大的问题。
我已编译代码以在较旧的硬件(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
希望你能帮助我解决这个问题并感谢你的关心和帮助!
答案 0 :(得分:1)
您的代码很难理解,但Baseless = new String(outBytes, "ISO-8859-1");
和任何类似的构造几乎肯定是不正确的。你为什么要用密码制作一个字符串?只需base64直接编码outBytes。