Как я могу расшифровать файлы AES с помощью Android, используя приведенный ниже пример?
Моя цель - сохранить набор зашифрованных электронных книг AES в формате epub в папке активов приложения Android, расшифровывать их при необходимости и отображать в веб-обозревателе с помощью классов nl.siegmann.epublib.
Я зашифровал файл epub с помощью AES Crypt (https://www.aescrypt.com), используя тот же 16-символьный код, что и в исходном коде Java. После того, как он скомпилирован, требуется некоторое время, но файл ресурсов, похоже, расшифровывается, сохраняется в локальном временном файле. , а затем анализируется с помощью epublib. Однако ничего не отображается. Я также заметил, что длина файла отличается, но я не уверен, правильно ли я читаю.
Я новичок в разработке под Android и использую Android Studio 3.1.2
Между прочим, причина шифрования заключается в том, что файлы должны храниться локально, а издатели хотят (и пытаются) заблокировать копирование своих книг epub. Ключ шифрования будет лучше скрыт при работе. Заранее спасибо.
package com.example.ebook;
import android.content.res.AssetManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.spec.SecretKeySpec;
import nl.siegmann.epublib.domain.Book;
import nl.siegmann.epublib.epub.EpubReader;
public class MainActivity extends AppCompatActivity {
private final String KEY = "1234567890123456";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
decryptFile();
}
public void decryptFile(){
WebView webView = findViewById(R.id.webView);
try {
String filename = "AccordingToLuke_9781874584292.epub.aes";
String filePath = "ebooks/";
// Get encrypted file from /assets
AssetManager assetManager = getAssets();
InputStream inputStream = assetManager.open(filePath + filename);
Integer fileLength = inputStream.toString().length();
// Create temp file to hold decrypted byte array
File tmp = File.createTempFile("tmp", "decrypted", getCacheDir());
tmp.deleteOnExit();
FileOutputStream fos = new FileOutputStream(tmp);
SecretKeySpec sks = new SecretKeySpec(KEY.getBytes(),"AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, sks);
CipherInputStream cis = new CipherInputStream(inputStream, cipher);
int b;
byte[] d = new byte[8];
while ((b = cis.read(d)) != -1) {
fos.write(d, 0, b);
}
fos.flush();
fos.close();
cis.close();
// Load book from tmp stream
FileInputStream fileInputStream = new FileInputStream(tmp);
Book book = (new EpubReader()).readEpub(fileInputStream);
Integer fileDecryptedLength = fileInputStream.toString().length();
// Display decrypted epub file
String contents = "";
String authors = book.getMetadata().getAuthors().toString();
contents = authors;
webView.loadData(contents,"text/html","utf-8");
} catch (Exception e) {
e.printStackTrace();
webView.loadData("Problem loading ebook","text/html","utf-8");
}
}
}