从Java加密并在PHP中解密(RIJNDAEL)

时间:2016-05-10 10:27:44

标签: java php rijndael

我必须从Java桌面应用程序和Android应用程序连接到Web服务。我需要发送使用RIJNDAEL加密的登录信息,但我遇到了问题。

Java代码:

public static String getEncryptedLogin(String loginID, String encryptionKey) {
    byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "RIJNDAEL");

    AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
    byte[] result = cipher.doFinal(loginID.getBytes("UTF-8"));
    return Base64.getEncoder().encodeToString(result);
}

并且这样称呼。

String dataToSend = "login="+Testencrypted.getEncryptedLogin(LOGIN,WS_ENCKEY)+"&language=en";

在WS_ENCKEY上是一个带密钥(32chars)的字符串,用于加密。

当我执行Java代码时,我得到一个异常错误"非法密钥大小",所以在读完本网站的其他帖子后,RIJNDAEL需要一个128位密钥,所以我改变了我称之为加密的方式

的方法
String dataToSend = "login="+Testencrypted.getEncryptedLogin(LOGIN,WS_ENCKEY.substring(0,16))+"&language=en";

在服务器端,我有这个解密的PHP代码:

<?php
class Encrypter {
    public static function encrypt($text,$key) {
        $textenc = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_ECB);
        return base64_encode($textenc);
    }
    public static function decrypt($text,$key) {
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_ECB));
    }
}

在服务器中我收到正确的数据,但是当我尝试解密登录时,输出不一样。

我无法更改服务器端的代码,你能帮助我吗?

1 个答案:

答案 0 :(得分:0)

PHP mcrypt不支持PKCS5填充,只支持空填充。您必须在Java中选择无填充,并将加密时的输入数据填充为块大小的倍数,并在Java中删除解密时的空值。

PHP mcrypt服务器代码使用的ECB模式不安全,要兼容Java还需要指定ECB模式,而不是CBC模式。 ECB模式不使用IV。