激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java實現微信小程序加密數據解密算法

java實現微信小程序加密數據解密算法

2021-05-30 15:54liuyazhuang Java教程

這篇文章主要為大家詳細介紹了java實現微信小程序加密數據解密算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、概述

微信推出了小程序,很多公司的客戶端應用不僅具有了app、h5、還接入了小程序開發。但是,小程序中竟然沒有提供java版本的加密數據解密算法。這著實讓廣大的java開發人員蛋疼。

微信小程序提供的加密數據解密算法鏈接

我們下載的算法示例如下:

java實現微信小程序加密數據解密算法

木有java!! 木有java!! 木有java!!

那么如何解決這個問題,我們一起來實現java版本的微信小程序加密數據解密算法。

二、實現java版本的微信小程序加密數據解密算法

1、創建項目

這里,我們創建一個maven工程,具體創建步驟略。

2、配置pom.xml

我們在pom.xml中加入如下配置。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<dependency>
 <groupid>org.bouncycastle</groupid>
 <artifactid>bcprov-jdk16</artifactid>
 <version>1.46</version>
</dependency>
 
 <dependency>
 <groupid>commons-codec</groupid>
 <artifactid>commons-codec</artifactid>
 <version>1.4</version>
</dependency>
 
<dependency>
 <groupid>net.sf.json-lib</groupid>
 <artifactid>json-lib</artifactid>
 <version>2.2.3</version>
 <classifier>jdk15</classifier>
</dependency>

3、實現aes類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package com.chwl.medical.crypto.wx;
 
import java.security.algorithmparameters;
import java.security.invalidalgorithmparameterexception;
import java.security.invalidkeyexception;
import java.security.key;
import java.security.nosuchalgorithmexception;
import java.security.nosuchproviderexception;
import java.security.security;
 
import javax.crypto.badpaddingexception;
import javax.crypto.cipher;
import javax.crypto.illegalblocksizeexception;
import javax.crypto.nosuchpaddingexception;
import javax.crypto.spec.ivparameterspec;
import javax.crypto.spec.secretkeyspec;
import org.bouncycastle.jce.provider.bouncycastleprovider;
 
/**
 * aes加密
 * @author liuyazhuang
 *
 */
public class aes {
 
 public static boolean initialized = false;
 
 /**
 * aes解密
 *
 * @param content
 *  密文
 * @return
 * @throws invalidalgorithmparameterexception
 * @throws nosuchproviderexception
 */
 public byte[] decrypt(byte[] content, byte[] keybyte, byte[] ivbyte) throws invalidalgorithmparameterexception {
 initialize();
 try {
 cipher cipher = cipher.getinstance("aes/cbc/pkcs7padding");
 key skeyspec = new secretkeyspec(keybyte, "aes");
 cipher.init(cipher.decrypt_mode, skeyspec, generateiv(ivbyte));// 初始化
 byte[] result = cipher.dofinal(content);
 return result;
 } catch (nosuchalgorithmexception e) {
 e.printstacktrace();
 } catch (nosuchpaddingexception e) {
 e.printstacktrace();
 } catch (invalidkeyexception e) {
 e.printstacktrace();
 } catch (illegalblocksizeexception e) {
 e.printstacktrace();
 } catch (badpaddingexception e) {
 e.printstacktrace();
 } catch (nosuchproviderexception e) {
 // todo auto-generated catch block
 e.printstacktrace();
 } catch (exception e) {
 // todo auto-generated catch block
 e.printstacktrace();
 }
 return null;
 }
 
 public static void initialize() {
 if (initialized)
 return;
 security.addprovider(new bouncycastleprovider());
 initialized = true;
 }
 
 // 生成iv
 public static algorithmparameters generateiv(byte[] iv) throws exception {
 algorithmparameters params = algorithmparameters.getinstance("aes");
 params.init(new ivparameterspec(iv));
 return params;
 }
}

4、實現wxpkcs7encoder類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.chwl.medical.crypto.wx;
 
import java.nio.charset.charset;
import java.util.arrays;
 
 
/**
 * 微信小程序加解密
 * @author liuyazhuang
 *
 */
public class wxpkcs7encoder {
 private static final charset charset = charset.forname("utf-8");
 private static final int block_size = 32;
 
 /**
 * 獲得對明文進行補位填充的字節.
 *
 * @param count
 *  需要進行填充補位操作的明文字節個數
 * @return 補齊用的字節數組
 */
 public static byte[] encode(int count) {
 // 計算需要填充的位數
 int amounttopad = block_size - (count % block_size);
 if (amounttopad == 0) {
 amounttopad = block_size;
 }
 // 獲得補位所用的字符
 char padchr = chr(amounttopad);
 string tmp = new string();
 for (int index = 0; index < amounttopad; index++) {
 tmp += padchr;
 }
 return tmp.getbytes(charset);
 }
 
 /**
 * 刪除解密后明文的補位字符
 *
 * @param decrypted
 *  解密后的明文
 * @return 刪除補位字符后的明文
 */
 public static byte[] decode(byte[] decrypted) {
 int pad = decrypted[decrypted.length - 1];
 if (pad < 1 || pad > 32) {
 pad = 0;
 }
 return arrays.copyofrange(decrypted, 0, decrypted.length - pad);
 }
 
 /**
 * 將數字轉化成ascii碼對應的字符,用于對明文進行補碼
 *
 * @param a
 *  需要轉化的數字
 * @return 轉化得到的字符
 */
 public static char chr(int a) {
 byte target = (byte) (a & 0xff);
 return (char) target;
 }
}

5、實現wxcore類

這個類主要是對具體算法的封裝,統一對外提供方法。

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.chwl.medical.crypto.wx;
 
import org.apache.commons.codec.binary.base64;
 
import net.sf.json.jsonobject;
 
 
/**
 * 封裝對外訪問方法
 * @author liuyazhuang
 *
 */
public class wxcore {
 
 private static final string watermark = "watermark";
 private static final string appid = "appid";
 /**
 * 解密數據
 * @return
 * @throws exception
 */
 public static string decrypt(string appid, string encrypteddata, string sessionkey, string iv){
 string result = "";
 try {
 aes aes = new aes();
 byte[] resultbyte = aes.decrypt(base64.decodebase64(encrypteddata), base64.decodebase64(sessionkey), base64.decodebase64(iv));
 if(null != resultbyte && resultbyte.length > 0){
  result = new string(wxpkcs7encoder.decode(resultbyte));
 jsonobject jsonobject = jsonobject.fromobject(result);
 string decryptappid = jsonobject.getjsonobject(watermark).getstring(appid);
 if(!appid.equals(decryptappid)){
 result = "";
 }
  }
 } catch (exception e) {
 result = "";
 e.printstacktrace();
 }
 return result;
 }
 
 
 public static void main(string[] args) throws exception{
 string appid = "wx4f4bc4dec97d474b";
 string encrypteddata = "ciylu1aw2kjvrjmdj8ykliajtp4gsmzmqmrzoog2xrdcvsnximxfufnstngtyags9ut5gera0w4otob1wt7fjlac+onpdbb+3hvbjsrgv+4lgoetkuqz6oystslq142dncuabnpgbzlooomb231qmm85d2/fv6chevvxvqp8hkue1pooftnetpyxvlw1zao6/1xx1coxfvrc2d7ul/lmhinnlxuacjxwu0fjpxfz/yqyzbibzd6wuftif9grhpon/hz7sal8xz+w//frauid1oksqaqx4cms8loddcqhulw4ucetdf96jcr3g0gfrk4pc7e/r7z6xnrxd2uieorgj5ef7b1pjayb6y5anahqz9j6nkebvb4dnnlivwsgarns/8wr2sirs7mnacwtyrgvt9ts8p12pkfdlqytopnhr1vf7xjfhqlvsajdnikdymyvoklarv85ifvunyzo0ikxsyl7jcujcpog20f0a04cowfneqaggwd5oa+t8yo5hzuydb/xcxxmk01epqoyuxinew==";
 string sessionkey = "tiihtnczf5v6akryjweuhq==";
 string iv = "r7bxxkklb8qrsnn05n0qia==";
 system.out.println(decrypt(appid, encrypteddata, sessionkey, iv));
 }
}

三、測試

1、運行java版微信小程序加密數據解密算法

這里我們就直接運行wxcore類的main方法,這里的測試數據都是從python版微信小程序加密數據解密算法的示例程序中提出來的。我們的運行結果如下:

 

復制代碼 代碼如下:
{"openid":"ogzui0egbjy1zhbyw2khdufwvjje","nickname":"band","gender":1,"language":"zh_cn","city":"guangzhou","province":"guangdong","country":"cn","avatarurl":"http://wx.qlogo.cn/mmopen/vi_32/askcbbppibyknichntmm0qjvh8kjgiak2ahwr8mhm4wgmem7gfhsf8oyrysdbvamvtsw3mo8ibkicsnfn5prjl1p8hq/0","unionid":"ocmvos6njeklibqg5mr9qjxrp1fa","watermark":{"timestamp":1477314187,"appid":"wx4f4bc4dec97d474b"}}

2、運行python版微信小程序加密數據解密算法

 

這里我們在python環境中直接運行微信官方提供的python版小程序加密數據解密算法,結果如下:

 

復制代碼 代碼如下:
{u'province': u'guangdong', u'openid': u'ogzui0egbjy1zhbyw2khdufwvjje', u'language': u'zh_cn', u'city': u'guangzhou', u'gender': 1, u'avatarurl': u'http://wx.qlogo.cn/mmopen/vi_32/askcbbppibyknichntmm0qjvh8kjgiak2ahwr8mhm4wgmem7gfhsf8oyrysdbvamvtsw3mo8ibkicsnfn5prjl1p8hq/0', u'watermark': {u'timestamp': 1477314187, u'appid': u'wx4f4bc4dec97d474b'}, u'country': u'cn', u'nickname': u'band', u'unionid': u'ocmvos6njeklibqg5mr9qjxrp1fa'}

通過對比以上結果可知,我們自行使用java實現的java版微信小程序加密數據解密算法與微信官方提供的python版小程序加密數據解密算法結果一致。

 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/l1028386804/article/details/79450115

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产亚洲精彩视频 | 日韩三级伦理在线观看 | 日本a级免费 | 日韩欧美高清一区 | 午夜精品久久久久久久99热浪潮 | 轻点插视频 | 亚洲一区二区成人 | 久久影院国产精品 | 免费a观看 | 亚洲第一成av人网站懂色 | 中文字幕国产欧美 | 亚洲第一色片 | 精品一区二区在线播放 | 草久视频在线观看 | 线观看免费完整aaa 欧美在线一级 | 久久国产精品免费视频 | 国产高潮好爽好大受不了了 | 久久精品久久久久 | 免费a视频| av在线免费观看网 | 99最新网址 | 久久精品男人 | 91九色视频| 久久亚洲美女视频 | 毛片视频在线免费观看 | 久久精品国产清自在天天线 | 销魂美女一区二区 | 久草高清视频 | 九九热精 | 色操网 | 精品亚洲视频在线观看 | 蜜桃网站免费 | 亚洲精品久久久久久 | xnxx 美女19| 亚洲网站免费观看 | 男女羞羞视频在线免费观看 | 国产精品午夜未成人免费观看 | 国产一区二区精品在线观看 | 亚洲精品久久久久久 | 免费在线观看国产精品 | 特级无码毛片免费视频尤物 |