Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java加密并在PHP中解密(RIJNDAEL)_Java_Php_Rijndael - Fatal编程技术网

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

从Java加密并在PHP中解密(RIJNDAEL),java,php,rijndael,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,

我必须从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));
    }
}

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


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

PHP mcrypt不支持PKCS5填充。最好不要使用mcrypt,它是废弃软件,多年来没有更新过,不支持标准PKCS#7(née PKCS#5)填充,只支持非标准的空填充,甚至不能用于二进制数据。取而代之的是考虑使用,它是维护和正确的。