PHP使用RSA私钥解密数据

PHP使用RSA私钥解密数据,php,cryptography,rsa,data-conversion,phpseclib,Php,Cryptography,Rsa,Data Conversion,Phpseclib,我有一个使用c rsa公钥加密密码的程序,该公钥输出一个字节数组 为了便于传输和维护数据,我将字节直接转换为十六进制字符串。这就是我的问题所在。我将post数据发送到我的脚本,现在不确定要将其转换为什么以及如何解密 我正在尝试使用这篇文章中提到的方法。关于这一点的文档非常模糊,我不知道应该使用什么样的数据/类型解密 <?php include('Crypt/RSA.php'); if (isset($_POST['Password'])) { $Password

我有一个使用c rsa公钥加密密码的程序,该公钥输出一个字节数组

为了便于传输和维护数据,我将字节直接转换为十六进制字符串。这就是我的问题所在。我将post数据发送到我的脚本,现在不确定要将其转换为什么以及如何解密

我正在尝试使用这篇文章中提到的方法。关于这一点的文档非常模糊,我不知道应该使用什么样的数据/类型解密

<?php
include('Crypt/RSA.php');
if (isset($_POST['Password'])) 
    {

        $Password = $_POST['Password'];
        $crypttext = pack("H*",$Password);
        echo $cryptext;
        $rsa = new Crypt_RSA();
        $rsa->loadKey('key.priv'); 

        $decryptedText =$rsa->decrypt($cryptext);

        echo "Pass = >" . $decryptedText;
    }
?>
我将php修改为

<?php
include('Crypt/RSA.php');
if (isset($_POST['Password'])) 
    {

        $Password = $_POST['Password'];
        $crypttext = pack("H*",$Password);
        echo $cryptext;
        $rsa = new Crypt_RSA();
        $rsa->loadKey(file_get_contents('key.priv')); // Added file_get_contents() which fixed the key loading
        $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); // Added this which is essential thank you guys/gals
        $decryptedText =$rsa->decrypt($cryptext);

        echo "Pass = >" . $decryptedText; // gives unsual data. This needs to be converted from binary data to base64string I think
        echo "Pass = >" . base64_encode($decryptedText); // gives no data.
        echo "Pass = >" . base64_decode($decryptedText); // gives no data.
    }
?>

我四处搜索并尝试了几种方法来转换回文本,我也尝试了base64_编码和base64_解码,但我什么也没有得到,否则我会得到gobbledey gook。

最终的解决方案是使用imap_binary$decryptedText来转换回文本

编辑:

从那以后,我注意到一个更好的方法是更换两件东西

C

改为

plainBytes = Encoding.UTF8.GetBytes(data);
utf8_decode($decryptedText)
和PHP

imap_binary($decryptedText)
改为

plainBytes = Encoding.UTF8.GetBytes(data);
utf8_decode($decryptedText)

您的C库使用什么加密算法/方案?我认为您必须在php中设置加密/解密模式,然后再试一次。从phpseclib站点$rsa->setEncryptionModeCRYPT_rsa_ENCRYPTION_PKCS1;我认为它是RSA_Full,我从检查php库中收集到的一点信息是,这是Crypt_RSA->decrypt$RSA->setEncryptionModeCRYPT_RSA_ENCRYPTION_PKCS1的默认值;请给我们看看你的C代码。这可能是由于错误的字符编码。嗯,是的,但我仍然不知道输入:plainBytes=Convert.FromBase64Stringdata;。也许您也应该将PHP结果转换为base 64。取决于内容控制字符等。它可能无法很好地打印。如果数据是任意字符串,这种方法非常非常不可靠。是的,FromBase64String将字符串转换为字节数组-但它假定输入是有效的base64!如果试图将任意字符串转换为字节数组,则应使用编码,例如encoding.UTF8.GetBytesdata。然后,您需要对解密后得到的二进制数据进行解码,以获得字符串结果。