解密加密文件会损坏文件吗?Android-Java

解密加密文件会损坏文件吗?Android-Java,java,android,encryption,cryptography,Java,Android,Encryption,Cryptography,我正在使用以下代码进行加密/解密: import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.SecretKeySpec; public class CryptoUtils {

我正在使用以下代码进行加密/解密:

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;


public class CryptoUtils {
    private static final String ALGORITHM = "AES";
    private static final String TRANSFORMATION = "AES";

    public static void encrypt(String key, File inputFile, File outputFile)
            throws CryptoException {
        doCrypto(Cipher.ENCRYPT_MODE, key, inputFile, outputFile);
    }

    public static void decrypt(String key, File inputFile, File outputFile)
            throws CryptoException {
        doCrypto(Cipher.DECRYPT_MODE, key, inputFile, outputFile);
    }

    private static void doCrypto(int cipherMode, String key, File inputFile,
                                 File outputFile) throws CryptoException {
        try {
            Key secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PAdding");
            cipher.init(cipherMode, secretKey);

            FileInputStream inputStream = new FileInputStream(inputFile);
            byte[] inputBytes = new byte[(int) inputFile.length()];
            inputStream.read(inputBytes);

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

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

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

        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException
                | InvalidKeyException | BadPaddingException
                | IllegalBlockSizeException | IOException ex) {
            throw new CryptoException("Error encrypting/decrypting file", ex);
        }
    }

    public static class CryptoException extends Exception {

        public CryptoException() {
        }

        public CryptoException(String message, Throwable throwable) {
            super(message, throwable);
        }
    }
}
我可以加密和解密视频文件。 但是,我不能播放解密的文件,由相同的代码加密

原始文件:

加密文件:

解密的文件:

解密文件的前16个字节与原始文件不同。长度相同。

您假设:

  • 这个文件放在内存中
  • 文件大小适合整数
  • read()
    填充缓冲区
  • 加密或解密的结果与源内容一起放入内存
  • 不需要任何这些假设

    FileInputStream inputStream = new FileInputStream(inputFile);
    FileOutputStream outputStream = new FileOutputStream(outputFile);
    byte[] buffer = new byte[8192];
    int count;
    while ((count = in.read(buffer)) > 0)
    {
        byte[] output = cipher.update(buffer, 0, count);
        outputStream.write(output);
    }
    outputStream.write(cipher.doFinal());
    outputStream.close();
    inputStream.close();
    

    E&OE,但你明白了。通过使用
    CipherInput/OutputStreams,
    您可以使您的生活更加简单,但这样您就有点与加密异常失去了联系。

    感谢@EJP的帮助,但更改没有起作用。。解密后的加密文件无法播放..我对java中的加密技术不是很在行,尤其是在Android下,但我担心的是,我没有看到如何将IV从加密函数传递到解密函数。CBC模式使用该初始化向量模糊加密输出的第一个块,因此即使使用相同的密钥,相同的纯文本也会产生完全不同的加密文本。如果使用与加密不同的IV进行解密,则解密将成功,但第一个块(16字节)将被置乱。试着显式地提供你的IV(如果你愿意的话,为测试而硬编码),看看是否有效。我没有提到我的怀疑,但是在C#中的.NET中,如果你有CBC模式,并且没有指定你的IV,算法将随机生成一个。通常,您会将其作为加密输出的第一块写入,然后将其作为加密输入的第一块读取,以便为解密算法做准备。因此,要么将随机IV写入输出文件的开头,要么(仅用于测试)将其硬编码到程序中。请注意,硬编码IV失去了IV提供的所有有益属性。但出于测试目的,我会尝试一下。如果不知道您是如何加密的,就不可能知道解密代码有什么问题。我不想播放这些文件。我已经下载了这些文件。确实,问题出在错误的IV上,但目前的问题是无法提供解决方案。@ArtjomB。我怎样才能在那里添加salt代码。。你能帮忙吗。谢谢