Cifrado de archivos de video?

Estoy usando este método para encriptar un archivo de video:

public static void encryptToBinaryFile(String password, byte[] bytes, File file) throws EncrypterException { try { final byte[] rawKey = getRawKey(password.getBytes()); final FileOutputStream ostream = new FileOutputStream(file, false); ostream.write(encrypt(rawKey, bytes)); ostream.flush(); ostream.close(); } catch (IOException e) { throw new EncrypterException(e); } } private static byte[] encrypt(byte[] raw, byte[] clear) throws EncrypterException { try { final SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); final Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); return cipher.doFinal(clear); } catch (Exception e) { throw new EncrypterException(e); } } 

Pero da un error Outofmemoryerror diciendo rechazando la asignación del elemento 301023321.

1. ¿El método que estoy usando es correcto para archivos tan grandes?

2.Si es así, ¿por qué estoy obteniendo este error? ¿Cuál es la solución?

3.Si no, por favor sugiera algún buen método para eso?

CipherInputStream y CipherOutputStream te ayudarán a hacerlo fácilmente. Escribí un progtwig de ejemplo para cifrar y descifrar un archivo de video. Modifíquelo según su elección …

 FileInputStream fis = new FileInputStream(new File("D:/Shashank/inputVideo.avi")); File outfile = new File("D:/Shashank/encVideo.avi"); int read; if(!outfile.exists()) outfile.createNewFile(); File decfile = new File("D:/Shashank/decVideo.avi"); if(!decfile.exists()) decfile.createNewFile(); FileOutputStream fos = new FileOutputStream(outfile); FileInputStream encfis = new FileInputStream(outfile); FileOutputStream decfos = new FileOutputStream(decfile); Cipher encipher = Cipher.getInstance("AES"); Cipher decipher = Cipher.getInstance("AES"); KeyGenerator kgen = KeyGenerator.getInstance("AES"); //byte key[] = {0x00,0x32,0x22,0x11,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; SecretKey skey = kgen.generateKey(); //Lgo encipher.init(Cipher.ENCRYPT_MODE, skey); CipherInputStream cis = new CipherInputStream(fis, encipher); decipher.init(Cipher.DECRYPT_MODE, skey); CipherOutputStream cos = new CipherOutputStream(decfos,decipher); while((read = cis.read())!=-1) { fos.write((char)read); fos.flush(); } fos.close(); while((read=encfis.read())!=-1) { cos.write(read); cos.flush(); } cos.close(); 

Estoy generando una nueva clave usando generateKey() . También puede usar una matriz de bytes para generar su propia clave …

Errores principales de encriptación

Tonyz Java AES Encryptor

Cifrado / descifrado rápidos con Random IV generation utilizando Java SecureRandom

 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.Cipher; import javax.crypto.CipherOutputStream; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class Encrypter { private final static int IV_LENGTH = 16; // Default length with Default 128 // key AES encryption private final static int DEFAULT_READ_WRITE_BLOCK_BUFFER_SIZE = 1024; private final static String ALGO_RANDOM_NUM_GENERATOR = "SHA1PRNG"; private final static String ALGO_SECRET_KEY_GENERATOR = "AES"; private final static String ALGO_VIDEO_ENCRYPTOR = "AES/CBC/PKCS5Padding"; @SuppressWarnings("resource") public static void encrypt(SecretKey key, /*AlgorithmParameterSpec paramSpec,*/ InputStream in, OutputStream out) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IOException { try { // byte[] iv = new byte[] { (byte) 0x8E, 0x12, 0x39, (byte) 0x9C, // 0x07, 0x72, 0x6F, 0x5A, (byte) 0x8E, 0x12, 0x39, (byte) 0x9C, // 0x07, 0x72, 0x6F, 0x5A }; //generate new AlgorithmParameterSpec // AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); Cipher c = Cipher.getInstance(ALGO_VIDEO_ENCRYPTOR); c.init(Cipher.ENCRYPT_MODE, key, paramSpec); out = new CipherOutputStream(out, c); int count = 0; byte[] buffer = new byte[DEFAULT_READ_WRITE_BLOCK_BUFFER_SIZE]; while ((count = in.read(buffer)) >= 0) { out.write(buffer, 0, count); } } finally { out.close(); } } @SuppressWarnings("resource") public static void decrypt(SecretKey key, /*AlgorithmParameterSpec paramSpec,*/ InputStream in, OutputStream out) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IOException { try { // byte[] iv = new byte[] { (byte) 0x8E, 0x12, 0x39, (byte) 0x9C, // 0x07, 0x72, 0x6F, 0x5A, (byte) 0x8E, 0x12, 0x39, (byte) 0x9C, // 0x07, 0x72, 0x6F, 0x5A }; // read from input stream AlgorithmParameterSpec // AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); Cipher c = Cipher.getInstance(ALGO_VIDEO_ENCRYPTOR); c.init(Cipher.DECRYPT_MODE, key, paramSpec); out = new CipherOutputStream(out, c); int count = 0; byte[] buffer = new byte[DEFAULT_READ_WRITE_BLOCK_BUFFER_SIZE]; while ((count = in.read(buffer)) >= 0) { out.write(buffer, 0, count); } } finally { out.close(); } } public static void main(String[] args) { File inFile = new File("C:/enc_test/video.swf"); File outFile = new File("C:/enc_test/enc_video.swf"); File outFile_dec = new File("C:/enc_test/dec_video.swf"); try { SecretKey key = KeyGenerator.getInstance(ALGO_SECRET_KEY_GENERATOR).generateKey(); byte[] keyData = key.getEncoded(); SecretKey key2 = new SecretKeySpec(keyData, 0, keyData.length, ALGO_SECRET_KEY_GENERATOR); //if you want to store key bytes to db so its just how to //recreate back key from bytes array byte[] iv = new byte[IV_LENGTH]; SecureRandom.getInstance(ALGO_RANDOM_NUM_GENERATOR).nextBytes(iv); // If // storing // separately AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); Encrypter.encrypt(key, paramSpec, new FileInputStream(inFile), new FileOutputStream(outFile)); Encrypter.decrypt(key2, paramSpec, new FileInputStream(outFile), new FileOutputStream(outFile_dec)); } catch (Exception e) { e.printStackTrace(); } } } 

Gracias Naveem M kumar por sugerencia http://libeasy.alwaysdata.net/