文档章节

Java 加、解密

oaks
 oaks
发布于 2017/01/24 09:39
字数 431
阅读 17
收藏 0
package com.yss.framework.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;

import com.yss.framework.api.logger.LogManager;
import com.yss.framework.api.logger.Logger;
import com.yss.framework.util.fun.YssCipher;

public class YssAESCipher {

	private static Logger logger = LogManager.getLogger(YssAESCipher.class);

	private static final String pass = "FF07C638C836CA34CC32CE689C748C738600FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00F7BC";
	
	/**
	 * 根据类型获取加密器
	 * @param mode 模式
	 * @param password 密码
	 * @return
	 * @throws Exception
	 */
	private static Cipher getCipher(int mode,String password) throws Exception{
		KeyGenerator kgen = KeyGenerator.getInstance("AES");
		kgen.init(128, new SecureRandom(password.getBytes()));
		Cipher cipher = Cipher.getInstance("AES");
		cipher.init(mode, new SecretKeySpec(kgen.generateKey().getEncoded(),"AES"));
		return cipher;
	}
	
	/**
	 * 加密文件
	 * @param inFileName 待加密文件名
	 * @param outFileName 加密后的文件名
	 * @throws Exception
	 */
	public static void encryptFile(String inFileName,String outFileName) throws Exception{
		InputStream in = null;
		OutputStream out = null;
		try {
			File fileIn = new File(inFileName);
			File fileOut = new File(outFileName);
			fileOut.getParentFile().mkdirs();
			in = new FileInputStream(fileIn);
			out = new FileOutputStream(fileOut);
			crypt(in, out, getCipher(Cipher.ENCRYPT_MODE, YssCipher.decodeByPassword(pass)));
		} catch (Exception e) {
			logger.log("加密文件失败:", e);
		} finally{
			if(in!=null){
				in.close();
			}
			if(out!=null){
				out.close();
			}
		}
	}
	
	/**
	 * 解密被加密的文件
	 * @param inFileName 加密文件名
	 * @param outFileName 输出的解密后文件名
	 * @throws Exception
	 */
	public static void decryptFile(String inFileName,String outFileName) throws Exception{
		InputStream in = null;
		OutputStream out = null;
		try {
			File fileIn = new File(inFileName);
			File fileOut = new File(outFileName);
			fileOut.getParentFile().mkdirs();
			in = new FileInputStream(fileIn);
			out = new FileOutputStream(fileOut);
			crypt(in, out, getCipher(Cipher.DECRYPT_MODE, YssCipher.decodeByPassword(pass)));
		} catch (Exception e) {
			logger.log("解密被加密的文件失败:", e);
		} finally{
			if(in!=null){
				in.close();
			}
			if(out!=null){
				out.close();
			}
		}
	}
	
	/**
	 * 从输入流向输出流加密或者解密
	 * @param in 输入流
	 * @param out 输出流
	 * @param cipher 加密器
	 * @throws Exception
	 */
	private static void crypt(InputStream in,OutputStream out,Cipher cipher) throws Exception{
		int blockSize = cipher.getBlockSize();
		int outputSize = cipher.getOutputSize(blockSize);
		byte[] bytesIn = new byte[blockSize];
		byte[] bytesOut = new byte[outputSize];
		int length = 0;
		while(true){
			length = in.read(bytesIn);
			if(length==blockSize){
				int outLength = cipher.update(bytesIn, 0, blockSize, bytesOut);
				out.write(bytesOut, 0, outLength);
				out.flush();
			}else {
				byte[] outbytes = null;
				if(length==-1){
					outbytes = cipher.doFinal();
				}else {
					outbytes = cipher.doFinal(bytesIn, 0, length);
				}
				out.write(outbytes);
				out.flush();
				break;
			}
		}
	}
	
	/**
	 * 获取加密输入流
	 * @param fileNameIn
	 * @return
	 * @throws Exception
	 */
	public static InputStream getCipherInputStream(String fileNameIn) throws Exception{
		return new CipherInputStream(new FileInputStream(fileNameIn),getCipher(Cipher.DECRYPT_MODE, YssCipher.decodeByPassword(pass)));
	}
	
	public static synchronized InputStream getCipherInputStream(InputStream in) throws Exception{
		return new CipherInputStream(in, getCipher(Cipher.DECRYPT_MODE, YssCipher.decodeByPassword(pass)));
	}
	

}

 

© 著作权归作者所有

oaks
粉丝 0
博文 71
码字总数 68614
作品 0
私信 提问
C#与Java AES 加密解密

前几天对接Java接口,需要C#加密参数,Java解密。奈何网上找了一堆大同小异的加解密方法都跟Jaca加密的密文不一致,Java接口也无法解密,直到看见上面链接的第二种方法。能够正常的解密Java加...

温柔的悬念。
2018/12/09
0
0
JDK1.8.0_151的无限制强度加密策略文件变动

JDK1.8.0_151的无限制强度加密策略文件变动 JDK1.8.0151无需去官网下载 这个jar包,只需要修改这目录下的文件配置即可。 随着越来越多的第三方工具只支持 JDK8,最近公司也计划从 JDK7 升级到...

指尖Coding
03/22
166
0
PHP中3DES加解密

@尐桀 你好,想跟你请教个问题: PHP中3DES加解密是否NOPadding的填充模式,对方用JAVA加解密的,16位加密后还是16位,可我用PHP写出来,就不对了,加密前是16位,加密后就不是了? 附: ci...

蓝色心海
2013/08/19
641
2
求一份wp7AES加解密和java AES加解密 互通源代码,谢谢

@junwong 你好,想跟你请教个问题: 服务器是用java作的,只有DES加解密,但是wp7不支持DES,现在需要求一份wp7和java AES加解密互通源代码。

junxianalan
2012/10/09
218
2
有没有办法可以文件上传之前用js对文件进行加密(aes加密或者des加密都行),java后台可以根据前台传过来的秘钥对加密文件进行解密?

我现在的问题是想在浏览器上传文件之前对文件进行加密操作,java后台接收到文件之后解密文件。暂时采用strus2文件上传机制,后台是java,java端加解密已经解决,我想知道js能不能做到文件加密...

新手上路吧
2014/09/24
1K
5

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部