Эй, ребята, у меня огромная проблема при шифровании сообщения в старом телефоне по сравнению с более новым.
Я скомпилировал код для запуска на более старом оборудовании (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
Надеюсь, вы поможете мне с этим, и спасибо за ваш интерес и помощь!