我正在为Android和iOS开发相同的应用。这两个应用程序都发布到PHP服务器,使用RSA公钥 - 私钥加密来加密参数。
我使用phpseclib解密任何应用发送的请求,直到现在它一直运行良好。通常,移动应用程序将仅发布一个名为data的参数,其中包含使用公钥加密的JSON,然后,在服务器中,我使用私钥解密数据参数以获取JSON数据。
但是,对于一个特定服务,我需要发送两个加密参数,通常是加密的JSON,以及使用相同公钥加密的密码。这是我无法弄清楚正在发生什么的地方。有一半的时间,两个参数都没有问题,并且解密后返回正确的值,但剩下的时间,我没有得到致命的错误,但是RSA库引发的一个用户错误说明&#34 ; 整数太大"。这会返回一个空字符串。第一个参数"数据"总是不同的,因为它每次都被加密,但密码参数(也是加密的)总是相同的,这是只有一半时间未加密的参数。
这真的很奇怪,因为有时它会起作用。更奇怪的是,我刚刚尝试过,我颠倒了参数未加密的顺序,首先是密码然后是数据,你知道什么,没有更多的错误!
这是我用来解密的类:
<?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);
}
}
}
?>
这是处理POST请求并使用类的代码:
$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());
}
顺便说一句,我使用Slim Framework设置路径并为后端提供一点结构。 感谢您提供给我的任何帮助,因为我现在可以将解密顺序反转,因为它似乎有效,但谁知道这是否会给我带来麻烦。