java .net aes解密_java与C#、.NET AES加密、解密 解决方案

1.情景展示

Java提供的密钥,C#无法解密。

2.原因分析

在Java中,AES的实际密钥需要用到KeyGenerator 和 SecureRandom,但是C#和.NET 里面没有这2个类,

所以,无法使用安全随机数生成KEY,进而导致解密失败。

Java对密钥做的进一步处理:

4b4a5f015ddab3dec79637c05b63981e.png

参数说明:

加密模式:ECB(默认值)、CBC

填充模式:PKCS5Padding(java只有这一种,其它语言使用PKCS7Padding即可,5和7没有区别)

数据块:128位(java只有这一种)

3.解决方案

超级简单的方法见最后(20190921)

方案一:推荐使用

思路:

将由Java生成的AES所需要的实际密钥,提供给C#,然后C#用这个实际的key去解密。

由于C#中byte范围是[0,255],而Java中的byte范围是[-128,127],所以,我们需要对生成的二进制密钥进行处理。

1449a48bdab471fab0e3aaa36ab5848e.png

因此,Java作为密钥的提供方,需要将二进制转成16进制,C#将接收到的16进制密钥转换成二进制即可。

流程图:

0ae3b859a9af0dd721231be91b739b51.png

java AES 加密

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

import org.apache.log4j.Logger;

/**

* AES加密算法工具类

* @explain 可逆算法:加密、解密

* AES/ECB/PKCS5Padding

* @author Marydon

* @creationTime 2018年7月7日下午2:17:43

* @version 3.0

* @since 2.0

* @email marydon20170307@163.com

*/

public class AESUtils {

private static Logger log = Logger.getLogger(AESUtils.class);

// 定义字符集

private static final String ENCODING = "UTF-8";

/**

* 根据提供的密钥生成AES专用密钥

* @explain

* @param password

* 可以是中文、英文、16进制字符串

* @return AES密钥

* @throws Exception

*/

public static byte[] generateKey(String password) throws Exception {

byte[] keyByteArray = null;

// 创建AES的Key生产者

KeyGenerator kgen = KeyGenerator.getInstance("AES");

// 利用用户密码作为随机数初始化

// 指定强随机数的生成方式

// 兼容linux

SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

random.setSeed(password.getBytes(ENCODING));

kgen.init(128, random);// 只能是128位

// 根据用户密码,生成一个密钥

SecretKey secretKey = kgen.generateKey();

// 返回基本编码格式的密钥,如果此密钥不支持编码,则返回null。

keyByteArray = secretKey.getEncoded();

return keyByteArray;

}

/**

* AES加密字符串

* @param content

* 需要被加密的字符串

* @param password

* 加密需要的密码

* @return 16进制的密文(密文的长度随着待加密字符串的长度

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值