如何使用apache.commons.codec Base64在Java客户端中解密字符串(在.NET中加密)?

发布于 2024-11-18 14:31:26 字数 3424 浏览 4 评论 0原文

我这里的情况很棘手。我有一个用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

云巢 2024-11-25 14:31:26

此错误:

java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.decodeBase64

表明问题根本不(必然)出现在您的代码中 - 它找不到 Base64.decodeBase64,因此您可能没有正确部署 Apache Commons Codec 库。 (诚​​然,这并不是我期望看到的错误,但我更习惯桌面 Java,而不是 Android。)

但是,您也可以使用 Android 的内置 Base64 类 而不是找出为什么您无法让 Apache Commons Codec 工作。

This error:

java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.decodeBase64

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文