使用PHP解密Openssl中的错误

使用PHP解密Openssl中的错误,php,encryption,openssl,php-openssl,Php,Encryption,Openssl,Php Openssl,我发送一个加密的base64编码JSON对象 N4m4EBDjdCfq5V1JqjMXdO6PEjNEh1fAMaHPn.... 对于读取并返回响应的API,我在尝试解密响应时遇到了麻烦。我从API得到的响应是 � �Gֲ:й�@���BJ)3ࣗ�%���wW��u~��J�1��(�/�ik�A���Ԥ& ��g��yi�ُ�3��qxQ������4iM���k�o��k����k\�6�x9 我的解密代码 $private_key = file_get_contents('p

我发送一个加密的base64编码JSON对象

N4m4EBDjdCfq5V1JqjMXdO6PEjNEh1fAMaHPn....
对于读取并返回响应的API,我在尝试解密响应时遇到了麻烦。我从API得到的响应是

� �Gֲ:й�@���BJ)3ࣗ�%���wW��u~��J�1��(�/�ik�A���Ԥ& ��g��yi�ُ�3��qxQ������4iM���k�o��k����k\�6�x9 
我的解密代码

$private_key = file_get_contents('privateKey.key');

    $res = openssl_pkey_get_private($private_key);

    $a_key = openssl_pkey_get_details($res);

    // Decrypt the data in the small chunks
    $chunkSize = ceil($a_key['bits'] / 8);
    $output = '';

    while ($response)
    {
        $chunk = substr($response, 0, $chunkSize);
        $response = substr($response, $chunkSize);
        $decrypted = '';
        if (!openssl_private_decrypt($chunk, $decrypted, $res, OPENSSL_NO_PADDING))
        {
            while ($msg = openssl_error_string())
         echo $msg . "<br />\n";
        }
        $output .= $decrypted;
    }

    openssl_free_key($res);

    echo '<br /><br /> Unencrypted Data: ' .$output;
但我期待一个可读的纯文本响应

编辑:我现在了解到加密是在Java的一端进行的,加密的示例代码是

�E�X,�/�၏�����2#>�o�����    1f�=�*�O���г���18}Yi�,�_�ڪ�|
The code for using .pem file below: 
public static String encrypt(String rawText, PublicKey publicKey) throws 
 IOException, GeneralSecurityException {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    return Base64.encodeBase64String(cipher.doFinal(rawText.getBytes("UTF-
8")));
}

public static RSAPublicKey getPublicKey(String filename) throws IOException, 
GeneralSecurityException {
    String publicKeyPEM = getKey(filename);
    return getPublicKeyFromString(publicKeyPEM);
}

public static RSAPublicKey getPublicKeyFromString(String key) throws 
IOException, GeneralSecurityException {
    String publicKeyPEM = key;
    publicKeyPEM = publicKeyPEM.replace("-----BEGIN PUBLIC KEY-----\n", "");
    publicKeyPEM = publicKeyPEM.replace("-----END PUBLIC KEY-----", "");
    byte[] encoded = Base64.decodeBase64(publicKeyPEM);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(new 
X509EncodedKeySpec(encoded));
    return pubKey;
}


private static String getKey(String filename) throws IOException {
    // Read key from file
    String strKeyPEM = "";
    BufferedReader br = new BufferedReader(new FileReader(filename));
    String line;
    while ((line = br.readLine()) != null) {
        strKeyPEM += line + "\n";
    }
    br.close();
    return strKeyPEM;
}

public static void main(String[] args) {
RSA necryptionService = new RSA();
try
   {
String file = "D:/public.pem";
                String data = "Hello Test"
       PublicKey publicKey = necryptionService.getPublicKey(file);
      String encryptedData = necryptionService.encrypt(data,publicKey);
       System.out.println(encryptedData); 
   }
   catch (Exception e)
   {
       e.printStackTrace();
   }
}

Where the string gets converted in the 3rd method, try this additional piece 
of code


    CertificateFactory fact = CertificateFactory.getInstance("X.509");
    FileInputStream is = new FileInputStream(path);
    Certificate cer = fact.generateCertificate(is);

    logger.info("Public Key:::::::::::loaded"+cer.getPublicKey());
我使用cURL将请求发送到API,并返回java加密的响应

加密的请求是

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXQMVFWL6Mx177A3CSEVSIKH2.这个词的意思是:一个学生在学校里做了一个研究。一个学生在学校里做了一个研究。他们在书中给出了一个视频视频。或者或者,XXXOR/V8(8)或者或者,或者是一个关于一个学校的研究。他们在一个学校里做了一个研究。他们在一个学校的一个学校的一个研究,一个学校的一个研究,一个学校的一个研究。一个研究。一个学校的一个研究。一个研究。一个学校的一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。一个研究。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2 CXq5Njr0=

私钥是

-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

你确定两边都用相同的算法加密吗?似乎您正在尝试将RSA用作流密码。如果您对两个端点都有控制权,那么应该考虑改用AES。也许使用RSA只加密每个请求的一次性密钥。@rypskar:我无法控制两个端点。我只能控制解密。我需要研究AES。你可以再次检查端点的规格,以找到它是用哪种算法编码的。您返回的数据似乎不是base64编码的,或者可能是base64编码后压缩的?我不确定构建API的机构是否会告诉我他们使用的加密方法,但我还是会问。另外,如果我要查看文档,我相信在编码后响应是压缩的。您可能应该对加密消息进行编码并提供密钥。想要运行代码的人不能对不可打印的字符执行任何操作。您还应该说明预期的恢复测试是什么。