在Android应用和PHP脚本之间发送加密数据

时间:2015-06-27 13:58:39

标签: php android encryption encoding

我尝试将加密数据从我的Android应用程序发送到解密数据的PHP脚本。

在android中我使用以下加密方法:

public String encryptAES(String key, String mdp) throws NoSuchPaddingException, NoSuchAlgorithmException {
    byte[] skey = key.getBytes();
    byte[] pwd = mdp.getBytes();
    byte[] encrypted = null;
    SecretKeySpec secretKeySpec = new SecretKeySpec(skey, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    try {
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    }
    try {
        encrypted = cipher.doFinal(pwd);
    } catch (IllegalBlockSizeException | BadPaddingException e) {
        e.printStackTrace();
    }
    return Arrays.toString(Base64.encode(encrypted, Base64.DEFAULT));
}

我用它在PHP中解密:

$data = mcrypt_decrypt(MCRYPT_RIJNADEAL_128, $key, $cipherText, MCRYPT_MODE_ECB);

问题是它没有解密到PHP中想要的纯文本。

1 个答案:

答案 0 :(得分:0)

Arrays#toString()返回包含[]和逗号的数组表示形式。您可以通过Base64 class

直接获取Base 64编码的字符串
return Base64.encodeToString(encrypted, Base64.DEFAULT);

在PHP中,您需要在使用前解密密文

$cipherText = base64_decode($cipherText);

要确保使用相同的操作模式,您需要提供完整的密码字符串(提供程序可能具有不同的默认值,因此您需要自己指定它以防止出现问题):

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

在PHP中使用相同的填充(PKCS#5 / PKCS#7填充是相同的)(仅提供ZeroPadding)。 This answer为此提供了代码。

进一步的安全考虑

不要使用ECB模式。这是非常不安全的。使用随机IV至少使用CBC模式。 IV不必是秘密的,因此您可以在编码和发送之前简单地将其添加到密文。 IV可以在解密之前切掉并用于解密。

为了使其更安全,您应该验证您的密文。这可以使用像GCM这样的身份验证模式,也可以使用像HMAC-SHA256这样具有强MAC的加密然后MAC方案。