我尝试将加密数据从我的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中想要的纯文本。
答案 0 :(得分:0)
Arrays#toString()
返回包含[
,]
和逗号的数组表示形式。您可以通过Base64 class:
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方案。