跨平台加解密一直就是一个坑,坑了一堆的程序猿,我内心是痛苦的。其实最佳方式就是给出双方加密前后的的字符串做对照,一目了然。
java加密代码:
//加密
public static String Encrypt3DES(String value,String key) throws Exception{
try {
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("UTF-8"), CRYPT_ALGORITHM);
Cipher cipher = Cipher.getInstance(CRYPT_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encryptedByte = cipher.doFinal(value.getBytes("UTF-8"));
byte[] encodedByte = UrlBase64.encode(encryptedByte);
return new String(encodedByte,"UTF-8");
} catch(Exception e) {
sysLog.error("PCThreeDESUtil.encrypt : encrypt was failed!", e);
throw e;
}
}
//解密
public static String Decrypt3Des(String value,String key) throws Exception {
try {
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("UTF-8"), CRYPT_ALGORITHM);
Cipher cipher = Cipher.getInstance(CRYPT_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decodedByte = UrlBase64.decode(value.getBytes("UTF-8"));
byte[] decryptedByte = cipher.doFinal(decodedByte);
return new String(decryptedByte,"UTF-8");
} catch(Exception e) {
sysLog.error("PCThreeDESUtil.decrypt : decrypt was failed!", e);
throw e;
}
}
注意:java的Base64和UrlBase64的区别
Base64算法最初用于电子邮件系统,后经演变成为显示传递Url参数的一种编码方法,将字符映射表中用作补位“=”换成“.”,并用“-”代替“+”,用“_”代替“/”。使得Base64编码符合Url参数规则,可以将二进制数据以Get方式进行传输。
C#代码:
/// <summary>
/// 加密
/// </summary>
/// <param name="a_strString"></param>
/// <param name="a_strKey">key3Des</param>
/// <returns></returns>
public static string Encrypt3DES(string a_strString, string a_strKey)
{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
DES.Key = Encoding.UTF8.GetBytes(a_strKey);
DES.Mode = CipherMode.ECB;
DES.Padding = PaddingMode.PKCS7;
ICryptoTransform DESEncrypt = DES.CreateEncryptor();
byte[] Buffer = Encoding.UTF8.GetBytes(a_strString);
string s= Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)).Replace('+', '-').Replace('/', '_').Replace('=','.');
return s;
}
/// <summary>
/// 解密
/// </summary>
/// <param name="a_strString"></param>
/// <param name="a_strKey">key3Des</param>
/// <returns></returns>
public static string Decrypt3DES(string a_strString, string a_strKey)
{
a_strString = a_strString.Replace('-', '+').Replace('_', '/').Replace('.','=');
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
DES.Key = Encoding.UTF8.GetBytes(a_strKey);
DES.Mode = CipherMode.ECB;
DES.Padding = PaddingMode.PKCS7;
ICryptoTransform DESDecrypt = DES.CreateDecryptor();
string result = "";
try
{
byte[] Buffer = Convert.FromBase64String(a_strString);
result = Encoding.UTF8.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}
catch (Exception e)
{
}
return result;
}
如果上面java使用的是Base64的编码。就把机密最后的Replace('+', '-').Replace('/', '_').Replace('=','.')去掉。解密同理。