このコードを使用して、sd カードに保存されているアプリの xml ファイルを暗号化/復号化しようとしています。暗号化は正常に機能しますが、私が立ち往生しているのは復号化の部分です。
暗号化コード:
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);
ファイルを正しく読み取って復号化していますか?