2012-08-23 44 views
2

我需要使用密鑰在android中加密某些文本。在PHP中的加密代碼看起來像這樣Android中的base64和mcrypt_encrypt

$this->securekey = hash('sha256',$textkey,TRUE); 
$this->iv = mcrypt_create_iv(32, MCRYPT_DEV_URANDOM); 
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB, $this->iv)); 

對於Base64的加我從apache.org(公地編解碼器1.6.jar)NetBeans中的公共編解碼器,我的Android應用程序。代碼中沒有錯誤。但是當我運行應用程序並調用使用編解碼器的函數時,應用程序會停止並需要關閉。

在logcat的說:

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

這裏是我的代碼:

public static String crypt(String input, String key){ 
      byte[] crypted = null; 
      try{ 
       SecretKeySpec skey = new SecretKeySpec(org.apache.commons.codec.binary.Base64.decodeBase64(key), "AES"); 
       Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
       cipher.init(Cipher.ENCRYPT_MODE, skey); 
       crypted = cipher.doFinal(input.getBytes()); 
      }catch(Exception e){ 
      } 
      return org.apache.commons.codec.binary.Base64.encodeBase64String(crypted); 
     } 

我不知道如果我的代碼做同樣的加密作爲PHP代碼。我發現Android和PHP之間的鏈接爲http://www.androidsnippets.com/encrypt-decrypt-between-android-and-php,但它不使用Base64,僅用於mcrypt_encrypt。任何人都可以幫助我獲得與PHP服務器相同的加密。

在此先感謝。

+0

首先,如果我的生活依賴於密碼相關的信息,我不會相信「android snippets」。可怕的東西。 –

回答

-1

您的錯誤僅僅是因爲您忘記將Apache編解碼器庫添加到運行時環境中。只是編纂它是不夠的;圖書館需要在Android設備上實際上目前

您無法使用默認Java庫在Android上獲得相同的加密,您可能需要Bouncy Castle庫。您示例中的PHP代碼使用Rijndael,塊大小爲32個字節。 AES是Rijndael的一個子集,塊大小爲16字節。這在PHP mcrypt中被稱爲MCRYPT_RIJNDAEL_128

其他一些實施細節:

  • 歐洲央行不使用IV(到現在爲止我已經換成更好的東西默認mcrypt_encrypt樣品);
  • mcrypt_encrypt不執行PKCS5Padding,我認爲它使用空格;
  • input.getBytes()不可移植,它使用平臺默認編碼,這可能與PHP編碼不同;

最後一些安全警告:

  • 只使用SHA-256的密碼上被認爲是不安全的,使用PBKDF2;
  • ECB被認爲不安全,使用CBC;
  • MCRYPT_DEV_URANDOM不安全(這基本上意味着PHP加密是毫無價值的,你最好使用PHP openssl包裝);

祝你好運!

+0

這個答案不幫你Gabrielle嗎?你需要更多信息? –

+0

我突然收到了-1這個答案。我不介意低估 - 即使是我不同意的低估 - 只要我清楚爲什麼會發生downvote。 –