解密加密文件会损坏文件吗?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代码。。你能帮忙吗。谢谢