![](/img/trans.png)
[英]How to encrypt / decrypt a number into a string without using Base64
[英]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.