video文件的encryption?
我正在使用这种方法来encryptionvideo文件:
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.我正在使用的方法是否适合这样的大文件?
2.如果是,为什么我得到这个错误?什么是解决scheme?
如果没有,请为此提出一些好的方法?
CipherInputStream
和CipherOutputStream
将帮助您轻松完成。 我写了一个示例程序来encryption和解密video文件。 根据您的select修改它…
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()
生成一个新的密钥。 您也可以使用一个字节数组来生成您自己的密钥….
encryption主要错误
Tonyz Java AESencryption器
使用Java SecureRandom
进行Random IV generation
快速encryption/解密
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的build议http://libeasy.alwaysdata.net/