文档章节

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

士别三日
 士别三日
发布于 05/07 18:13
字数 607
阅读 195
收藏 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

 

© 著作权归作者所有

共有 人打赏支持
士别三日

士别三日

粉丝 35
博文 30
码字总数 43081
作品 0
深圳
程序员
关于AES256算法java端加密,ios端解密出现无法解密问题的解决方案

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

Sun1009
2012/12/13
0
32
讲讲网络模块里加解密那点儿事--AES+BASE64

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

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

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

请叫我大苏
08/04
0
0
Node系统模块crypto实现md5 Cipher等多种加密方式

crypto加密模块是C/C++实现这些算法后,暴露为javascript接口的模块,包含对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装。Cipher Cipher类用于加密数据,属于对称密...

曲先森
07/31
0
0
AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】

由于本人小菜,开始对AES加密并不了解,在网络上花了比较多时间查阅资料整理; 先简单从百度找来介绍: 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准Rij...

尐桀
2012/10/31
0
29

没有更多内容

加载失败,请刷新页面

加载更多

下一页

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
1
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部