2011-07-05 22 views
1

私はここでトリッキーな状況があります。私は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

答えて

1

をこのエラー:

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

は、問題が完全にコード内にないことを示しています(Base64.decodeBase64が見つからないため、おそらくApache Commons Codecライブラリを適切に配備していない可能性があります)。 (確かに、それは私が見に期待しているだろう正確にエラーではないのですが、私は、AndroidよりもデスクトップJavaへのより慣れている。)

しかし、あなたにも代わりにあなたが「couldnなぜワークアウトのAndroid's built-in Base64 classを使用する場合がありますApache Commons Codecを動作させます。

+0

こんにちはジョン、実際に私はそのapacheライブラリのいくつかのバージョンで試しました(私はApacheから何かがクラッシュするとは思われませんでした)、私はアンドロイドのbase64クラスを試してみましょう。ありがとう! – Jafet

+0

@Jafet:メソッド自体が失敗しているわけではありません。メソッドを見つけ出す*にもVMが失敗します。 –

+0

私はこの問題のための私の最終的な解決策を共有しています、私のブログに行く:http://jafetsanchez.com/post/7562162652/rijndael-on-c-and-java – Jafet

関連する問題