Я разрабатываю одно и то же приложение для Android и iOS. Оба приложения публикуют параметры шифрования на сервере PHP с использованием шифрования открытого и закрытого ключей RSA.
я использую phpseclib расшифровывать запросы, отправленные любым из приложений, и до сих пор он работал отлично. Обычно мобильное приложение публикует только один параметр с именем data, содержащий JSON, зашифрованный с помощью открытого ключа, а затем на сервере я дешифрую параметр data с помощью личного ключа для получения данных JSON.
Но для одного конкретного сервиса мне нужно отправить два зашифрованных параметра, обычный зашифрованный JSON и пароль, также зашифрованный с использованием того же открытого ключа. И здесь я не могу понять, что происходит. Половину времени оба параметра принимаются без проблем и расшифровываются, возвращая правильные значения, но в остальное время я не получаю фатальную ошибку, но пользовательскую ошибку в php выдает библиотека RSA, говорящая «Слишком большое целоеMsgstr «И это возвращает пустую строку. Первый параметр» данные «всегда отличается, потому что он каждый раз шифруется, но параметр пароля (также зашифрованный) всегда один и тот же, и это параметр, который получает незашифрованный только половину времени ,
Это действительно странно, потому что иногда это работает. И что еще более странно, это то, что я только что попробовал, я перевернул порядок, в котором параметры получают незашифрованные, сначала пароль, а затем данные, и что вы знаете, ошибок больше нет!
Это класс, который я использую для расшифровки:
<?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 установить пути и дать бэкэнду небольшую структуру.
Спасибо за любую помощь, которую вы можете оказать мне, сейчас я переверну порядок дешифрования, как он, кажется, работает, но кто знает, доставит ли это мне проблемы в будущем.
Задача ещё не решена.
Других решений пока нет …