dongzhuxun5136 2015-03-13 15:37
浏览 51

如何通过转换PHP代码来加密Java中的文本?

On server (PHP code), we have 2 methods to encrypt/decrypt facebook id like this:

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;
}

with _cryptKey="1231238912389123asdasdklasdkjasd";

It's OK with the same value of input and output at server. But When I'm connecting to server as client (Android/Java) by HTTP request (REST). I try to convert method of PHP code to Java code at method "encryptFacebookId($text)" and send encryption text to server but the result of method decryptFacebookId($text) at server is not same value with the client.

This is my code at client

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());
        }

Please help me to find the right way.

  • 写回答

1条回答 默认 最新

  • dtup3446 2015-03-13 16:04
    关注

    1) If you want to concat binary byte[] don't transform it to String use for example:

    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) You have to be sure that the Base64 encoders are compatible.

    评论

报告相同问题?

悬赏问题

  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行