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

Также помните, что данные защищены так же надежно, как и ключ. Если вы жестко закодировали ключ в своем приложении, то любой, кто имеет доступ к приложению, может расшифровать данные.

Другие вопросы по тегам