繁体   English   中英

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

[英]How to decrypt string (encrypted in .NET) in Java client using apache.commons.codec Base64?

我这里有一个棘手的情况。 我有一个用 C# 编写的 web 服务,它返回使用下述方法加密的 JSON 内容。 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

(我的环境是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";
        }
}

我的 Java function 使用 commons-codec-1.5.jar 是:

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: ERROR/AndroidRuntime(1270): java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.decodeBase64

这个错误:

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

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

但是,您不妨使用Android 的内置 Base64 class而不是找出无法让 Apache Commons Codec 工作的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM