2011-12-23 147 views
2

嗨我想解密我的PHP加密字符串。我的代碼是如何解密使用android的php加密字符串?

UsingPHP.java

import java.io.UnsupportedEncodingException; 
import java.util.ArrayList; 
import org.apache.http.NameValuePair; 
import org.json.JSONArray; 
import org.json.JSONObject; 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Base64; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class UsingPHP extends Activity { 
    TextView encrypt_txt1, encrypt_txt2, decrypt_txt1, decrypt_txt2; 
    Button decrypt_but; 
    String original_value = ""; 
    String encrypted_value = ""; 
    byte[] byteArray1; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.decrypt); 

     encrypt_txt1 = (TextView) findViewById(R.id.entv1); 
     encrypt_txt2 = (TextView) findViewById(R.id.entv2); 
     decrypt_txt1 = (TextView) findViewById(R.id.decrytv1); 
     decrypt_txt2 = (TextView) findViewById(R.id.decrytv2); 
     decrypt_but = (Button) findViewById(R.id.decrybt); 

     decrypt_but.setOnClickListener(new View.OnClickListener() {@Override 
      public void onClick(View v) { 
       try { 

        ArrayList <NameValuePair> postParameters = new ArrayList <NameValuePair>(); 
        String response = null; 

        response = CustomHttpClient.executeHttpPost(
         "http://10.0.2.2/cyrpt/encrypt.php", 
        postParameters); 
        String res = response.toString(); 
        System.out.println("HTTP Response comes here......."); 
        System.out.println(res); 

        JSONArray jArray = new JSONArray(res); 
        System.out.println("JSON Array created....."); 

        JSONObject json_data = null; 
        System.out.println("JSON data created......"); 
        for (int i = 0; i < jArray.length(); i++) { 
         System.out.println("values fetched from the database....."); 
         json_data = jArray.getJSONObject(i); 
         original_value = json_data.getString("value"); 
         encrypted_value = json_data.getString("encryptedvalue"); 
         encrypt_txt2.setText(encrypted_value); 
         System.out.println(original_value); 
         System.out.println(encrypted_value); 

        } 

        System.out.println("Decrypt button has been clicked"); 
        System.out.println("My encryption string is--->" + encrypted_value); 
        int encrypt_len = encrypted_value.length(); 
        System.out.println(encrypt_len); 

        try { 
         System.out.println("Encrypted values going to decrrypted......"); 
         byteArray1 = Base64.decode(encrypted_value, encrypt_len); 
         String decrypt = new String(byteArray1, "UTF-8"); 

         System.out.println("Values decrypted-->" + decrypt); 
         decrypt_txt2.setText(decrypt); 
        } catch (UnsupportedEncodingException e) { 
         e.printStackTrace(); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 

encrypt.php

<?php 
require_once("connection.php"); 
$value = 'malavika'; 
function encode5t($value1) 
{ 
    for ($i = 0; $i < 3; $i++) { 
     $value1 = strrev(base64_encode($value1)); 
    } 

    return $value1; 
} 

$myvalue = encode5t($value); 

$mydata = mysql_query("SELECT * FROM crypt"); 
while ($row = mysql_fetch_assoc($mydata)) 
    $sam = $row['value']; 
if ($sam != 'malavika') 
    $myinsert = mysql_query("insert into crypt values('" . $value . "','" . $myvalue . "')") or die(mysql_error()); 
$data = mysql_query("SELECT * FROM crypt"); 

while ($row = mysql_fetch_assoc($data)) 
    $output[] = $row; 
print(json_encode($output)); 
?> 

現在,我想我的解密android系統中加密值。但我得到以下警告:

12-23 10:27:19.343: WARN/System.err(609): java.lang.IllegalArgumentException: bad base-64 
    12-23 10:27:19.353: WARN/System.err(609):  at android.util.Base64.decode(Base64.java:161) 
    12-23 10:27:19.353: WARN/System.err(609):  at android.util.Base64.decode(Base64.java:136) 
    12-23 10:27:19.363: WARN/System.err(609):  at android.util.Base64.decode(Base64.java:118) 
    12-23 10:27:19.363: WARN/System.err(609):  at com.my.databaseconnection.UsingPHP$1.onClick(UsingPHP.java:76) 
    12-23 10:27:19.363: WARN/System.err(609):  at android.view.View.performClick(View.java:2485) 
    12-23 10:27:19.363: WARN/System.err(609):  at android.view.View$PerformClick.run(View.java:9080) 
12-23 10:27:19.363: WARN/System.err(609):  at android.os.Handler.handleCallback(Handler.java:587) 
12-23 10:27:19.373: WARN/System.err(609):  at android.os.Handler.dispatchMessage(Handler.java:92) 
12-23 10:27:19.373: WARN/System.err(609):  at android.os.Looper.loop(Looper.java:123) 
12-23 10:27:19.373: WARN/System.err(609):  at android.app.ActivityThread.main(ActivityThread.java:3647) 
12-23 10:27:19.383: WARN/System.err(609):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-23 10:27:19.383: WARN/System.err(609):  at java.lang.reflect.Method.invoke(Method.java:507) 
12-23 10:27:19.383: WARN/System.err(609):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-23 10:27:19.383: WARN/System.err(609):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-23 10:27:19.393: WARN/System.err(609):  at dalvik.system.NativeStart.main(Native Method) 

我該怎麼做?可能嗎?有人可以告訴我嗎?提前

+0

好像PHP和Java有'基64'的不同實現。 – Blender 2011-12-23 05:12:09

+0

它可能嗎?任何其他方式來實現這一目標? – malavika 2011-12-23 05:13:34

+1

'byteArray1 = Base64.decode(encrypted_value,encrypt_len);'< - ['Base64.decode']的第二個參數(http://developer.android.com/reference/android/util/Base64.html#decode% 28java.lang.String,%20int%29)不包含解碼方法的長度,而是標記。這可能會導致不同的結果,具體取決於字符串的大小。試試這個:'byteArray1 = Base64.decode(encrypted_value,Base64.DEFAULT)' – vstm 2011-12-23 05:46:12

回答

1

感謝那麼有兩件事情:

  1. encode5t函數返回無效的base64數據。如果我撥打encode5t("malavika"),則返回字符串==AUVVVeZhlQhdlRspnUsRW,這是無效的base64。 =符號是填充符號,只允許在base64字符串的末尾。我猜你想的是:

    function encode5t($value1) 
    { 
        for($i=0;$i<3;$i++) 
        { 
         $value1=base64_encode(strrev($value1)); 
        } 
    
        return $value1; 
    } 
    

    這意味着你只需要第一次調用strrev然後base64_encode。在解碼函數中,您首先調用base64_decode,然後調用strrev(或Java計數器部分)。

  2. 正如我在評論中所說的,在你的Java代碼中第二個參數爲Base64.decode需要base64處理的標誌,而不是字符串的長度。例如,這可能會打開URL_SAFE標誌,這使得它與PHP的base64_encode的輸出不兼容。

2

嗨,就這樣改變。

UsingPHP.java

try 
{ 
    System.out.println("Encrypted values going to decrypt......"); 
    byteArray1 = Base64.decode(encrypted_value, Base64.DEFAULT); 
    System.out.println(byteArray1); 
    String decrypt = new String(byteArray1, "UTF-8");         
    System.out.println("Values decrypted-->"+decrypt); 
    decrypt_txt2.setText(decrypt); 
} 

encrypt.php

<?php 
    require_once("connection.php"); 
    $value='dcplsoft'; 
    function encode5t($value1) 
    { 
    $value1=base64_encode($value1); // here you will get encrypted value 
return $value1; 
    } 
$myvalue=encode5t($value); 
    $mydata=mysql_query("SELECT * FROM crypt"); 
    while($row = mysql_fetch_assoc($mydata)) 
    $sam=$row['value']; 
    if($sam!='dcplsoft') 
    $myinsert=mysql_query("insert into crypt values('".$value."','".$myvalue."')") or die (mysql_error()); 
    $data = mysql_query("SELECT * FROM crypt"); 
while($row = mysql_fetch_assoc($data)) 
$output[]=$row; 
print(json_encode($output)); 
    ?>