Передача зашифрованного файла не может быть воссоздана на Android - PullRequest
1 голос
/ 28 апреля 2019

Я шифрую файл на стороне клиента Node.js и сохраняю его на сервере в виде файла, когда я пытаюсь расшифровать файл в неправильном формате.

Encryptor.encryptFile = function (inputPath, outputPath, key, options, callback) {
    if (typeof options === 'function') {
        callback = options;
        options = {};
    }
    options = Encryptor.combineOptions(options);

    var keyBuf = new Buffer(key);
    console.log(key)
    var inputStream = fs.createReadStream(inputPath);
    var outputStream = fs.createWriteStream(outputPath);
    var cipher = crypto.createCipher(options.algorithm, keyBuf);

    inputStream.on('data', function (data) {
        console.log(data.length)
        var buf = new Buffer(cipher.update(data));
        outputStream.write(buf);
    });

    inputStream.on('end', function () {
        try {
            var buf = new Buffer(cipher.final('binary'), 'binary');
            outputStream.write(buf);
            outputStream.end();
            outputStream.on('close', function () {
                return callback();
            });
        } catch (e) {
            fs.unlink(outputPath);
            return callback(e);
        }
    });
};

Выше приведен код шифрованияи на стороне Android я использую следующий код.Загрузка файла:

Ion.with(this).load(documentModel.filePath)
                .progress { downloaded, total -> println("$downloaded / $total") }
                .write(file)
                .setCallback { e, result ->
                    if (result != null) {
                        // val keys = MedpayDatabaseHelper.getInstance(this@ViewMedicalRecordActivity)?.keyDao()?.getKeys()
                        val handler = EncryptionHandler()
                        val decrepted = handler.decryptFile(handler.getSymmetricKey(), result)
                        val outfile = File(dir, "output.pdf")
                        pdfView.fromBytes(decrepted).load()
                    } else {
                        Toast.makeText(this@ViewMedicalRecordActivity, "Failed to load file", Toast.LENGTH_LONG).show()
                    }
                }

Ниже приведен код расшифровки.

fun decryptFile(symmetricKey: String, file: File): ByteArray {
        encryptionAlgorithm = "AES"
        encryptionMode = "/ECB"
        paddingMode = "/NoPadding"
        return decrypt(symmetricKey, file)
    }
private fun decrypt(decryptionKey: String, file: File): ByteArray {
        val inputStream = BufferedReader(InputStreamReader(FileInputStream(file), Charsets.UTF_16BE))
        var x: String? = ""
        var builder = StringBuilder()
        while (x != null) {
            x = inputStream.readLine()
            if (x != null)
                builder.append(x).append('\n')
        }
        val text = builder.toString()
        val read = text.toByteArray().decrypt(decryptionKey)
        val path = Environment.getExternalStorageDirectory().absolutePath + "/folder"
        val dir = File(path)
        if (!dir.exists())
            dir.mkdirs()
        val outfile = File(dir, "output.pdf")
        val dos = OutputStreamWriter(FileOutputStream(outfile))
        dos.write(read.toString(Charsets.UTF_16LE))
        dos.flush()
        dos.close()
        return read
    }
//extension function for decrypting the byte array
private fun ByteArray.decrypt(decryptionKey: String): ByteArray {
        val secretKeySpec = SecretKeySpec(decryptionKey.toByteArray(), encryptionAlgorithm)
        val cipher = Cipher.getInstance(encryptionAlgorithm + encryptionMode + paddingMode)
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec)
        return cipher.doFinal(this)
    }

Поскольку я новичок в криптографии, я не совсем уверен, где я ошибаюсь, но я думаю, что это что-тоделать с форматами файлов и кодировки.Файлы расшифровываются без каких-либо ошибок, но при попытке открыть файл в коде или из проводника файлов выдается следующее исключение.

E/PDFView: load pdf error
    java.io.IOException: cannot create document: File not in PDF format or corrupted.
        at com.shockwave.pdfium.PdfiumCore.nativeOpenMemDocument(Native Method)
...