如何使用apache.commons.codec Base64在Java客户端中解密字符串(在.NET中加密)?
我这里的情况很棘手。我有一个用 C# 编写的 Web 服务,它返回使用下面描述的方法加密的 JSON 内容。该 Web 服务由 Java 客户端使用,但我无法在客户端解密我的字符串,我尝试了使用 DES 算法的 Java 函数的几个 Java 示例,但没有运气,因为我总是收到此错误:
java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.decodeBase64
(我的环境是Eclipse,jdk1.6.0_26,Android 2.1update模拟器)
请帮忙!
我的 C# 函数是:
/// <summary>
///
/// </summary>
/// <param name="stringToEncrypt"></param>
/// <returns></returns>
public static string Encrypt(string stringToEncrypt)
{
try
{
const string key1 = "MY KEY HERE";
byte[] iv = { Convert.ToByte("1"), Convert.ToByte("4"), Convert.ToByte("6"), Convert.ToByte("8"), Convert.ToByte("0"), Convert.ToByte("2"), Convert.ToByte("4"), Convert.ToByte("8") };
byte[] key = Encoding.UTF8.GetBytes(key1);
var des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
var ms = new MemoryStream();
var cs = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
catch (Exception ex)
{
Logger.Write(new ExceptionLogEntry(ex.ToString()));
}
return null;
}
/// <summary>
///
/// </summary>
/// <param name="stringToDecrypt"></param>
/// <returns></returns>
public static string Decrypt(string stringToDecrypt)
{
try
{
const string key1 = "MY KEY HERE";
byte[] iv = { Convert.ToByte("1"), Convert.ToByte("4"), Convert.ToByte("6"), Convert.ToByte("8"), Convert.ToByte("0"), Convert.ToByte("2"), Convert.ToByte("4"), Convert.ToByte("8") };
byte[] key = Encoding.UTF8.GetBytes(key1);
var des = new DESCryptoServiceProvider();
byte[] inputByteArray = Convert.FromBase64String(stringToDecrypt);
var ms = new MemoryStream();
var cs = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
var encoding = Encoding.UTF8;
return encoding.GetString(ms.ToArray());
}
catch(Exception ex)
{
Logger.Write(new ExceptionLogEntry(ex.ToString()));
return "-1";
}
}
我使用 commons-codec-1.5.jar 的 Java 函数是:
KeySpec ks = new DESKeySpec("MY KEY HERE".getBytes("UTF-8"));
SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(ks);
IvParameterSpec iv = new IvParameterSpec(Hex.decodeHex("1234567890ABCDEF".toCharArray()));
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, iv);
byte[] decoded = cipher.doFinal(Base64.decodeBase64("MY ENCRYPTED STRING HERE"));
Log.e(TAG, "DECODED->" + new String(decoded, "UTF-8"));
但我总是收到此错误:
07-05 04:48:20.822: 错误/AndroidRuntime(1270): java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.decodeBase64
I have a tricky situation here. I have a web service written in C# and it returns JSON stuff encrypted with the methods described below. This web service is consumed by a Java client, but I'm not able to get my string decrypted in client side, I've tried several Java examples of Java functions using DES algorithm but no luck since I always got this error:
java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.decodeBase64
(My environment is Eclipse, jdk1.6.0_26, Android 2.1update emulator)
Please help!!
My C# functions are:
/// <summary>
///
/// </summary>
/// <param name="stringToEncrypt"></param>
/// <returns></returns>
public static string Encrypt(string stringToEncrypt)
{
try
{
const string key1 = "MY KEY HERE";
byte[] iv = { Convert.ToByte("1"), Convert.ToByte("4"), Convert.ToByte("6"), Convert.ToByte("8"), Convert.ToByte("0"), Convert.ToByte("2"), Convert.ToByte("4"), Convert.ToByte("8") };
byte[] key = Encoding.UTF8.GetBytes(key1);
var des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
var ms = new MemoryStream();
var cs = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
catch (Exception ex)
{
Logger.Write(new ExceptionLogEntry(ex.ToString()));
}
return null;
}
/// <summary>
///
/// </summary>
/// <param name="stringToDecrypt"></param>
/// <returns></returns>
public static string Decrypt(string stringToDecrypt)
{
try
{
const string key1 = "MY KEY HERE";
byte[] iv = { Convert.ToByte("1"), Convert.ToByte("4"), Convert.ToByte("6"), Convert.ToByte("8"), Convert.ToByte("0"), Convert.ToByte("2"), Convert.ToByte("4"), Convert.ToByte("8") };
byte[] key = Encoding.UTF8.GetBytes(key1);
var des = new DESCryptoServiceProvider();
byte[] inputByteArray = Convert.FromBase64String(stringToDecrypt);
var ms = new MemoryStream();
var cs = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
var encoding = Encoding.UTF8;
return encoding.GetString(ms.ToArray());
}
catch(Exception ex)
{
Logger.Write(new ExceptionLogEntry(ex.ToString()));
return "-1";
}
}
My Java function using commons-codec-1.5.jar is:
KeySpec ks = new DESKeySpec("MY KEY HERE".getBytes("UTF-8"));
SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(ks);
IvParameterSpec iv = new IvParameterSpec(Hex.decodeHex("1234567890ABCDEF".toCharArray()));
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, iv);
byte[] decoded = cipher.doFinal(Base64.decodeBase64("MY ENCRYPTED STRING HERE"));
Log.e(TAG, "DECODED->" + new String(decoded, "UTF-8"));
But I always got this error:
07-05 04:48:20.822: ERROR/AndroidRuntime(1270): java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.decodeBase64
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
此错误:
表明问题根本不(必然)出现在您的代码中 - 它找不到
Base64.decodeBase64
,因此您可能没有正确部署 Apache Commons Codec 库。 (诚然,这并不是我期望看到的错误,但我更习惯桌面 Java,而不是 Android。)但是,您也可以使用 Android 的内置 Base64 类 而不是找出为什么您无法让 Apache Commons Codec 工作。
This error:
shows that the problem isn't (necessarily) in your code at all - it can't find
Base64.decodeBase64
, so you're probably not deploying the Apache Commons Codec library properly. (Admittedly it's not exactly the error I'd have expected to see, but I'm more used to desktop Java than Android.)However, you might as well use Android's built-in Base64 class instead of working out why you couldn't get Apache Commons Codec to work.