java,C#之间的ASE加密实现
程序员文章站
2024-03-14 14:25:40
...
工作中遇到不同导入导出的问题,而且导入导出都需要进行ASE加密和解密,所以整理一下这方面的资料,网上也有类似资料,但是很多可能不是你所需要的,而且有可能是错误的,以下代码经过运行测试,请放心使用
java环境:
- sdk 1.7
C#代码实现:
/// <summary>
/// AES 加密
/// </summary>
/// <param name="str"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string AesEncrypt(string str, string key,string iv)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = System.Text.Encoding.UTF8.GetBytes(str);
System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
{
Key = System.Text.Encoding.UTF8.GetBytes(key),
IV = Encoding.UTF8.GetBytes(iv),
Mode = System.Security.Cryptography.CipherMode.CBC,
Padding = System.Security.Cryptography.PaddingMode.PKCS7
};
System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
/// <summary>
/// AES 解密
/// </summary>
/// <param name="str"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string AesDecrypt(string str, string key,string iv)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = Convert.FromBase64String(str);
System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
IV = Encoding.UTF8.GetBytes(iv),
Mode = System.Security.Cryptography.CipherMode.CBC,
Padding = System.Security.Cryptography.PaddingMode.PKCS7
};
System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
Java代码实现:
public static String aesEncrypt(String str, String key,String iv) throws Exception {
if (str == null || key == null) return null;
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");#见注释
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES"),new IvParameterSpec(iv.getBytes("utf-8")));
byte[] bytes = cipher.doFinal(str.getBytes("utf-8"));
String res = new BASE64Encoder().encode(bytes);
return res.replace("\r\n", "");
}
public static String aesDecrypt(String str, String key,String iv) throws Exception {
try {
if (str == null || key == null) return null;
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES"),new IvParameterSpec(iv.getBytes("utf-8")));
byte[] bytes = new BASE64Decoder().decodeBuffer(str);
bytes = cipher.doFinal(bytes);
return new String(bytes);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
注释:
1、java中PKCS5Padding和PKCS7Padding是一样的,但是使用PKCS7Padding需要特殊处理,很多时候可能会调试不通过,建议直接使用PKCS5Padding
2、sun.misc.BASE64Decoder在使用的时候如果编译不通过,可以按照以下网址进行处理:
http://jingyan.baidu.com/article/f71d6037ad5b111ab741d166.html
3、第一次处理ASE加密、解密的时候,代码往往会报以下错误:
java.security.InvalidKeyException: Illegal key size
这是因为美国对软件出口的控制导致,可以按照以下网址内容进行处理:
http://blog.csdn.net/wangjunjun2008/article/details/50847426
运行结果测试:
经过确认,java加密后和C#加密后字符串内容一致,解密信息也完全一致
推荐阅读
-
java,C#之间的ASE加密实现
-
利用Filter实现服务之间的加密通讯
-
基于Java语言的国密SM2/SM3/SM4算法库 , 包含加密/解密、签名/验签、摘要计算的实现代码和测试方法 。
-
java、php分别实现兼容的3DES对称加密和解密
-
System.arraycopy()实现数组之间的复制 博客分类: java基础 System.arraycopy()
-
System.arraycopy()实现数组之间的复制 博客分类: java基础 System.arraycopy()
-
在Java中DES加密/解密的实现[工具类]
-
DES加密和解密的JAVA实现方式
-
Java后端实现MD5加密的方法
-
JAVA 的MD5加密算法简单实现 博客分类: java 算法JavaBeanSecurityJ#