【发布时间】:2016-05-10 10:27:44
【问题描述】:
我必须从 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 上是一个带有用于加密的密钥(32 个字符)的字符串。
当我执行 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 填充。最好不要使用 mcrypt,它是废弃软件,多年未更新,不支持标准 PKCS#7(née PKCS#5)填充,只有非标准空填充,甚至不能用于二进制数据.而是考虑使用defuse,它正在维护中并且是正确的。