Расшифровка файлов epub AES для анализа в EpubReader - PullRequest
0 голосов
/ 27 апреля 2018

Как я могу расшифровать файлы 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");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...