Как успешно зашифровать и расшифровать модель тензорного потока в Android - PullRequest
0 голосов
/ 28 сентября 2019

Поскольку файлы в ресурсах Android могут быть легко взломаны путем преобразования .apk в .zip.У меня есть некоторая умиротворяющая модель, которую я должен использовать в приложении для AndroidЯ работаю над тем, как зашифровать активы приложения.(Я буду использовать Firebase для получения ключа для расшифровки, чтобы сделать его более безопасным). Я довольно успешно шифрую и дешифрую изображения (png и jpg), используя библиотеку шифров в Android.

Ниже приведен код, который я использовал для этой цели.

    String fake = "sadhkja6";
    byte[] encodedKey     = Base64.decode(fake, Base64.DEFAULT);
    yourKey= new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), id);
    bitmap = Bitmap.createScaledBitmap(bitmap, 500,500, true);

   byte[] output = getBytes(bitmap);

   byte[] output = getBytesFile();
   saveFile(output);


public static byte[] encodeFile(SecretKey yourKey, byte[] fileData)
        throws Exception {
    byte[] encrypted = null;
    byte[] data = yourKey.getEncoded();
    SecretKeySpec skeySpec = new SecretKeySpec(data, 0, data.length,
            algorithm);
    Cipher cipher = Cipher.getInstance(algorithm);
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(
            new byte[cipher.getBlockSize()]));
    encrypted = cipher.doFinal(fileData);
    return encrypted;
}


public byte[] getBytes(Bitmap bitmap){

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(    Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    bitmap.recycle();

    return byteArray;
}

public static byte[] encodeFile(SecretKey yourKey, byte[] fileData)
        throws Exception {
    byte[] encrypted = null;
    byte[] data = yourKey.getEncoded();
    SecretKeySpec skeySpec = new SecretKeySpec(data, 0, data.length,
            algorithm);
    Cipher cipher = Cipher.getInstance(algorithm);
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(
            new byte[cipher.getBlockSize()]));
    encrypted = cipher.doFinal(fileData);
    return encrypted;
}

void saveFile(byte[] array) {
    String decrypted_file = "encypted.png";

    try {
        File file = new File(Environment.getExternalStorageDirectory()
                + File.separator, decrypted_file);
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(file));
        yourKey = generateKey();
        byte[] filesBytes = encodeFile(yourKey, array);
        bos.write(filesBytes);
        bos.flush();
        bos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Но когда я использую тот же код для кодирования моделей тензорного потока, модель не удачно декомпилируется, что приводит к сбою приложения.Скорее всего, потому что мы загружаем модель в байтах, что может вызвать проблемы.

Скажите, пожалуйста, как я могу использовать технику шифрования для защиты своей модели с тензорным потоком.Большое спасибо.

...