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

时间:2012-11-22 19:18:34

标签: java php android encryption aes

我正在将iOS项目扩展到Android。我现有的应用程序使用AES加密系统通过PHP与服务器通信。

以下是我在PHP端使用的函数:

加密

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

解密

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

该过程的一般流程是:

  • md5哈希$key(无论如何将其降至16个字符)
  • Base64编码$string
  • 在ECB模式下使用128位AES / RIJNDAEL加密Base64'ed(无IV)
  • Base64加密数据并将其作为字符串返回。

解密的工作方式相同,但相反。

现在我只是在玩样品,但似乎没有多少运气。我使用该函数在PHP中加密了字符串"test""test"也是关键 - MD5到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代码使我的Java代码工作,因为我无法改变它(有其他代码使用不同的PHP代码段)。

1 个答案:

答案 0 :(得分:0)

感谢Duncan在评论中我发现问题出在我的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 "";
}