Java 与 C# 互通的 AES 加密,加密解密结果一致

本贴最后更新于 2293 天前,其中的信息可能已经时移世改

在实际项目中,遇到 Java 系统与.Net 系统进行对接;由 Java 出发的加密数据需要在.Net 中解密进行下一步的操作,在网上查阅了很多资料,总结出以下两个版本通用的方法,把加密字节通过 Base64 再加密一次,解决传输乱码的问题保证加密解密结果完全一致。

JAVA 版本

AESUtils 工具类

package www.**.**.util; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; /** * @author yangps. * @version 2018-8-28下午 14:23 */public class AESUtils { //实际的加密解密操作 private static String Operation(String src, String key, int mode) throws Exception { if (key==null) { return "Key不能为空"; } if (key.length()!=16) { return "Key需要16位长度"; } String result = ""; byte[] raw = key.getBytes("utf-8"); SecretKeySpec keySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); if (mode == Cipher.ENCRYPT_MODE) { cipher.init(mode, keySpec); byte[] encrypted = cipher.doFinal(src.getBytes("utf-8")); //将+替换为%2B result = new BASE64Encoder().encode(encrypted).replace("+", "%2B"); } else { cipher.init(mode, keySpec); //将%2B替换为+ src = src.replace("%2B", "+"); byte[] encrypted = cipher.doFinal(new BASE64Decoder().decodeBuffer(src)); result = new String(encrypted, "utf-8"); } return result; } /** * 加密 * * @param src * @return * @throws Exception */ public static String Encrypt(String src, String key) throws Exception { return Operation(src, key, Cipher.ENCRYPT_MODE); } /** * 解密 * * @param src * @return * @throws Exception */ public static String Decrypt(String src, String key) throws Exception { return Operation(src, key, Cipher.DECRYPT_MODE); } }

C#版本

using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptography; namespace Common { public class Encry { public Encry() { } #region AES加密 public static string Encrypt(string toEncrypt, string key) { if (key == null || key.Length != 16) { return "key不能为空并且需要16位长度"; } byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key); byte[] toEncryptArray = UTF8Encoding.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); //将+替换为%2B string resultArrayAfter = Convert.ToBase64String(resultArray, 0, resultArray.Length); resultArrayAfter = resultArrayAfter.Replace("+", "%2B"); return resultArrayAfter; } #endregion AES加密 #region AES解密 public static string Decrypt(string toDecrypt, string key) { //将%2B替换为+ toDecrypt = toDecrypt.Replace("%2B", "+"); byte[] keyArray = UTF8Encoding.UTF8.GetBytes(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 UTF8Encoding.UTF8.GetString(resultArray); } #endregion AES解密 } }
  • AES
    7 引用
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3195 引用 • 8215 回帖
  • C#
    29 引用 • 34 回帖 • 5 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...