import java.security.Security;
import java.security.MessageDigest;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import websams.web.hke.ImportHKDSEMsgAction;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import java.io.*;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class AESTest {
/**
* The logger provided, any child classes need to do is just call Logger method with no additional declare.
*/
public static WSLogger Logger = WSLogger.GetLogger(AES.class);
/*
public static void main(String[] args) throws Exception {
try {
String password = "abc123";
encryptAES(password, "C:\\tempfolder\\HKDSE-2013-SEP-REG-1905350001331-6B-20130204-9.txt");
//HKDSE-2013-SEP-REG-1905350001331-6B-20130204-9
//decryptAES(password);
System.exit(0);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
*/
public static String decryptAES(String password, String encryptFileName, String fileDir) throws Exception {
Logger.logDebug("11-HKE-01: encryptFileName="+encryptFileName+", fileDir="+fileDir);
String decryptFileName = null;
//Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); Deleted by Enoch for WebSAMS 3.0 upgrade
byte[] iv = new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
try {
//Read AES encrypted file
//FileInputStream fi = new FileInputStream("D:\\temp\\AESTest\\HKEAA_RD_CDS_E0001_20120131.aes");
FileInputStream fi = new FileInputStream(encryptFileName);
//Decode
BASE64Decoder decoder = new BASE64Decoder();
byte[] encrypted = decoder.decodeBuffer(fi);
//Generate key based on password
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] rawKey = md.digest(password.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
//Initialize a cipher
//Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, paramSpec);
//Start Decryption
byte[] decrypted = cipher.doFinal(encrypted);
//Create a zip stream based on decrypted bytes
ZipInputStream zip = new ZipInputStream(new BufferedInputStream(new ByteArrayInputStream(decrypted)));
//Read data file from zip
ZipEntry entry;
while ((entry = zip.getNextEntry()) != null)
{
int size;
byte[] buffer = new byte[2048];
Logger.logDebug("File name: " + new File(entry.getName()).getName() + "; size: " + entry.getSize() + "; compressed size: " + entry.getCompressedSize());
//FileOutputStream fos = new FileOutputStream(entry.getName()); Updated by Enoch for WebSAMS 3.0 upgrade
decryptFileName = fileDir+"/"+new File(entry.getName()).getName();
FileOutputStream fos = new FileOutputStream(decryptFileName);
BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length);
while ((size = zip.read(buffer, 0, buffer.length)) != -1) {
bos.write(buffer, 0, size);
}
bos.flush();
bos.close();
}
zip.close();
//bais.close();
return decryptFileName;
} catch(Exception e) {
e.printStackTrace();
throw e;
}
}
public static void encryptAES(String password, String inFileNamePath) throws Exception {
//Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); Deleted by Enoch for WebSAMS 3.0 upgrade
byte[] iv = new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
try {
//Read AES encrypted file
File file = new File(inFileNamePath);
FileInputStream fi = new FileInputStream(file.getPath());
System.out.println(fi.available());
byte[] fileByte = new byte[fi.available()];
fi.read(fileByte, 0, fi.available());
fi.close();
System.out.println(fileByte.length);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
zos.setLevel(9);
zos.setMethod(ZipOutputStream.DEFLATED);
ZipEntry ze = new ZipEntry(file.getName());
ze.setSize(fileByte.length);
zos.putNextEntry(ze);
zos.write(fileByte);
zos.closeEntry();
zos.close();
System.out.println(baos.size());
//Generate key based on password
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] rawKey = md.digest(password.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
//Initialize a cipher
//Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC"); Updated by Enoch for WebSAMS 3.0 upgrade
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, paramSpec);
//Start Decryption
byte[] decrypted = cipher.doFinal(baos.toByteArray());
//Encode
BASE64Encoder encoder = new BASE64Encoder();
String encrypted = encoder.encodeBuffer(decrypted);
FileWriter fw = new FileWriter(inFileNamePath);
fw.write(encrypted,0,encrypted.length());
fw.flush();
fw.close();
} catch(Exception e) {
e.printStackTrace();
throw e;
}
}
}
java 加密解密
最新推荐文章于 2024-10-03 08:30:19 发布