Java NoClassDefFoundError:Decoder.base64 Android中的Decoder
我想在我的Android应用程序中解密加密的服务器响应。我在过去20天收到NoClassDefFoundError的异常。我不知道该怎么做,我按照build path、android tools->Add support library的所有步骤操作,还右键点击libs folder->import->Archive等,编译和测试完这个程序后,我直接得到以下错误:Java NoClassDefFoundError:Decoder.base64 Android中的Decoder,java,android,encryption,Java,Android,Encryption,我想在我的Android应用程序中解密加密的服务器响应。我在过去20天收到NoClassDefFoundError的异常。我不知道该怎么做,我按照build path、android tools->Add support library的所有步骤操作,还右键点击libs folder->import->Archive等,编译和测试完这个程序后,我直接得到以下错误: 01-21 14:49:28.280: E/dalvikvm(451): Could not find class 'Decoder
01-21 14:49:28.280: E/dalvikvm(451): Could not find class 'Decoder.BASE64Decoder', referenced from method com.json_to_server.W2i_EncryptDecrypt.decrypt
01-21 14:49:28.280: W/dalvikvm(451): VFY: unable to resolve new-instance 6 (LDecoder/BASE64Decoder;) in Lcom/json_to_server/W2i_EncryptDecrypt;
01-21 14:49:28.280: D/dalvikvm(451): VFY: replacing opcode 0x22 at 0x000f
01-21 14:49:28.280: D/dalvikvm(451): VFY: dead code 0x0011-0021 in Lcom/json_to_server/W2i_EncryptDecrypt;.decrypt (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
01-21 14:49:28.289: E/dalvikvm(451): Could not find class 'Decoder.BASE64Encoder', referenced from method com.json_to_server.W2i_EncryptDecrypt.encrypt
01-21 14:49:28.289: W/dalvikvm(451): VFY: unable to resolve new-instance 7 (LDecoder/BASE64Encoder;) in Lcom/json_to_server/W2i_EncryptDecrypt;
01-21 14:49:28.289: D/dalvikvm(451): VFY: replacing opcode 0x22 at 0x0017
01-21 14:49:28.289: D/dalvikvm(451): VFY: dead code 0x0019-001f in Lcom/json_to_server/W2i_EncryptDecrypt;.encrypt (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
01-21 14:49:28.289: E/dalvikvm(451): Could not find class 'Decoder.BASE64Decoder', referenced from method com.json_to_server.W2i_EncryptDecrypt.generateKeyFromString
01-21 14:49:28.289: W/dalvikvm(451): VFY: unable to resolve new-instance 6 (LDecoder/BASE64Decoder;) in Lcom/json_to_server/W2i_EncryptDecrypt;
01-21 14:49:28.289: D/dalvikvm(451): VFY: replacing opcode 0x22 at 0x0000
01-21 14:49:28.289: D/dalvikvm(451): VFY: dead code 0x0002-0010 in Lcom/json_to_server/W2i_EncryptDecrypt;.generateKeyFromString (Ljava/lang/String;)Ljava/security/Key;
01-21 14:49:28.299: W/dalvikvm(451): threadid=9: thread exiting with uncaught exception (group=0x40015560)
01-21 14:49:28.299: E/AndroidRuntime(451): FATAL EXCEPTION: AsyncTask #1
01-21 14:49:28.299: E/AndroidRuntime(451): java.lang.RuntimeException: An error occured while executing doInBackground()
01-21 14:49:28.299: E/AndroidRuntime(451): at android.os.AsyncTask$3.done(AsyncTask.java:200)
01-21 14:49:28.299: E/AndroidRuntime(451): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
01-21 14:49:28.299: E/AndroidRuntime(451): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
01-21 14:49:28.299: E/AndroidRuntime(451): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
01-21 14:49:28.299: E/AndroidRuntime(451): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
01-21 14:49:28.299: E/AndroidRuntime(451): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
01-21 14:49:28.299: E/AndroidRuntime(451): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
01-21 14:49:28.299: E/AndroidRuntime(451): at java.lang.Thread.run(Thread.java:1019)
01-21 14:49:28.299: E/AndroidRuntime(451): Caused by: java.lang.NoClassDefFoundError: Decoder.BASE64Decoder
01-21 14:49:28.299: E/AndroidRuntime(451): at com.json_to_server.W2i_EncryptDecrypt.generateKeyFromString(W2i_EncryptDecrypt.java:81)
01-21 14:49:28.299: E/AndroidRuntime(451): at com.json_to_server.W2i_EncryptDecrypt.decrypt(W2i_EncryptDecrypt.java:53)
01-21 14:49:28.299: E/AndroidRuntime(451): at com.json_to_server.EncryptDecrypt_Demo.POST(EncryptDecrypt_Demo.java:215)
01-21 14:49:28.299: E/AndroidRuntime(451): at com.json_to_server.EncryptDecrypt_Demo$HttpAsyncTask.doInBackground(EncryptDecrypt_Demo.java:410)
01-21 14:49:28.299: E/AndroidRuntime(451): at com.json_to_server.EncryptDecrypt_Demo$HttpAsyncTask.doInBackground(EncryptDecrypt_Demo.java:1)
01-21 14:49:28.299: E/AndroidRuntime(451): at android.os.AsyncTask$2.call(AsyncTask.java:185)
01-21 14:49:28.299: E/AndroidRuntime(451): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
01-21 14:49:28.299: E/AndroidRuntime(451): ... 4 more
这是活动代码
static String key="Dyv6ACIDe2q+OEjztjfNDw==";
static String RequestId=null;
static String RequestCode="001";
static String stringChannelId="MobileWeb";
static String strIpAddress = "35435646";
static String strStatusFlag="true";
static String strUserName="vikas.k1086@gmail.com";
static String strPwd="password1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mcrypt = new EncodeDecodeAES();
try
{
System.out.println("Encrypted Password = ");
computeMD5Hash(strPwd);
System.out.println("*****************************************************************");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
tvIsConnected = (TextView) findViewById(R.id.tvIsConnected);
btnPost = (Button) findViewById(R.id.btnPost);
btnPost.setOnClickListener(this);
public static String POST(String url)
{
String result = "";
try
{
int randomNum = generateUniqueId();
RequestId =System.currentTimeMillis()+""+randomNum;
HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
String json = "";
JSONObject jsonObject = new JSONObject();
jsonObject.put(KEY_REQUEST_ID,RequestId);
jsonObject.put(KEY_CHANNEL_ID, stringChannelId);
jsonObject.put(KEY_REQUEST_CODE,RequestCode);
jsonObject.put(KEY_IP_ADDRESS,strIpAddress);
jsonObject.put(KEY_USERNAME, strUserName);
jsonObject.put(KEY_PASSWORD, strPassword);
jsonObject.put(KEY_STATUS_FLAG, strStatusFlag);
json = jsonObject.toString();
System.out.println("json = " + json );
String encrypted = SimpleCrypto.encrypt(json, key);
System.out.println("Encrypted String = " + encrypted);
System.out.println("*****************************************************************");
JSONObject inner = new JSONObject();
inner.put(KEY_VENDOR_ID, "1");
inner.put(KEY_REQUEST, encrypted);
JSONObject outer = new JSONObject();
outer.put("W2INBCWS", inner);
JSONObject json2 = new JSONObject();
json2.put("W2INBCWS", outer);
JSONObject json3 = new JSONObject();
json3.put("W2IWSImplPort", json2);
JSONObject json4 = new JSONObject();
json4.put("W2IWSImplService", json3);
System.out.println("strjson = " + json4.toString());
String strjson = "";
strjson=outer.toString();
System.out.println("strjson = " + strjson);
System.out.println("*****************************************************************");
StringEntity se = new StringEntity(strjson);
httpPost.setEntity(se);
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
HttpResponse httpResponse = httpclient.execute(httpPost);
BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
result = sb.toString();
String jsonString = result;
jsonString=jsonString.replace("true", "\"true\"");
System.out.println("jsonString Values = " + result);
System.out.println("*****************************************************************");
JSONObject finalResult = new JSONObject(jsonString);
String strResponse=finalResult.getString("Response").replace("\n'","").replace("\'", "").replace("+", "").replace("//", "");
System.out.println("strResponse = "+ strResponse);
Base64_Act.decode(strResponse);
System.out.println("strResponse = "+ Base64_Act.decode(strResponse));
}
catch (Exception e)
{
e.printStackTrace();
}
return result;
}
public boolean isConnected(){
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Activity.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected())
return true;
else
return false;
}
@Override
public void onClick(View view) {
switch(view.getId())
{
case R.id.btnPost:
new HttpAsyncTask().execute("http://www.window2india.com/cms/json/w2iWS");
Toast.makeText(getBaseContext(), "Data Sent SUccesfully !!!!", Toast.LENGTH_LONG).show();
break;
}
}
private class HttpAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
return POST(urls[0]);
}
protected void onPostExecute(String result)
{
Toast.makeText(getBaseContext(), "Data Sent!", Toast.LENGTH_LONG).show();
}
}
private static String convertInputStreamToString(InputStream inputStream) throws IOException{
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
String line = "";
String result = "";
while((line = bufferedReader.readLine()) != null)
result += line;
inputStream.close();
return result;
}
public static int generateUniqueId()
{
Random randomGenerator = new Random();
int randomInt = randomGenerator.nextInt(50);
randomInt +=10;
return randomInt;
}
private static String convertToHex(byte[] data) throws java.io.IOException
{
StringBuffer sb = new StringBuffer();
String hex=null;
hex=Base64.encodeToString(data, 0, data.length, NO_OPTIONS);
sb.append(hex);
return sb.toString();
}
public void computeMD5Hash(String password)
{
try {
// Create MD5 Hash
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
digest.update(password.getBytes());
byte messageDigest[] = digest.digest();
StringBuffer MD5Hash = new StringBuffer();
for (int i = 0; i < messageDigest.length; i++)
{
String h = Integer.toHexString(0xFF & messageDigest[i]);
while (h.length() < 2)
h = "0" + h;
MD5Hash.append(h);
}
System.out.println("MD5 hash generated is: " + " " + MD5Hash);
strPassword = MD5Hash.toString();
System.out.println(strPassword);
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
}
static String key=“Dyv6ACIDe2q+OEjztjfNDw==”;
静态字符串RequestId=null;
静态字符串RequestCode=“001”;
静态字符串stringChannelId=“MobileWeb”;
静态字符串strIpAddress=“35435646”;
静态字符串strStatusFlag=“true”;
静态字符串strUserName=“vikas。k1086@gmail.com";
静态字符串strPwd=“password1”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mcrypt=new EncodeDecodeAES();
尝试
{
System.out.println(“加密密码=”);
computeMD5Hash(strPwd);
System.out.println(“****************************************************************************************************************”);
}
捕获(例外e)
{
//TODO自动生成的捕捉块
e、 printStackTrace();
}
tvIsConnected=(TextView)findViewById(R.id.tvIsConnected);
btnPost=(按钮)findViewById(R.id.btnPost);
btnPost.setOnClickListener(此);
公共静态字符串POST(字符串url)
{
字符串结果=”;
尝试
{
int randomNum=generateUniqueId();
RequestId=System.currentTimeMillis()+“”+randomNum;
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(url);
字符串json=“”;
JSONObject JSONObject=新的JSONObject();
jsonObject.put(KEY\u REQUEST\u ID,RequestId);
jsonObject.put(KEY\u CHANNEL\u ID,stringChannelId);
jsonObject.put(键请求代码,请求代码);
jsonObject.put(密钥IP地址、条带地址);
jsonObject.put(KEY_用户名,strUserName);
jsonObject.put(关键字密码,strPassword);
jsonObject.put(键状态标志,strStatusFlag);
json=jsonObject.toString();
System.out.println(“json=“+json”);
String encrypted=SimpleCrypto.encrypt(json,密钥);
System.out.println(“加密字符串=”+加密);
System.out.println(“****************************************************************************************************************”);
JSONObject inner=新的JSONObject();
内部。put(关键供应商ID,“1”);
内部.put(密钥请求,加密);
JSONObject outer=新的JSONObject();
外部放置(“W2INBCWS”,内部);
JSONObject json2=新的JSONObject();
json2.put(“W2INBCWS”,外部);
JSONObject json3=新的JSONObject();
json3.put(“w2iwsimport”,json2);
JSONObject json4=新的JSONObject();
json4.put(“W2IWSImplService”,json3);
System.out.println(“strjson=“+json4.toString());
字符串strjson=“”;
strjson=outer.toString();
System.out.println(“strjson=“+strjson”);
System.out.println(“****************************************************************************************************************”);
StringEntity se=新的StringEntity(strjson);
httpPost.setEntity(se);
setHeader(“接受”、“应用程序/json”);
setHeader(“内容类型”、“应用程序/json”);
HttpResponse HttpResponse=httpclient.execute(httpPost);
BufferedReader=新的BufferedReader(新的InputStreamReader(httpResponse.getEntity().getContent(),“UTF-8”),8);
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null)
{
sb.追加(第+行“\n”);
}
结果=sb.toString();
字符串jsonString=result;
jsonString=jsonString.replace(“true”,“true”);
System.out.println(“jsonString value=“+result”);
System.out.println(“****************************************************************************************************************”);
JSONObject finalResult=新的JSONObject(jsonString);
字符串strResponse=finalResult.getString(“响应”)。替换(“\n”“”)。替换(“\”,”)。替换(“+”,”)。替换(“/”,”);
System.out.println(“strResponse=“+strResponse”);
Base64_动作解码(strResponse);
System.out.println(“strResponse=“+Base64_Act.decode(strResponse));
}
捕获(例外e)
{
e、 printStackTrace();
}
返回结果;
}
公共布尔值未连接(){
ConnectivityManager connMgr=(ConnectivityManager)getSystemService(Activity.CONNECTIVITY_服务);
NetworkInfo NetworkInfo=connMgr.getActiveNetworkInfo();
if(networkInfo!=null&&networkInfo.isConnected())
返回true;
其他的
返回false;
}
@凌驾
公共void onClick(视图){
开关(view.getId())
{
案例R.id.btnPost:
新建HttpAsyncTask()。执行(“http://www.window2india.com/cms/json/w2iWS");
Toast.makeText(getBaseContext(),“数据成功发送!!!!”,Toast.LENGTH\u LONG.show();
打破
}
}
私有类HttpAsyncTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…URL){
返回
public class SimpleCrypto
{
public static String decrypt1(String seed, String encrypted) throws Exception
{
byte[] keyb = seed.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(keyb);
SecretKeySpec skey = new SecretKeySpec(thedigest, "AES/CBC/ZeroBytePadding");
//SecretKeySpec skey = new SecretKeySpec(thedigest, "AES/ECB/PKCS7Padding");
Cipher dcipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
dcipher.init(Cipher.DECRYPT_MODE, skey);
byte[] clearbyte = dcipher.doFinal(toByte(encrypted));
return new String(clearbyte);
}
public static byte[] toByte1(String hexString)
{
int len = hexString.length()/2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++)
result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
return result;
}
public static String encrypt(String seed, String cleartext) throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] result = encrypt(rawKey, cleartext.getBytes());
return toHex(result);
}
public static String decrypt(String seed, String hexStr) throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] enc = toByte(hexStr);
byte[] result = decrypt(rawKey, enc);
return new String(result);
}
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(seed);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}
private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
// Cipher cipher = Cipher.getInstance("AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}
//SecretKeySpec(thedigest, "AES/CBC/ZeroBytePadding");
public static String toHex(String txt) {
return toHex(txt.getBytes());
}
public static String fromHex(String hex) {
return new String(toByte(hex));
}
public static byte[] toByte(String hexStr) {
int len = hexStr.length()/2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++)
result[i] = Integer.valueOf(hexStr.substring(2*i, 2*i+2), 16).byteValue(); //2 * i, 2 * i + 2
return result;
}
public static String toHex(byte[] buf) {
if (buf == null)
return "";
StringBuffer result = new StringBuffer(2*buf.length);
for (int i = 0; i < buf.length; i++) {
appendHex(result, buf[i]);
}
return result.toString();
}
private final static char[] HEX = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
private static void appendHex(StringBuffer sb, byte b) {
sb.append(HEX.length).append(HEX.length);
}
}