我必须从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));
}
}
在服务器中我收到正确的数据,但是当我尝试解密登录时,输出不一样。
我无法更改服务器端的代码,你能帮助我吗?
答案 0 :(得分:0)
PHP mcrypt不支持PKCS5填充,只支持空填充。您必须在Java中选择无填充,并将加密时的输入数据填充为块大小的倍数,并在Java中删除解密时的空值。
PHP mcrypt服务器代码使用的ECB模式不安全,要兼容Java还需要指定ECB模式,而不是CBC模式。 ECB模式不使用IV。