- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java实现微信小程序加密数据解密算法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、概述 。
微信推出了小程序,很多公司的客户端应用不仅具有了app、h5、还接入了小程序开发。但是,小程序中竟然没有提供java版本的加密数据解密算法。这着实让广大的java开发人员蛋疼.
微信小程序提供的加密数据解密算法链接 。
我们下载的算法示例如下:
木有java!! 木有java!! 木有java!! 。
那么如何解决这个问题,我们一起来实现java版本的微信小程序加密数据解密算法.
2、实现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));
}
}
|
3、测试 。
1、运行java版微信小程序加密数据解密算法 。
这里我们就直接运行wxcore类的main方法,这里的测试数据都是从python版微信小程序加密数据解密算法的示例程序中提出来的。我们的运行结果如下:
。
。
这里我们在python环境中直接运行微信官方提供的python版小程序加密数据解密算法,结果如下:
。
。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/l1028386804/article/details/79450115 。
最后此篇关于java实现微信小程序加密数据解密算法的文章就讲到这里了,如果你想了解更多关于java实现微信小程序加密数据解密算法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用框架的对象编写一个用于加密/解密的简单库。方法如下: public static byte[] Encrypt(byte[] key, byte[] vector, byte[] input
据我所知,RIM Crypto API 似乎只提供用于对称加密 (3Des) 的 PKCS5 填充模式。我正在使用 JDE 4.6.0。 我正在尝试为黑莓应用程序提供密码学,该应用程序需要与已经使用标
我已经获得了用于加密的 Java 实现,但遗憾的是我们是一家 .net 商店,我无法将 Java 整合到我们的解决方案中。可悲的是,我也不是 Java 专家,所以我已经为此苦苦挣扎了几天,我想我终于可
我正在尝试使用 KMS 和 AWS 加密 SDK 加密数据。查看 AWS documentation 中提供的示例,似乎没有地方可以明确设置数据 key 。 我找到了 EncryptionMateri
我目前有一个用于为我的网站制作哈希的代码,该代码使用 SALT 进行哈希处理,因此密码是不可逆的...... 目前它是 100% 为我的网站工作,它是使用 ASP.NET(C#) 编码的 这是我的代码
我想要做的是在 javascript 中生成一个 key 对,并在 PHP 中使用这些加密,然后用 JS 解密。 我在附加的代码中有两个问题 它不会从装甲文本块重新加载私钥 并且它不会解密 PHP 加
在进行密码哈希时,我有以下 node.js 代码。 body.password = covid@19 salt = "hello@world" body.passwordhex = crypto.cr
我想知道的是在配置文件中加密连接字符串的明确方法。以下是我的问题: 使用机器级加密,访问我的服务器的任何人都不能编写一个小的 .Net 程序来读取连接字符串的内容吗? 如果我将我的应用程序部署到企业环
我知道 rsync 可以在文件传输期间启用/禁用 ssh 加密协议(protocol)。那么,如果 ssh 加密协议(protocol)被禁用了,是不是意味着 rsync 根本不做任何加密呢? 另外,
脚本必须搜索网页内的字符串。但该脚本不应显示它正在搜索的字符串。我的意思是搜索字符串应该采用加密格式或任何其他格式。但如果没有该搜索字符串,则不应显示网页或应在页面上显示错误。 我要开发一个插件。如果
我正在尝试加密 MySQL 上的某些字段。我正在使用 TPC-DS 的 v2.8 版本,并尝试在客户地址表的某些列上使用 AES。知道如何加密字段的所有行吗?我尝试使用 UPDATE customer
我需要一个简单的 javascript 函数,它允许我使用 key 加密 textarea 数据( key 是存储为散列 session 变量的用户密码,由 PHP 打印到字段中) 我基本上希望在用户
如何在 JavaScript 中散列/加密字符串值?我需要一种机制来隐藏 localStorage/cookie 中的一些数据吗? 这与安全问题有关,但我想为我的数据提供一些保护。 最佳答案 有很多
我有一个程序,其中数据库的密码由远程用户设置。该程序将用户名和密码保存到 xml 文件中的加密字符串中,否则应该是人类可读的。现在,这工作正常,我使用带有 key 的 C# DES 加密,它被加密和解
Kotlin 中是否有任何关于椭圆曲线加密的信息? 用于生成 key 对和加密、解密消息。 关于这个主题的信息很少甚至没有。 例如,我想实现 ECC P-521 椭圆曲线。 是否可以在 Kotlin
所以我知道 MD5 在技术上是新应用程序的禁忌,但我随机想到了这个: 自 md5($password); 不安全,不会 md5(md5($password)) 是更好的选择?我使用它的次数越多,它会变
我一直在努力使用 crypto_secretbox_easy() 在 libsodium 中加密/解密一些数据| .我似乎找不到关于使用的任何好的文档。 我想从用户那里获取密码,用它来以某种方式制作
我正在做一个加密项目 视频,我对这个程序有几个问题。 我用命令转码mp4至HLS与 ts段持续时间约为 10 秒。 首先,我需要使用数据库中的 key 加密这些视频。然而, 我不知道是否使用 ffmp
我有一个加密/复制保护问题。 我正在为使用加密狗的公司编写应用程序。请不要告诉我软件保护是没有用的,或者我应该让它自由地飞向空中,或者我花任何时间这样做都是浪费;这不是关于软件保护有效性的哲学问题,更
我对 有一个疑问VIM 加密 key . 我有一个文本文件,我使用加密该文件 :X 现在,加密 key 的存储位置(路径)。 无论是存储在单独的文件中还是存储在文本文件本身中。 如果我打开文件,它会询
我是一名优秀的程序员,十分优秀!