首页 > 解决方案 > 解密视频文件并保存到内部存储

问题描述

我有一个带有密钥的加密视频,我想用密钥解密该视频文件,但我无法解密该视频文件。我尝试了 2 3 种方法,但这些方法都不适合我。

加密类

public class Crypto {

    static void fileProcessor(int cipherMode,String key,File inputFile,File outputFile){
        try {

            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            SecureRandom secureRandom = new SecureRandom();
            secureRandom.setSeed(key.getBytes("UTF-8"));
            keyGenerator.init(128, secureRandom);
            SecretKey secretKey = keyGenerator.generateKey();
//            Key secretKey = new SecretKeySpec(key.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(cipherMode, secretKey);

            FileInputStream inputStream = null;
            byte[] inputBytes = new byte[0];
            try {
                inputStream = new FileInputStream(inputFile);
                inputBytes = new byte[(int) inputFile.length()];
                inputStream.read(inputBytes);
            } catch (IOException e) {
                e.printStackTrace();
            }

            byte[] outputBytes = cipher.doFinal(inputBytes);

            FileOutputStream outputStream = new FileOutputStream(outputFile);
            outputStream.write(outputBytes);

            inputStream.close();
            outputStream.close();

        } catch (NoSuchPaddingException | NoSuchAlgorithmException
                | InvalidKeyException | BadPaddingException
                | IllegalBlockSizeException | IOException e) {
            e.printStackTrace();
        }
    }

    public static String Decrypt(String filePath) {
        String key = "my_encrypted_key";
//        File inputFile = new File("text.txt");
        File encryptedFile = new File(filePath);
        String decryptedFilePath="";
        //check special guid folder if not exist create

        //get the selected video file path  with settings path  if exist decrypt if not exist show message
       File decryptedFile = new File(decryptedFilePath);

        try {
            //Crypto.fileProcessor(Cipher.ENCRYPT_MODE,key,inputFile,encryptedFile);
            Crypto.fileProcessor(Cipher.DECRYPT_MODE,key,encryptedFile,decryptedFile);
            Log.d("success", "Decrypt: success");
            return decryptedFile.getAbsolutePath();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
        return "";
    }

}

但这对我不起作用,我尝试另一个。

public static void TEST2(String orgFile) {
        try {
            String password = "estudies741852963@123";
            File outFile_dec = new File(Environment.getExternalStorageDirectory()+"/testVideo/abc.mp4");
            if(!outFile_dec.isDirectory()) {
                outFile_dec.mkdir();
            }
            if(!outFile_dec.exists()){
                outFile_dec.createNewFile();
            }

            // reading the salt
            // user should have secure mechanism to transfer the
            // salt, iv and password to the recipient
            FileInputStream saltFis = new FileInputStream(orgFile);
            byte[] salt = new byte[8];
            saltFis.read(salt);
            saltFis.close();

            // reading the iv
            FileInputStream ivFis = new FileInputStream(orgFile);
            byte[] iv = new byte[16];
            ivFis.read(iv);
            ivFis.close();

            SecretKeyFactory factory = SecretKeyFactory
                    .getInstance("PBKDF2WithHmacSHA1");
            KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, 1000,
                    256);
            SecretKey tmp = factory.generateSecret(keySpec);
            SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

            // file decryption
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
            InputStream fis = new FileInputStream(orgFile);
            OutputStream fos = new FileOutputStream(outFile_dec);
//        byte[] in = new byte[1024];
//        int read;
//        while ((read = fis.read(in)) != -1) {
//            byte[] output = cipher.update(in, 0, read);
//            if (output != null)
//                fos.write(output);
//        }
//
//        byte[] output = cipher.doFinal();
//        if (output != null)
//            fos.write(output);
//        fis.close();
//        fos.flush();
//        fos.close();
//        System.out.println("File Decrypted.");
            fos = new CipherOutputStream(fos, cipher);
            int count = 0;
            byte[] buffer = new byte[1024];
            while ((count = fis.read(buffer)) >= 0) {
                fos.write(buffer, 0, count);
            }
            fis.close();
            fos.flush();
            fos.close();
        } catch (Exception e) {

            e.printStackTrace();
        }
    }

在这种方法中,它总是显示异常,说没有这样的目录。我也尝试了另一种方法,但这些方法都不适合我。试过这个解决方案来解密我的视频

Java 256 位 AES 基于密码的加密

如何使用 AES 解密 Android 中的文件?

标签: javaandroidencryptionaes

解决方案


推荐阅读