2016-04-29 18 views
1

成功獲取正確的加密值,但面臨問題解密該值(已加密)。Android:無法解密值

:123456

Encrpted:ncSzDj4j8l44iM5qgaqHgA ==

爲什麼我得到java.lang.Exception的:[解密]無效INT: 「博」?

是否有任何解決方案/建議,將不勝感激。由於

MainActivity.java

import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.util.Log; 

    import java.net.URLDecoder; 

    public class MainActivity extends AppCompatActivity { 
     ApiCrypter3 apiCrypter; 

    //123456 
    //ncSzDj4j8l44iM5qgaqHgA== 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      apiCrypter = new ApiCrypter3(); 
      try { 
       byte[] encryptedRequest = this.apiCrypter.encrypt(value); 
       String EncryptStr = new String(encryptedRequest, "UTF-8"); 
       Log.e("ENCRYPTION: ", EncryptStr.toString()); 

       String res = new String(this.apiCrypter.decrypt(EncryptStr), "UTF-8"); 
       res = URLDecoder.decode(res, "UTF-8"); 
       Log.e("DECRYPTION: ", res.toString()); 

       } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

ApiCrypter3.java

package <your package name>; 

    import android.util.Base64; 
    import java.security.NoSuchAlgorithmException; 
    import javax.crypto.Cipher; 
    import javax.crypto.NoSuchPaddingException; 
    import javax.crypto.spec.IvParameterSpec; 
    import javax.crypto.spec.SecretKeySpec; 

    public class ApiCrypter3 { 

    private byte[] sessionKey = {your 16 character key}; //Where you get this from is beyond the scope of this post 
    private byte[] iv = {your 16 character value}; //Ditto 
    private IvParameterSpec ivspec; 
    private SecretKeySpec keyspec; 
    private Cipher cipher; 

    public ApiCrypter3() 
    { 
     ivspec = new IvParameterSpec(iv); 
     keyspec = new SecretKeySpec(sessionKey, "AES"); 

     try { 
      cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (NoSuchPaddingException e) { 
      e.printStackTrace(); 
     } 
    } 

    public byte[] encrypt(String text) throws Exception 
    { 
     if(text == null || text.length() == 0) { 
      throw new Exception("Empty string"); 
     } 
     byte[] encrypted = null; 
     try { 
      cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); 
      encrypted = Base64.encode(cipher.doFinal(text.getBytes("UTF-8")), Base64.DEFAULT); 
     } 
     catch (Exception e) { 
      throw new Exception("[encrypt] " + e.getMessage()); 
     } 
     return encrypted; 
    } 

    public byte[] decrypt(String code) throws Exception 
    { 
     if(code == null || code.length() == 0) { 
      throw new Exception("Empty string"); 
     } 
     byte[] decrypted = null; 
     try { 
      cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); 
      //decrypted = Base64.decode(cipher.doFinal(code.getBytes()),Base64.DEFAULT); 
      decrypted = Base64.decode(cipher.doFinal(hexToBytes(code)),Base64.DEFAULT); 
     } 
     catch (Exception e) { 
      throw new Exception("[decrypt] " + e.getMessage()); 
     } 
     return decrypted; 
    } 

    public static String bytesToHex(byte[] data) { 
     if (data==null) { 
      return null; 
     } 
     int len = data.length; 
     String str = ""; 
     for (int i=0; i<len; i++) { 
      if ((data[i]&0xFF)<16) { 
       str = str + "0" + Integer.toHexString(data[i]&0xFF); 
      } 
      else { 
       str = str + Integer.toHexString(data[i]&0xFF); 
      } 
     } 
     return str; 
    } 

    public static byte[] hexToBytes(String str) { 
     if (str==null) { 
      return null; 
     } 
     else if (str.length() < 2) { 
      return null; 
     } 
     else { 
      int len = str.length()/2; 
      byte[] buffer = new byte[len]; 
      for (int i=0; i<len; i++) { 
       //No effect 
       //buffer[i] = (byte) Integer.parseInt(str.substring(i*2,i*2+2),16); 
       buffer[i]=Integer.valueOf(str.substring(i*2,i*2+2),16).byteValue(); 
       } 
      return buffer; 
     } 
    } 
} 

日誌:

04-29 16:51:26.399 10918-10918/com.test.com.encrytiondecryption E/ENCRYPTION:: ncSzDj4j8l44iM5qgaqHgA== 
04-29 16:51:26.399 10918-10918/com.test.com.encrytiondecryption W/System.err: java.lang.Exception: [decrypt] Invalid int: "nc" 
04-29 16:51:26.399 10918-10918/com.test.com.encrytiondecryption W/System.err:  at com.test.com.encrytiondecryption.ApiCrypter3.decrypt(ApiCrypter3.java:64) 
04-29 16:51:26.399 10918-10918/com.test.com.encrytiondecryption W/System.err:  at com.test.com.encrytiondecryption.MainActivity.onCreate(MainActivity.java:41) 
+0

檢查我前面回答,我貼 – vishal

回答

1

看起來異常是由這條線在hexToBytes功能被拋出,然後在decrypt中捕獲並重新拋出:

buffer[i]=Integer.valueOf(str.substring(i*2,i*2+2),16).byteValue(); 

的問題是要傳遞到hexToBytes函數的字符串是Base64編碼的,它不是一個十六進制字符串,所以看完前兩個字符爲一個整數導致異常。

變化解密行這樣的:

decrypted = cipher.doFinal(Base64.decode(code,Base64.DEFAULT)); 

當你加密您要加密,然後Base64編碼,所以當你解密你應該這樣做相反的順序:然後Base64編碼解碼解密。

+0

它的作品。謝謝。 – vishal

2

做這個簡單的方法::

package com.encrytiondecryption; 

import android.util.Base64; 

import java.security.NoSuchAlgorithmException; 

import javax.crypto.Cipher; 
import javax.crypto.NoSuchPaddingException; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 


public class ApiCrypter5 { 
    byte[] sessionKey = {your 16 character key}; //Where you get this from is beyond the scope of this post 
    private byte[] iv = {your 16 character value }; //Ditto 
    private IvParameterSpec ivspec; 
    private SecretKeySpec keyspec; 
    private Cipher cipher; 

    public ApiCrypter5() { 
     ivspec = new IvParameterSpec(iv); 
     keyspec = new SecretKeySpec(sessionKey, "AES"); 

     try { 
      cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (NoSuchPaddingException e) { 
      e.printStackTrace(); 
     } 
    } 

    public String encrytData(String text) throws Exception { 

     cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); 

     byte[] results = cipher.doFinal(text.getBytes()); 

     return Base64.encodeToString(results, Base64.NO_WRAP | Base64.DEFAULT); 

    } 


    public String decryptData(String text) throws Exception { 
     byte[] encryted_bytes = Base64.decode(text, Base64.DEFAULT); 

     cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); 

     byte[] decrypted = cipher.doFinal(encryted_bytes); 

     return new String(decrypted); 

    } 

}