这个问题在这里已经有了答案:
使用cipherinputstream和cipheroutputstream加密和解密文件(1个答案)
25天前关门了。
我想加密一个叫做 largefile.mp4
最有效的方法,然后再次解密,但它并没有像预期的那样工作。
实际上没有任何错误,并且文件被生成。但是新生成的文件比主文件小。
在这里 largefile.mp4
是100mb但是 newEncryptedFile.txt
是107kb newDecryptedFile.mp4
是210字节
有什么问题?
package fileenc;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import java.io.*;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
public class FileEncrypterDecrypter {
SecretKey key;
Cipher cipher;
public FileEncrypterDecrypter() {
try {
KeyGenerator keygen = KeyGenerator.getInstance("AES");
key = keygen.generateKey();
cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
System.out.println(e);
}
}
public boolean fileEncrypt(String plainFile) {
try (BufferedInputStream fis = new BufferedInputStream(new FileInputStream(plainFile))){
cipher.init(Cipher.ENCRYPT_MODE, key);
FileOutputStream fs = new FileOutputStream("newEncryptedFile.txt");
CipherOutputStream out = new CipherOutputStream(fs, cipher);
byte[] byteSize = new byte[1024];
int numberOfBytedRead;
while ( (numberOfBytedRead = fis.read(byteSize)) != -1 ) {
out.write(numberOfBytedRead);
}
fis.close();
out.flush();
out.close();
System.out.println("Encryption done...");
return true;
} catch (IOException | InvalidKeyException e) {
}
return false;
}
public boolean fileDecrypt(String encryptedFile) {
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("newDecryptedFile.mp4"))){
cipher.init(Cipher.DECRYPT_MODE, key);
FileInputStream fis = new FileInputStream(encryptedFile);
CipherInputStream in = new CipherInputStream(fis, cipher);
byte[] byteSize = new byte[1024];
int numberOfBytedRead;
while ( (numberOfBytedRead = in.read(byteSize)) != -1) {
bos.write(numberOfBytedRead);
}
System.out.println("Decryption done...");
bos.flush();
bos.close();
in.close();
return true;
} catch (IOException | InvalidKeyException e) {
}
return false;
}
public static void main(String[] args) throws FileNotFoundException, IOException {
FileEncrypterDecrypter fed = new FileEncrypterDecrypter();
fed.fileEncrypt("largefile.mp4"); // about 100 mb
fed.fileDecrypt("newEncryptedFile.txt");
}
}
1条答案
按热度按时间7hiiyaii1#
很抱歉,我没有检查您的代码,因为您使用的是不安全模式,不应再在新项目中使用。
下面是在cbc模式下使用aes进行文件加密和解密的示例代码。该程序生成一个用于加密和解密的随机密钥(使用base64编码中的out-of-the-key以获得更好的存储),生成一个随机初始化向量(iv),该向量写在加密文件的开头。
对于解密,前16个字节作为未加密数据读取,所有其他数据通过解密流。
加密是在cipheroutput-/inputstream的帮助下以8192字节的块进行的。
安全警告:该代码没有任何异常处理,仅用于教育目的。请注意,为了提高安全性,您可以更改为经过身份验证的加密(例如,使用hmac或gcm模式进行保护)。
输出:
代码: