在Android上围绕现有PHP系统实施AES加密/解密

I'm expanding an iOS project over to Android. My existing application communicates with a server via PHP using an AES encryption system.

Here are the functions that I am using on the PHP side:

Encrypt

function cryptAESEncrypt($string,$key) {
    $key = md5($key);
    $iv = "1234567890123436"; //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);
}

Decrypt

function cryptAESDecrypt($string,$key) {
    $key = md5($key);
    $iv = "1234567890123436"; //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);
}

The general flow of the process is:

  • md5 hash the $key (brings it down to 16 characters regardless)
  • Base64 Encode the $string
  • Encrypt the Base64'ed using 128Bit AES/RIJNDAEL in ECB mode (no IV)
  • Base64 the encrypted data and returns it as a string.

The decryption works the same but in reverse.

Now I'm just playing with samples but don't seem to be having much luck. I've encrypted the string "test" in PHP using that function ("test" was the key too - MD5'ed to 098f6bcd4621d373cade4e832627b4f6) and I am given the output of "ijzLe/2WgbaP+n3YScQSgQ==".

Now what I tried in Java didn't work as I get an incorrect key length error but I had more luck with a previous snippet earlier. Here's what I had anyway:

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);

As I said though, that doesn't work. Now my question is, is there anybody that can help me make my Java code work with the supplied PHP code as I can't change that (had other code working using different PHP snippets).

Thanks to Duncan in the comments I found out the issue was with my MD5 hash function..

Found a working version for reference:

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 "";
}