Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
phpseclib有时给出的整数错误太大_Php_Encryption_Rsa_Phpseclib - Fatal编程技术网

phpseclib有时给出的整数错误太大

phpseclib有时给出的整数错误太大,php,encryption,rsa,phpseclib,Php,Encryption,Rsa,Phpseclib,我正在为Android和iOS开发相同的应用程序。这两个应用程序都使用RSA公钥-私钥加密将参数发送到PHP服务器 我用它来解密任何应用程序发送的请求,到目前为止,它一直工作得很好。通常,移动应用程序只发布一个名为data的参数,其中包含一个用公钥加密的JSON,然后在服务器中,我使用私钥解密数据参数以获得JSON数据 但是,对于一个特定的服务,我需要发送两个加密参数,通常的加密JSON,以及一个同样使用相同公钥加密的密码。这就是我不知道发生了什么的地方。有一半的时间,这两个参数都被毫无问题地接

我正在为Android和iOS开发相同的应用程序。这两个应用程序都使用RSA公钥-私钥加密将参数发送到PHP服务器

我用它来解密任何应用程序发送的请求,到目前为止,它一直工作得很好。通常,移动应用程序只发布一个名为data的参数,其中包含一个用公钥加密的JSON,然后在服务器中,我使用私钥解密数据参数以获得JSON数据

但是,对于一个特定的服务,我需要发送两个加密参数,通常的加密JSON,以及一个同样使用相同公钥加密的密码。这就是我不知道发生了什么的地方。有一半的时间,这两个参数都被毫无问题地接收并解密,返回正确的值,但剩下的时间,我没有收到致命错误,而是RSA库在php中抛出一个用户_错误,说“整数太大”。这将返回一个空字符串。第一个参数“data”总是不同的,因为它每次都被加密,但是密码参数(也被加密)总是相同的,而这个参数只有一半的时间没有被加密

这真的很奇怪,因为有时候它会起作用。更奇怪的是,我刚刚尝试了,我颠倒了参数未加密的顺序,首先是密码,然后是数据,你知道吗,没有更多的错误

这是我用来解密的类:

<?php
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/../libs/Crypt');
require_once dirname(__FILE__) .'/../libs/Crypt/Net/SSH2.php';
require_once dirname(__FILE__) . '/../libs/Crypt/Crypt/RSA.php';

class CryptoHandler {

    private $privateKey;

    function __construct() {
        // Load Private Key File
        $this->privateKey = file_get_contents('resources/private_key.pem',FILE_USE_INCLUDE_PATH);
    }

    function decrypt($encryptedString) {
        $rsa = new Crypt_RSA();
        $rsa->setPassword('password');
        $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
        $rsa->loadKey($this->privateKey);
        $decryptedString = $rsa->decrypt(base64_decode($encryptedString));

        if (isset($decryptedString) && strlen($decryptedString) > 0){
            return $decryptedString;
        }
        else{
            //This is the exception I get, because $decryptedString's length is 0
            //And also, the integer too large message
            throw new Exception(INVALID_ENCRYPTED_DATA);
        }
    }

}

?>
顺便说一下,我正在使用设置路径,并为后端提供一点结构。
感谢您能为我提供的任何帮助,因为现在我将颠倒解密顺序,因为它似乎有效,但谁知道这是否会在将来给我带来麻烦。

对我来说效果很好:我可以切换$password和$parsedRequest,没有问题。如果您遇到问题,可以发布可以重现问题的独立代码。ie.提供重现问题的密钥以及$data和$encryptedPassword的值。感谢您的反馈。遗憾的是,发布重现问题的代码有点困难,因为我使用公钥从Android或iOS应用程序发出post请求。因此,涉及到很多代码。但最奇怪的是,如果我将加密数据记录到一个文本文件中,然后复制文本并将其用作字符串,代码每次都可以正常工作。所以,我不知道会是什么。我的猜测是分配内存或类似的问题,因为这只在我连续两次使用decrypt函数时发生
$data = $app->request->post('data');
$encryptedPassword = $app->request->post('password');
try{
    $chdl = new CryptoHandler();
    $parsedRequest = $chdl->decrypt($data);//invert this and the next line and it works
    $password = $chdl->decrypt($encryptedPassword);//$encryptedPassword is always the same
}catch(Exception $e){
    die($e->getMessage());
}