文档章节

用Java实现AES/CBC/PKCS7Padding加解密

士别三日
 士别三日
发布于 2018/05/07 18:13
字数 607
阅读 684
收藏 0

开发微信小程序的时候,第三方应用服务器需要解密微信服务器给的加密数据。当时小程序官方没有给出Java实现。网上的解决方案基本都差不多,但是示例代码不够清晰,逻辑混乱,这里整理一下。

 

1. Maven引入三方包

Java SE自带的加解密工具包不支持AES/CBC/PKCS7Padding。

<dependency>
  <groupId>org.bouncycastle</groupId>
  <artifactId>bcprov-jdk15on</artifactId>
  <version>1.55</version>
</dependency>

 

2. 测试方法

①进行加解密之前注意导入支持AES/CBC/PKCS7Padding的Provider。

②Base64只是一种编码解码工具,数据编码后,便于网络上传输。跟加解密没关系。

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

    //原始数据
	String data = "i am data";
    //密钥
	String sessionKey = "i am strong key ";
    //向量
	String iv = "i am iv i am iv ";
	
	//用Base64编码
	Base64.Encoder encoder = Base64.getEncoder();
	String baseData = encoder.encodeToString(data.getBytes());
	String baseSessionKey = encoder.encodeToString(sessionKey.getBytes());
	String baseIv = encoder.encodeToString(iv.getBytes());
	
    //导入支持AES/CBC/PKCS7Padding的Provider
	Security.addProvider(new BouncyCastleProvider());
		
    //获取加密数据
	String encryptedData = encrypt(baseData,baseSessionKey,baseIv);
    //通过加密数据获得原始数据
	String dataReborn = decrypt(encryptedData,baseSessionKey,baseIv);
		
    //打印解密出来的原始数据
	System.out.println(dataReborn);
		
}

 

3. 加密方法

public static String encrypt(String data,String sessionKey,String iv) throws Exception {

    //加密之前,先从Base64格式还原到原始格式
    Decoder decoder = Base64.getDecoder();
	byte[] dataByte = decoder.decode(data);
	byte[] keyByte = decoder.decode(sessionKey);
	byte[] ivByte = decoder.decode(iv);
	
    String encryptedData = null;

    //指定算法,模式,填充方式,创建一个Cipher
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");

    //生成Key对象
    Key sKeySpec = new SecretKeySpec(keyByte, "AES");
    
    //把向量初始化到算法参数
    AlgorithmParameters params = AlgorithmParameters.getInstance("AES");  
    params.init(new IvParameterSpec(ivByte));  

    //指定用途,密钥,参数 初始化Cipher对象
    cipher.init(Cipher.ENCRYPT_MODE, sKeySpec, params);

    //指定加密
    byte[] result = cipher.doFinal(dataByte);
        
    //对结果进行Base64编码,否则会得到一串乱码,不便于后续操作
    Base64.Encoder encoder = Base64.getEncoder();
    encryptedData = encoder.encodeToString(result);

		
	return encryptedData;
}

 

4. 解密方法

public static String decrypt(String encryptedData,String sessionKey,String iv) throws Exception {

    //解密之前先把Base64格式的数据转成原始格式
	Decoder decoder = Base64.getDecoder();
	byte[] dataByte = decoder.decode(encryptedData);
	byte[] keyByte = decoder.decode(sessionKey);
	byte[] ivByte = decoder.decode(iv);
		
	String data = null;
    
    //指定算法,模式,填充方法 创建一个Cipher实例
	Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");

    //生成Key对象
    Key sKeySpec = new SecretKeySpec(keyByte, "AES");
        
    //把向量初始化到算法参数
    AlgorithmParameters params = AlgorithmParameters.getInstance("AES");  
    params.init(new IvParameterSpec(ivByte));  

    //指定用途,密钥,参数 初始化Cipher对象
    cipher.init(Cipher.DECRYPT_MODE, sKeySpec, params);

    //执行解密
    byte[] result = cipher.doFinal(dataByte);

    //解密后转成字符串
    data = new String(result);
		
    return data;
}

5. 结果

i am data

 

© 著作权归作者所有

共有 人打赏支持
士别三日

士别三日

粉丝 38
博文 30
码字总数 43081
作品 0
深圳
程序员
私信 提问
加载中

评论(1)

全村人的希望e
很慢 要1s左右
关于AES256算法java端加密,ios端解密出现无法解密问题的解决方案

我想关于AES算法大家应该都已经了解了,我就不多介绍了。这是本人第一次写技术博文,如果有不对之处欢迎大家指正,共同讨论,一起学习! 之前在项目上用到AES256加密解密算法,刚开始在java端...

Sun1009
2012/12/13
0
32
php AES 加密,java解密 CBC模式256位

如题,,下面的代码是java的aes(256位CBC模式)的解密,现在请问,php加密怎么做??? import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import j...

能力一般
2015/01/20
2.1K
0
AES java ios 互解问题

@Sun1009 你好,想跟你请教个问题: 看了你关于AES java和ios的文章。按照这个方式不得行啊!java端自己可以加密解密,ios端也是。但是ios和java无法相互解密我们用的128位的!ios加密的可以再...

anybyb
2016/05/13
129
1
讲讲网络模块里加解密那点儿事--AES+BASE64

这次想来讲讲网络安全通信这一块,也就是网络层封装的那一套加密、解密,编码、解码的规则,不会很深入,但会大概将这一整块的讲一讲。 之所以想写这篇,是因为,最近被抽过去帮忙做一个 C+...

请叫我dasu
2018/08/06
0
0
讲讲网络模块中加解密那点儿事--AES+BASE64

这次想来讲讲网络安全通信这一块,也就是网络层封装的那一套加密、解密,编码、解码的规则,不会很深入,但会大概将这一整块的讲一讲。 之所以想写这篇,是因为,最近被抽过去帮忙做一个 C+...

请叫我大苏
2018/08/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Cookie 显示用户上次访问的时间

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.serv......

gwl_
今天
1
0
网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
今天
1
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
2
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部