从Java加密并在PHP中解密(RIJNDAEL)
我必须从Java桌面应用程序和Android应用程序连接到Web服务。我需要发送用RIJNDAEL加密的登录,但我遇到了问题 Java代码:从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,
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)填充,只支持非标准的空填充,甚至不能用于二进制数据。取而代之的是考虑使用,它是维护和正确的。