admin管理员组文章数量:1633107
- AES文件加密、解密原理
- AES文件加密、解密集成
AES文件加密、解密原理
AES文件加密是最常见的对称加密算法,具体的加密流程:
明文P:没有经过加密的数据。
密钥K:用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方。
AES加密函数:把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。
密文C:经加密函数处理后的数据。
AES解密函数:把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。
对称加密算法:加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。
非对称加密算法:加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。
AES文件加密、解密集成
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* @author ZSL
* @since 2016年12月7日上午10:18:27
* @desc [文件加密]
*/
public class AESFileUtil {
private static final String key = "password";
/**
* init AES Cipher
* @param passsword
* @param cipherMode
* @return
*/
public static Cipher initAESCipher(String passsword, int cipherMode) {
Cipher cipher = null;
try {
SecretKey key = getKey(passsword);
cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
cipher.init(cipherMode, key);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (NoSuchPaddingException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (InvalidKeyException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return cipher;
}
private static SecretKey getKey(String password) {
int keyLength = 256;
byte[] keyBytes = new byte[keyLength / 8];
SecretKeySpec key = null;
try {
Arrays.fill(keyBytes, (byte) 0x0);
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
byte[] passwordBytes = password.getBytes("UTF-8");
int length = passwordBytes.length < keyBytes.length ? passwordBytes.length : keyBytes.length;
System.arraycopy(passwordBytes, 0, keyBytes, 0, length);
key = new SecretKeySpec(keyBytes, "AES");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return key;
}
/**
* AES 加密
* @param encryptPath
* @param decryptPath
* @param sKey
* @return
*/
public static boolean encryptFile(String encryptPath, String decryptPath, String sKey){
File encryptFile = null;
File decryptfile = null;
CipherOutputStream cipherOutputStream = null;
BufferedInputStream bufferedInputStream = null;
try {
encryptFile = new File(encryptPath);
if(!encryptFile.exists()) {
throw new NullPointerException("Encrypt file is empty");
}
decryptfile = new File(decryptPath);
if(decryptfile.exists()) {
decryptfile.delete();
}
decryptfile.createNewFile();
Cipher cipher = initAESCipher(sKey, Cipher.ENCRYPT_MODE);
cipherOutputStream = new CipherOutputStream(new FileOutputStream(decryptfile), cipher);
bufferedInputStream = new BufferedInputStream(new FileInputStream(encryptFile));
byte[] buffer = new byte[1024];
int bufferLength;
while ((bufferLength = bufferedInputStream.read(buffer)) != -1) {
cipherOutputStream.write(buffer, 0, bufferLength);
}
bufferedInputStream.close();
cipherOutputStream.close();
// delFile(encryptPath);
} catch (IOException e) {
delFile(decryptfile.getAbsolutePath());
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
return false;
}
return true;
}
/**
* AES 解密
* @param encryptPath
* @param decryptPath
* @param mKey
* @return
*/
public static boolean decryptFile(String encryptPath, String decryptPath, String mKey){
File encryptFile = null;
File decryptFile = null;
BufferedOutputStream outputStream = null;
CipherInputStream inputStream = null;
try {
encryptFile = new File(encryptPath);
if(!encryptFile.exists()) {
throw new NullPointerException("Decrypt file is empty");
}
decryptFile = new File(decryptPath);
if(decryptFile.exists()) {
decryptFile.delete();
}
decryptFile.createNewFile();
Cipher cipher = initAESCipher(mKey, Cipher.DECRYPT_MODE);
outputStream = new BufferedOutputStream(new FileOutputStream(decryptFile));
inputStream = new CipherInputStream(new FileInputStream(encryptFile), cipher);
int bufferLength;
byte[] buffer = new byte[1024];
while ((bufferLength = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bufferLength);
}
inputStream.close();
outputStream.close();
// delFile(encryptPath);
} catch (IOException e) {
delFile(decryptFile.getAbsolutePath());
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
return false;
}
return true;
}
/**
* delete File
* @param pathFile
* @return
*/
public static boolean delFile(String pathFile) {
boolean flag = false;
if(pathFile == null && pathFile.length() <= 0) {
throw new NullPointerException("文件不能为空");
}else {
File file = new File(pathFile);
// 路径为文件且不为空则进行删除
if (file.isFile() && file.exists()) {
file.delete();
flag = true;
}
}
return flag;
}
public static void main(String[] args) {
boolean flag = AESFileUtil.encryptFile
("E:/pdf/html/原文件.txt", "E:/pdf/html/加密后.txt", key);
System.out.println(flag);
flag = AESFileUtil.decryptFile
( "E:/pdf/html/加密后.txt","E:/pdf/html/解密后.txt", key);
System.out.println(flag);
}
}
版权声明:本文标题:AES文件加密 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1729147364a1187832.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论