繁体   English   中英

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

[英]Encrypt from Java and decrypt in 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 上是一个带有用于加密的密钥(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 填充,仅支持空填充。 您必须在 Java 中选择无填充,并将加密时的输入数据填充为块大小的倍数,并在 Java 中删除解密时的空值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM