文档章节

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

士别三日
 士别三日
发布于 05/07 18:13
字数 607
阅读 490
收藏 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
深圳
程序员
私信 提问
关于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

没有更多内容

加载失败,请刷新页面

加载更多

最重要的是做什么,而不是怎么做。

最重要的是做什么,而不是怎么做。 做什么是战略,怎么做是战术。将军下令说,天黑前拿下这座山头,这是战略。手下的士兵可以不知道为什么要拿下这座山头,还非得是天黑之前,但士兵必须知道...

我是菜鸟我骄傲
今天
1
0
w, vmstat, top, sar, nload命令查看系统状态信息

w/uptime 查看系统负载 cat /proc/cpuinfo 查看cpu核数 vmstat 监控系统状态,用法 vmstat 1,关键的几列: r, b, swpd, si, so, bi, bo, us, wa top 查看进程使用资源情况 top -c 显示详细的...

野雪球
今天
2
0
小白创建一个spring boot项目

进入 https://start.spring.io/

lilugirl
今天
3
0
Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源

背景 随着应用越来越复杂,依赖越来越多,日志系统越来越混乱,有时会出现一些奇怪的日志,比如: [] [] [] No credential found 那么怎样排查这些奇怪的日志从哪里打印出来的呢?因为搞不清...

hengyunabc
今天
2
0
home hosts

home hosts lwk@qwfys:~$ cat /etc/hosts127.0.0.1 localhost127.0.1.1 qwfys192.168.56.101vm600.qwfys.com39.108.212.91alpha1.ppy.com39.108.117.122alpha2.p......

qwfys
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部