【问题标题】:How to encrypt text in Java by converting PHP code?如何通过转换 PHP 代码来加密 Java 中的文本?
【发布时间】:2015-03-14 00:14:30
【问题描述】:

在服务器(PHP 代码)上,我们有 2 种方法来加密/解密 facebook id,如下所示:

private function encryptFacebookId($text)
{
        $method = "AES-256-CBC";
        $iv_size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CBC);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

        $encrypted = openssl_encrypt($text, $method, $this->_cryptKey, 0, $iv);

        return base64_encode($iv . $encrypted);
}

public function decryptFacebookId($text)
{
        $text = base64_decode($text);
        $method = "AES-256-CBC";
        $iv_size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CBC);
        $iv = substr($text, 0, $iv_size);

        $decrypted = openssl_decrypt(substr($text, $iv_size), $method, $this->_cryptKey, 0, $iv);

        return $decrypted;
}

与 _cryptKey="1231238912389123asdasdklasdkjasd";

在服务器端输入和输出的值相同就可以了。但是当我通过 HTTP 请求(REST)作为客户端(Android/Java)连接到服务器时。 我尝试在方法“encryptFacebookId($text)”中将 PHP 代码的方法转换为 Java 代码并将加密文本发送到服务器,但服务器上的方法 decryptFacebookId($text) 的结果与客户端的值不同。

这是我在客户端的代码

String facebookId = "123456789";
        String keyCrypt = "1231238912389123asdasdklasdkjasd";

        try {
            SecretKeySpec skeySpec = new SecretKeySpec(keyCrypt.getBytes(),
                    "AES");
            Cipher enCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            byte[] ivData = new byte[enCipher.getBlockSize()];
            IvParameterSpec iv = new IvParameterSpec(ivData);
            enCipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

            byte[] encryptedBytes = enCipher.doFinal(facebookId.getBytes());

            String ivEncrypted = new String(ivData)
                    + new String(encryptedBytes);

            String strEncode = Base64
                    .encodeBase64String(ivEncrypted.getBytes());

            System.out.println(strEncode);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

请帮我找到正确的方法。

【问题讨论】:

  • 可能this可以帮助你
  • 一开始你不能像这样转换二进制字节[]:new String(encryptedBytes)。
  • 你的 PHP 代码是一团糟。为什么要混合使用 mcrypt_* 和 openssl_* 函数? AES 有 128 位块/IV 大小而不是 256。为什么要 CAST?

标签: java php android encryption


【解决方案1】:

1) 如果您想连接二进制字节[],请不要将其转换为字符串,例如:

public static byte[] concat(byte[]... args) 
{
    int fulllength = 0;
    for (byte[] arrItem : args) {
        fulllength += arrItem.length;
    }
    byte[] outArray = new byte[fulllength];
    int start = 0;
    for (byte[] arrItem : args) {
        System.arraycopy(arrItem, 0, outArray, start, arrItem.length);
        start += arrItem.length;
    }
    return outArray;
}

byte[] ivEncrypted = concat(ivData, encryptedBytes);

2) 您必须确保 Base64 编码器兼容。

【讨论】:

    猜你喜欢
    • 2019-08-05
    • 1970-01-01
    • 2011-02-26
    • 2011-08-14
    • 2021-11-03
    • 2015-03-29
    • 2020-11-25
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多