package com.jxd.jxdtest.encryption;
import android.content.Context;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class MyFileEncryptor {
private Context mContext = null;
public MyFileEncryptor(Context context){
mContext = context;
}
@SuppressWarnings("static-access")
//文件加密的實現方法
public void encryptFile(String fileName,String encryptedFileName){
try {
FileInputStream fis = new FileInputStream(fileName);
FileOutputStream fos = new FileOutputStream(encryptedFileName);
//祕鑰自動生成
KeyGenerator keyGenerator=KeyGenerator.getInstance("AES");
keyGenerator.init(128);
Key key=keyGenerator.generateKey();
byte[] keyValue=key.getEncoded();
fos.write(keyValue);//記錄輸入的加密密碼的消息摘要
SecretKeySpec encryKey= new SecretKeySpec(keyValue,"AES");//加密祕鑰
byte[] ivValue=new byte[16];
Random random = new Random(System.currentTimeMillis());
random.nextBytes(ivValue);
IvParameterSpec iv = new IvParameterSpec(ivValue);//獲取系統時間作爲IV
fos.write("MyFileEncryptor".getBytes());//文件標識符
fos.write(ivValue); //記錄IV
Cipher cipher = Cipher.getInstance("AES/CFB/PKCS5Padding");
cipher.init(cipher.ENCRYPT_MODE, encryKey,iv);
CipherInputStream cis=new CipherInputStream(fis, cipher);
byte[] buffer=new byte[1024];
int n=0;
while((n=cis.read(buffer))!=-1){
fos.write(buffer,0,n);
}
cis.close();
fos.close();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@SuppressWarnings("static-access")
//文件解密的實現代碼
public void decryptedFile(String encryptedFileName,String decryptedFileName){
try {
FileInputStream fis = new FileInputStream(encryptedFileName);
FileOutputStream fos = new FileOutputStream(decryptedFileName);
byte[] fileIdentifier=new byte[15];
byte[] keyValue=new byte[16];
fis.read(keyValue);//讀記錄的文件加密密碼的消息摘要
fis.read(fileIdentifier);
if(new String (fileIdentifier).equals("MyFileEncryptor")){
SecretKeySpec key= new SecretKeySpec(keyValue,"AES");
byte[] ivValue= new byte[16];
fis.read(ivValue);//獲取IV值
IvParameterSpec iv= new IvParameterSpec(ivValue);
Cipher cipher = Cipher.getInstance("AES/CFB/PKCS5Padding");
cipher.init(cipher.DECRYPT_MODE, key,iv);
CipherInputStream cis= new CipherInputStream(fis, cipher);
byte[] buffer=new byte[1024];
int n=0;
while((n=cis.read(buffer))!=-1){
fos.write(buffer,0,n);
}
cis.close();
fos.close();
}else{
}
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}