2012-02-29 3 views
10

Я использую этот метод для шифрования видеофайла:Шифрование видеофайлов?

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); 
    } 
} 

Но это дает ошибку OutOfMemoryError говоря, отвергая выделение 301023321 элемента.

1.Is метод, который я использую правильно для таких больших файлов?

2.Если да, почему я получаю эту ошибку? Что такое решение?

3. Если нет, предложите какой-нибудь хороший метод для этого?

+0

вместо dofinal, я бы использовал обновление с кусками моего начального байта [] (несколько раз каждый раз) и записывал их в файл. – njzk2

+0

или, возможно, использовать метод doFinal с двумя байтовыми элементами – njzk2

+0

Как вы собираетесь расшифровать это? Вы усложняете это, зашифровав видео в кусках ... –

ответ

21

CipherInputStream и CipherOutputStream помогут вам сделать это легко. Я написал образец программы для шифрования и дешифрования видеофайла. Измените это по вашему выбору ...

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(); 

Я генерации нового ключа с помощью generateKey(). Вы можете использовать массив байтов слишком, чтобы сгенерировать свой собственный ключ ....

+0

Глядя, просто дайте мне попробовать !! – Navdroid

+0

Работает, но занимает много времени! Любые предложения по ускорению – Navdroid

+0

Не стоит тратить столько много. Я думаю, ваш файл огромен .... сколько времени? –

7

Encryption Major Mistakes

Tonyz Java AES Encryptor

Быстрое шифрование/дешифрование с использованием Java Random IV generationSecureRandom

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(); 
     } 

    } 

} 

Спасибо Naveem M kumar за предложение http://libeasy.alwaysdata.net/

+2

Удивительное произведение. Большое вам спасибо. По какой-то причине доза «AES/CBC/PKCS5Padding» не работает для меня, меняя ее на «AES' ... –

+0

Иногда лучше показать упрямый код, потому что большинство читателей не поймут это правильно. IV не секрет, поэтому вы можете отправить его вместе с зашифрованным текстом. Обычно это просто добавляется к зашифрованному тексту и разрезается перед расшифровкой. –

+0

@ArtjomB. Я объявил IV_Length в переменной класса IV_LENGTH = 16. Надеюсь, я правильно понял ваш вопрос. –

Смежные вопросы