私はここでトリッキーな状況があります。私はC#で書かれたWebサービスを持っており、以下に説明するメソッドで暗号化されたJSONのものを返します。このWebサービスはJavaクライアントによって消費されますが、私は文字列をクライアント側で解読できません。私はいつもこのエラーが出て以来、DESアルゴリズムを使っていくつかのJava関数のJavaの例を試しましたが、運がありません:apache.commons.codecを使用してJavaクライアントで文字列を暗号化(.NETで暗号化)する方法Base64?
java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.decodeBase64
(私の環境では、Eclipse、jdk1.6.0_26、Androidの2.1updateエミュレータです)
助けてください!
私のC#の機能は以下のとおりです。
コモンズ・コーデック-1.5.jarを使用して/// <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の機能は次のとおりです。
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
こんにちはジョン、実際に私はそのapacheライブラリのいくつかのバージョンで試しました(私はApacheから何かがクラッシュするとは思われませんでした)、私はアンドロイドのbase64クラスを試してみましょう。ありがとう! – Jafet
@Jafet:メソッド自体が失敗しているわけではありません。メソッドを見つけ出す*にもVMが失敗します。 –
私はこの問題のための私の最終的な解決策を共有しています、私のブログに行く:http://jafetsanchez.com/post/7562162652/rijndael-on-c-and-java – Jafet