如何用phpseclib加密并使用AES算法用java解密

时间:2015-04-09 00:07:38

标签: java encryption aes phpseclib

我必须在运行php脚本的服务器上加密数据,然后使用AES算法将它们发送到另一台运行Java的服务器。我选择分别为php和Java端使用phpseclib和javax.crypto包。 不幸的是有填充异常。这是我的代码:

在php方面:

$aes = new Crypt_AES('MODE_ECB');
$key = "secretkeyfor1234secretke";
$aes->setKey($key);
$plaintext = 'Good evening this is just a test';
$cryptedmessage =  base64_encode($aes->encrypt($plaintext));

在java方面:  clefAES包含密钥,数据包含加密文本。我使用RSA加密发送密钥(此处未报告)。

data = EFjTatx2VkAZR3ScS0UadQr8M6zEkIz/kAX0Cl+XH2FNNHVbeJsEd2b+zWlEkvR6;//( it is base64 encoded )
Cipher aescipher = Cipher.getInstance("AES/ECB/NoPadding", "SunJCE");
Key keySpec = new SecretKeySpec(clefAES, "AES");                   
byte[] encryptedTextByte = decoder.decodeBuffer(data);
aescipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decryptedByte = aescipher.doFinal(encryptedTextByte);
String decryptedText = new String(decryptedByte);

这是decryptedText给出的结果:

晚上好thicx #3mg ?我# Ԁ O q

如果有人知道我为什么会得到这个结果以及如何解决这个问题,那将非常有帮助。 phpseclib是否兼容javax.crypto包用于aes加密?这是我想要实现目标的最好方式吗?

1 个答案:

答案 0 :(得分:1)

以下是我从PHP代码中获得的输出:

GYQGpH6fRpHBP0ACElbcp1nvcS0ojcqzvnqclHxvB+BtgM4KEH+K7Q2F6rhEx0hM

这与您传递给Java代码的内容形成鲜明对比。

此外,您的PHP代码没有执行ECB模式。它正在进行CBC模式。这是因为new Crypt_AES('MODE_ECB');不是您需要使用的代码。相反,这是您需要用于执行ECB模式的代码:

new Crypt_AES(CRYPT_MODE_ECB);

此外,phpseclib默认正在填充。要禁用它,您需要执行以下操作:

$aes->disablePadding();

完成所有这些后,我将其作为输出:

GYQGpH6fRpHBP0ACElbcp9i8pjKf4G7wiPLDL7TM1Ec=