参考:https://www.shuzhiduo.com/A/GBJrE78Wz0/
JAVA代码
package kevin.demo;
import com.sun.org.apache.xpath.internal.objects.XString;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
public class Hello {
//算法名称/加密模式/数据填充方式
private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
/**
* 加密
* @param content 加密的字符串
* @param encryptKey key值
* @return String 密文
* @throws Exception
*/
public static String encrypt(String content, String encryptKey){
try {
final BASE64Encoder encoder = new BASE64Encoder();
KeyGenerator kGen = KeyGenerator.getInstance("AES");
kGen.init(128);
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
//根据加密规则拆分成字节,并加密
SecretKeySpec ss=new SecretKeySpec(encryptKey.getBytes(), "AES");
String wxd=parseByte2HexStr(ss.getEncoded());
cipher.init(Cipher.ENCRYPT_MODE, ss);
//密文utf8转码后存在字节数组中
byte[] b = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
//采用base64算法进行转码
return encoder.encode(b);
} catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchPaddingException | BadPaddingException | IllegalBlockSizeException e) {
return null;
}
}
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
/**
* 解密
*
* @param encryptStr 解密的字符串
* @param decryptKey 解密的key值
* @return String 明文
* @throws Exception
*/
public static String decrypt(String encryptStr, String decryptKey) {
final BASE64Decoder decoder = new BASE64Decoder();
try {
KeyGenerator kGen = KeyGenerator.getInstance("AES");//根据AES生成密钥
kGen.init(128);
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);//加密规则
//根据加密规则拆分成字节,并解密,获取解密方案
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
//采用base64算法进行转码
byte[] encryptBytes = new byte[0];
try {
encryptBytes = decoder.decodeBuffer(encryptStr);
} catch (IOException e) {
e.printStackTrace();
}
byte[] decryptBytes = cipher.doFinal(encryptBytes);
return new String(decryptBytes, StandardCharsets.UTF_8);
} catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchPaddingException | BadPaddingException | IllegalBlockSizeException e) {
return null;
}
}
public static void main(String[] args) {
String dd=encrypt("wxd5617","1234560123456789");
String dd2=decrypt(dd,"1234560123456789");
System.out.println(dd);
System.out.println(dd2);
}
}
NetCore代码
using System;
using System.Security.Cryptography;
using System.Text;
namespace JAVAAESForCshap
{
public static class EncryptDecryptTool
{
/// <summary>
/// 这个key来自java代码的wxd
/// </summary>
private const string key = "31323334353630313233343536373839";
/// <summary>
/// MD5哈希计算
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
//public static byte[] ConvertStringToMD52(string key)
//{
// //byte[] ByteData = Encoding.UTF8.GetBytes(key);
// //MD5 oMd5 = MD5.Create();
// //byte[] HashData = oMd5.ComputeHash(ByteData);
// return Convert.ToString(key, 2);
//}
private static byte[] ConvertStringToMD5(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0)
hexString += " ";
byte[] returnBytes = new byte[hexString.Length / 2];
for (int i = 0; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
return returnBytes;
}
/// <summary>
/// AES加密
/// </summary>
/// <param name="toEncrypt"></param>
/// <returns></returns>
public static string Encrypt(string toEncrypt)
{
byte[] keyArray = ConvertStringToMD5(key);
byte[] toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="toDecrypt"></param>
/// <returns></returns>
public static string Decrypt(string toDecrypt)
{
byte[] keyArray = ConvertStringToMD5(key);
byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
}
class Program
{
static void Main(string[] args)
{
/*
OoU0cxhvu/kgut0FAJ0IWg==
wxd5617
*/
//var dd = AesEncrypt("wxd5617", "1234560123456789");
//Console.WriteLine(dd);
//var dd2= AesDecrypt(dd, "1234560123456789");
//Console.WriteLine(dd2);
var dd = EncryptDecryptTool.Encrypt("wxd5617");
Console.WriteLine(dd);
if (dd == "OoU0cxhvu/kgut0FAJ0IWg==")
{
Console.WriteLine("加密一致");
}
}
}
}
参考链接1,是java对key有进行特殊处理,而这个特殊处理辨识md5哈希加密。
而实际场景中,java代码,key直接转为数组进行加密的,因java和c#数组排列不同——具体参考文章2.所以进行16进制转换。通信~~~~