300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > java aes 解密 文件_Java AES文件加解密

java aes 解密 文件_Java AES文件加解密

时间:2023-02-13 22:50:35

相关推荐

java aes 解密 文件_Java AES文件加解密

转自:/java/4049.html

AESUtils.java

package demo.security;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.security.Key;

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.CipherInputStream;

import javax.crypto.CipherOutputStream;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

/**

*

* AES加密解密工具包

*

*

* @author IceWee

* @date -5-18

* @version 1.0

*/

public class AESUtils {

private static final String ALGORITHM = "AES";

private static final int KEY_SIZE = 128;

private static final int CACHE_SIZE = 1024;

/**

*

* 生成随机密钥

*

*

* @return

* @throws Exception

*/

public static String getSecretKey() throws Exception {

return getSecretKey(null);

}

/**

*

* 生成密钥

*

*

* @param seed 密钥种子

* @return

* @throws Exception

*/

public static String getSecretKey(String seed) throws Exception {

KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);

SecureRandom secureRandom;

if (seed != null && !"".equals(seed)) {

secureRandom = new SecureRandom(seed.getBytes());

} else {

secureRandom = new SecureRandom();

}

keyGenerator.init(KEY_SIZE, secureRandom);

SecretKey secretKey = keyGenerator.generateKey();

return Base64Utils.encode(secretKey.getEncoded());

}

/**

*

* 加密

*

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] encrypt(byte[] data, String key) throws Exception {

Key k = toKey(Base64Utils.decode(key));

byte[] raw = k.getEncoded();

SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);

Cipher cipher = Cipher.getInstance(ALGORITHM);

cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

return cipher.doFinal(data);

}

/**

*

* 文件加密

*

*

* @param key

* @param sourceFilePath

* @param destFilePath

* @throws Exception

*/

public static void encryptFile(String key, String sourceFilePath, String destFilePath) throws Exception {

File sourceFile = new File(sourceFilePath);

File destFile = new File(destFilePath);

if (sourceFile.exists() && sourceFile.isFile()) {

if (!destFile.getParentFile().exists()) {

destFile.getParentFile().mkdirs();

}

destFile.createNewFile();

InputStream in = new FileInputStream(sourceFile);

OutputStream out = new FileOutputStream(destFile);

Key k = toKey(Base64Utils.decode(key));

byte[] raw = k.getEncoded();

SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);

Cipher cipher = Cipher.getInstance(ALGORITHM);

cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

CipherInputStream cin = new CipherInputStream(in, cipher);

byte[] cache = new byte[CACHE_SIZE];

int nRead = 0;

while ((nRead = cin.read(cache)) != -1) {

out.write(cache, 0, nRead);

out.flush();

}

out.close();

cin.close();

in.close();

}

}

/**

*

* 解密

*

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] decrypt(byte[] data, String key) throws Exception {

Key k = toKey(Base64Utils.decode(key));

byte[] raw = k.getEncoded();

SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);

Cipher cipher = Cipher.getInstance(ALGORITHM);

cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);

return cipher.doFinal(data);

}

/**

*

* 文件解密

*

*

* @param key

* @param sourceFilePath

* @param destFilePath

* @throws Exception

*/

public static void decryptFile(String key, String sourceFilePath, String destFilePath) throws Exception {

File sourceFile = new File(sourceFilePath);

File destFile = new File(destFilePath);

if (sourceFile.exists() && sourceFile.isFile()) {

if (!destFile.getParentFile().exists()) {

destFile.getParentFile().mkdirs();

}

destFile.createNewFile();

FileInputStream in = new FileInputStream(sourceFile);

FileOutputStream out = new FileOutputStream(destFile);

Key k = toKey(Base64Utils.decode(key));

byte[] raw = k.getEncoded();

SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);

Cipher cipher = Cipher.getInstance(ALGORITHM);

cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);

CipherOutputStream cout = new CipherOutputStream(out, cipher);

byte[] cache = new byte[CACHE_SIZE];

int nRead = 0;

while ((nRead = in.read(cache)) != -1) {

cout.write(cache, 0, nRead);

cout.flush();

}

cout.close();

out.close();

in.close();

}

}

/**

*

* 转换密钥

*

*

* @param key

* @return

* @throws Exception

*/

private static Key toKey(byte[] key) throws Exception {

SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);

return secretKey;

}

}

Base64Utils.java(依赖javabase64-1.3.1.jar)

package demo.security;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import it.sauronsoftware.base64.Base64;

/**

*

* BASE64编码解码工具包

*

*

* 依赖javabase64-1.3.1.jar

*

*

* @author IceWee

* @date -5-19

* @version 1.0

*/

public class Base64Utils {

/**

* 文件读取缓冲区大小

*/

private static final int CACHE_SIZE = 1024;

/**

*

* BASE64字符串解码为二进制数据

*

*

* @param base64

* @return

* @throws Exception

*/

public static byte[] decode(String base64) throws Exception {

return Base64.decode(base64.getBytes());

}

/**

*

* 二进制数据编码为BASE64字符串

*

*

* @param bytes

* @return

* @throws Exception

*/

public static String encode(byte[] bytes) throws Exception {

return new String(Base64.encode(bytes));

}

/**

*

* 将文件编码为BASE64字符串

*

*

* 大文件慎用,可能会导致内存溢出

*

*

* @param filePath 文件绝对路径

* @return

* @throws Exception

*/

public static String encodeFile(String filePath) throws Exception {

byte[] bytes = fileToByte(filePath);

return encode(bytes);

}

/**

*

* BASE64字符串转回文件

*

*

* @param filePath 文件绝对路径

* @param base64 编码字符串

* @throws Exception

*/

public static void decodeToFile(String filePath, String base64) throws Exception {

byte[] bytes = decode(base64);

byteArrayToFile(bytes, filePath);

}

/**

*

* 文件转换为二进制数组

*

*

* @param filePath 文件路径

* @return

* @throws Exception

*/

public static byte[] fileToByte(String filePath) throws Exception {

byte[] data = new byte[0];

File file = new File(filePath);

if (file.exists()) {

FileInputStream in = new FileInputStream(file);

ByteArrayOutputStream out = new ByteArrayOutputStream(2048);

byte[] cache = new byte[CACHE_SIZE];

int nRead = 0;

while ((nRead = in.read(cache)) != -1) {

out.write(cache, 0, nRead);

out.flush();

}

out.close();

in.close();

data = out.toByteArray();

}

return data;

}

/**

*

* 二进制数据写文件

*

*

* @param bytes 二进制数据

* @param filePath 文件生成目录

*/

public static void byteArrayToFile(byte[] bytes, String filePath) throws Exception {

InputStream in = new ByteArrayInputStream(bytes);

File destFile = new File(filePath);

if (!destFile.getParentFile().exists()) {

destFile.getParentFile().mkdirs();

}

destFile.createNewFile();

OutputStream out = new FileOutputStream(destFile);

byte[] cache = new byte[CACHE_SIZE];

int nRead = 0;

while ((nRead = in.read(cache)) != -1) {

out.write(cache, 0, nRead);

out.flush();

}

out.close();

in.close();

}

}

AESTester.java

package demo.security;

public class AESTester {

static String key;

static {

try {

key = AESUtils.getSecretKey();

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) throws Exception {

long begin = System.currentTimeMillis();

encryptFile();

decryptFile();

test();

long end = System.currentTimeMillis();

System.err.println("耗时:" + (end-begin)/1000 + "秒");

}

static void encryptFile() throws Exception {

String sourceFilePath = "D:/demo.mp4";

String destFilePath = "D:/demo_encrypted.mp4";

AESUtils.encryptFile(key, sourceFilePath, destFilePath);

}

static void decryptFile() throws Exception {

String sourceFilePath = "D:/demo_encrypted.mp4";

String destFilePath = "D:/demo_decrypted.mp4";

AESUtils.decryptFile(key, sourceFilePath, destFilePath);

}

static void test() throws Exception {

String source = "这是一行测试DES加密/解密的文字,你看完也等于没看,是不是啊?!";

System.err.println("原文:\t" + source);

byte[] inputData = source.getBytes();

inputData = AESUtils.encrypt(inputData, key);

System.err.println("加密后:\t" + Base64Utils.encode(inputData));

byte[] outputData = AESUtils.decrypt(inputData, key);

String outputStr = new String(outputData);

System.err.println("解密后:\t" + outputStr);

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。