JAVA的PKCS5,在c#中是PKCS7,并且两者密钥建议是16字节(128位),高于该长度不适用于该方法
加密数据:
AES加密模式 | CBC |
填充模式 | PKCS5Padding |
密钥KEY长度说明 | 16字节(128bit) |
偏移量 | 16字节(128bit) |
输出 | hex(16进制串) |
字符集 | UTF-8 |
c#加密
public string EncryptString(string data)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(密钥);
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(data);//data为需要加密的明文
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.CBC;
rDel.Padding = PaddingMode.PKCS7;
rDel.IV = keyArray;
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
//return Convert.ToBase64String(resultArray, 0, resultArray.Length);
return ByteToHexStr(resultArray);
}
/// <summary>
/// 字节数组转16进制字符串
/// </summary>
private static string ByteToHexStr(byte[] bytes)
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
returnStr += bytes[i].ToString("X2");
}
}
return returnStr;
}
JAVA 解密:
public class AESDecryptor {
public static void main(String[] args) {
try {
// 加密后的数据
String encryptedData = "加密后的数据";
// 加密使用的密钥
String key = "0123456789abcdef";
// 初始化Cipher对象
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// 创建SecretKeySpec对象
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
// 创建IvParameterSpec对象
IvParameterSpec ivParameterSpec = new IvParameterSpec(key.getBytes(StandardCharsets.UTF_8));
// 设置Cipher对象为解密模式,并指定密钥和初始向量
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
// 使用Base64解码加密后的数据
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedData);
// 解密数据
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
// 将解密后的数据转换为字符串
String decryptedData = new String(decryptedBytes, StandardCharsets.UTF_8);
System.out.println("解密后的数据:" + decryptedData);
} catch (Exception e) {
System.err.println("解密失败:" + e.getMessage());
}
}
}
c# 解密
public string DecryptString(string data)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(this.Key);
byte[] toEncryptArray = HexStrToByte(data);//Convert.FromBase64String(data);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.CBC;
rDel.Padding = PaddingMode.PKCS7;
rDel.IV = keyArray;
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
}
/// <summary>
/// 字符串转16进制字节数组
/// </summary>
private static byte[] HexStrToByte(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;
}