Как расшифровать строку (зашифрованную в .NET) в клиенте Java, используя apache.commons.codec Base64? - PullRequest
1 голос
/ 05 июля 2011

У меня тут сложная ситуация. У меня есть веб-сервис, написанный на C #, и он возвращает JSON-данные, зашифрованные с помощью методов, описанных ниже. Этот веб-сервис используется Java-клиентом, но я не могу расшифровать мою строку на стороне клиента, я пробовал несколько примеров Java-функций с использованием алгоритма DES, но не повезло, поскольку я всегда получал эту ошибку:

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

(Моя среда - Eclipse, jdk1.6.0_26, эмулятор обновления Android 2.1)

Пожалуйста, помогите !!

Мои функции на 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-функция, использующая 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: ОШИБКА / AndroidRuntime (1270): java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.decodeBase64

1 Ответ

1 голос
/ 05 июля 2011

Эта ошибка:

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

показывает, что проблема (не обязательно) в вашем коде вообще - она ​​не может найти Base64.decodeBase64, поэтому вы, вероятно, неправильно развертываете библиотеку кодеков Apache Commons. (Правда, это не точно ошибка, которую я ожидал увидеть, но я больше привык к настольной Java, чем к Android.)

Однако вы могли бы также использовать встроенный в Android класс Base64 вместо того, чтобы понять, почему вы не можете заставить работать кодек Apache Commons.

...