Расшифровка XML-файла на SD-карте Android
Я пытаюсь зашифровать / расшифровать xml-файлы моего приложения, хранящиеся на SD-карте, используя этот код. Хотя шифрование работает нормально, это часть расшифровки, где я застрял.
Код шифрования:
private void writeToFile(final String xmlString, final String exportFileName) throws IOException {
File dir = new File(Environment.getExternalStorageDirectory(), BData.DATASUBDIRECTORY);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, exportFileName);
file.createNewFile();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
try {
String fileData = AdvancedCrypto.encrypt("myPassword", "mySalt"), xmlString.toString());
bos.write(fileData.getBytes());
} catch (Exception e){
} finally {
if (bos != null) {
bos.flush();
bos.close();
}
}
}
Код расшифровки:
public void getDataFromXML(Context context, String fileName){
try
{
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser _xml = factory.newPullParser();
// get a reference to the file.
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + fileName);
// create an input stream to be read by the stream reader.
FileInputStream fis = new FileInputStream(file);
BufferedInputStream buf = new BufferedInputStream(fis);
int size = (int) file.length();
byte[] contents = new byte[size];
//byte[] data = buf.read(contents);
String fileData = AdvancedCrypto.decrypt("myPassword", "mySalt"), contents.toString());
buf.read(fileData.getBytes());
// set the input for the parser using an InputStreamReader
_xml.setInput(buf, HTTP.UTF_8);
buf.close();
int eventType = _xml.getEventType();
boolean done = false;
//..rest of the code
}
}
Это выдает эту ошибку:
07-07 21:44:27.755: W/System.err(5608): Caused by: java.lang.StringIndexOutOfBoundsException: length=11; regionStart=0; regionLength=32
07-07 21:44:27.755: W/System.err(5608): at java.lang.String.startEndAndLength(String.java:593)
07-07 21:44:27.755: W/System.err(5608): at java.lang.String.substring(String.java:1474)
в этой строке в методе расшифровки:
String ivHex = encrypted.substring(0, IV_LENGTH * 2);
Я правильно читаю файл, чтобы расшифровать его?
1 ответ
Массивы не переопределяют метод toString() в Java. Вызов toString() для байтового массива, вероятно, не даст того, что вам нужно.
AdvancedCrypto.decrypt()
Метод ожидает зашифрованный текст в виде строки. Соответствующий encrypt
Метод, кажется, шестнадцатеричный кодирует выходные байты Простейшим исправлением вашего кода будет изменение contents.toString()
в new String(contents)
, (Обратите внимание, что полагаться на кодировку по умолчанию для платформы - это плохая практика - вы должны явно указывать UTF-8 при переводе между строками и байтами в любом направлении.)
Однако самое простое исправление не всегда самое лучшее. Копирование и вставка случайного криптографического кода из Интернета особенно сомнительно. Нет абсолютно никакой причины для шестнадцатеричного кодирования зашифрованного текста, если вы храните его в файле, но этот класс AdvancedCrypto делает это в любом случае. Использование класса таким способом также включает в себя большое количество ненужного копирования байтов, что быстро приведет к снижению производительности, если ваши данные превысят несколько сотен килобайт.
Также помните, что данные защищены так же надежно, как и ключ. Если вы жестко закодировали ключ в своем приложении, то любой, кто имеет доступ к приложению, может расшифровать данные.