2012-11-22 61 views
3

我正在將iOS項目擴展到Android。我現有的應用程序使用AES加密系統通過PHP與服務器進行通信。在Android上圍繞現有的PHP系統實現AES加密/解密

下面是我使用的PHP端的功能:

加密

function cryptAESEncrypt($string,$key) { 
    $key = md5($key); 
    $iv = "123456789"; //IV isn't needed if MCRYPT_MODE is ECB (What we are using) 
    $data = $data = base64_encode($string); 
    $algorythm = MCRYPT_RIJNDAEL_128; 
    $mode = MCRYPT_MODE_ECB; 

    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$data,MCRYPT_MODE_ECB,$iv); 

    return base64_encode($encrypted); 
} 

解密

function cryptAESDecrypt($string,$key) { 
    $key = md5($key); 
    $iv = "123456789"; //IV isn't needed if MCRYPT_MODE is ECB (What we are using) 
    $data = base64_decode($string); 
    $algorythm = MCRYPT_RIJNDAEL_128; 
    $mode = MCRYPT_MODE_ECB; 

    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$key,$data,MCRYPT_MODE_ECB,$iv); 

    return base64_decode($decrypted); 
} 

過程的一般流程是:

  • MD5哈希的$key(帶來它下降到無論16個字符)
  • Base64編碼利用128位AES/RIJNDAEL算法在ECB模式(無IV)
  • Base64的加密的數據中$string
  • 加密Base64'ed並以字符串形式返回。

解密工作原理相同,但是相反。

現在我只是玩樣品,但似乎沒有多少運氣。我已經使用該函數在PHP中對字符串"test"進行了加密("test"也是關鍵 - MD5'ed爲098f6bcd4621d373cade4e832627b4f6),我給出了"ijzLe/2WgbaP+n3YScQSgQ=="的輸出。

現在我在Java中嘗試過的方法沒有工作,因爲我得到的密鑰長度錯誤不正確,但之前的代碼片段中有更多的運氣。這是我無論如何:

String key = "test"; 
String in = "ijzLe/2WgbaP+n3YScQSgQ=="; 

SecretKeySpec skeySpec = new SecretKeySpec(md5(key).getBytes(), "AES"); 

Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); 
cipher.init(Cipher.DECRYPT_MODE, skeySpec); 

byte[] encryptedByteArray = Base64.decode(in.getBytes(),0); 
byte[] decryptedByteArray = cipher.doFinal(encryptedByteArray); 
String decryptedData = new String(Base64.decode(decryptedByteArray, 0)); 

Log.v("NOTE","Data: "+decryptedData); 

正如我說的那樣,這是行不通的。現在我的問題是,有沒有人可以幫助我使用所提供的PHP代碼工作,因爲我無法改變它(其他代碼使用不同的PHP代碼片段)。

+0

爲什麼要使用加密可言,如果你不」使用安全加密? – CodesInChaos

+1

請運行Java示例時獲取堆棧跟蹤。另外,請顯示你的'md5'方法。 –

+0

啊!謝謝!這是MD5功能丟失了零給出一個不正確的鍵! – liamnichols

回答

0

由於鄧肯在評論中我發現了問題是我的MD5哈希函數..

找到一個工作版本以供參考:

public String md5(String s) { 
    if (s != null) 
    { 
     try { // Create MD5 Hash 
      MessageDigest digest = java.security.MessageDigest .getInstance("MD5"); 
      digest.update(s.getBytes()); 
      byte messageDigest[] = digest.digest(); 

      // Create Hex String 
      StringBuffer hexString = new StringBuffer(); 
      for (int i = 0; i < messageDigest.length; i++) { 
       String h = Integer.toHexString(0xFF & messageDigest[i]); 
       while (h.length() < 2) 
        h = "0" + h; 
       hexString.append(h); 
      } 
      return hexString.toString(); 

     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } 
     return ""; 
    } 
    return ""; 
}