RSA Android Encrypt / RSA PHP Расшифровать
Мне нужна помощь для решения моей проблемы.
Проблема: я хочу зашифровать число (A) с помощью открытого ключа RSA с платформы Android, а затем расшифровать его на PHP-сервере с помощью закрытого ключа. На каждой платформе я могу зашифровать и расшифровать данные (это работает хорошо), но когда PHP-скрипт пытается расшифровать данные, зашифрованные с помощью ANDROID, это не работает!!
Проблема не в HTTP-передаче, потому что я пытаюсь расшифровать напрямую генерирующее шифрование из ANDROID (закодировано в Base64), и оно не работает вообще...
Найдите здесь после моего кода PHP для расшифровки данных:
class MyEncryption
{
public $privkey = '';
public $pubkey = '';
public function __construct(){
}
public function initialize() {
$fp=fopen("./encryption/asasap_public.pub","r");
$temp=fread($fp,8192);
fclose($fp);
$this->pubkey = openssl_pkey_get_public($temp);
$fp=fopen("./encryption/asasap.pem","r");
$temp=fread($fp,8192);
fclose($fp);
$this->privkey = openssl_get_privatekey($temp,'');
}
public function encrypt($data)
{
if (openssl_public_encrypt($data, $encrypted, $this->pubkey))
$data = base64_encode($encrypted);
else
throw new Exception('Unable to encrypt data. Perhaps it is bigger than the key size?');
return $data;
}
public function decrypt($data)
{
if (openssl_private_decrypt(base64_decode($data), $decrypted, $this->privkey))
$data = $decrypted;
else
$data = '';
return $data;
}
public function hex2bin($hexdata) {
$bindata = '';
for ($i = 0; $i < strlen($hexdata); $i += 2) {
$bindata .= chr(hexdec(substr($hexdata, $i, 2)));
}
return $bindata;
}
}
И я использую этот класс, как здесь:
$enc = new MyEncryption();
$enc->initialize();
$data_1 = 'K27booXr0zZK4BQlI45MIPJJjPPkpCCPELGvoK/wKYUwShIWE6szlZtrmV83C5eBIrT/3lxWTH3+IOA+5mefurVUvXmQIV7fXEHNHLphyM6L9gQsMAGZMCroPjWKvJM59OMS/d5dwwhiRgzVarxXSKpxBYhEYWJTu7nRJ+bZKjumeoqnCSpmntIiV+tRYgkYflOU6j2QlesjO5tzj/TL6n7vHSO/O1qafJkzHcv8Kn2hTy+IH7QXm7z5vtjXOucHkvBm1xWORXdifh+ChyVvP16dSEmCaCAH6KqtA4viX/HwRFEi4mIWaYSIQk74NdcnQOpFcTgEu2nDwtHaBMqahw==';
$data_2 = $enc->decrypt($data_1);
Здесь data_1 инициализируется из зашифрованных данных (A=5) с Android с открытым ключом RSA (примечание: расшифровка хорошо работает на Android), но после расшифровки в PHP я получаю пустую строку...
------------------------------------------ ОБНОВИТЬ -------
Пожалуйста, найдите здесь после кода для части Android:
public byte[] encryptRSA(final InputStream publicKeyFile, String in) throws IOException, NoSuchAlgorithmException,
InvalidKeySpecException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException,
BadPaddingException {
byte[] encodedKey = new byte[5000];
publicKeyFile.read(encodedKey);
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pkPublic = kf.generatePublic(publicKeySpec);
// Encrypt
Cipher pkCipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
pkCipher.init(Cipher.ENCRYPT_MODE, pkPublic);
return pkCipher.doFinal(in.getBytes());
}
После шифрования данных я конвертирую byte[] в Base64 (Base64.encodeToString(input, Base64.DEFAULT)).
Для получения сертификата я использую RSA 2048 Биты, преобразованные в формат DER для Android.
------------------------------------------ РЕШЕНИЕ -------
Ошибка в следующих строках:
byte[] encodedKey = new byte[5000];
publicKeyFile.read(encodedKey);
Мы должны прочитать именно Открытый ключ:
byte[] encodedKey = new byte[/*lenght of file*/];
publicKeyFile.read(encodedKey);
1 ответ
Есть много мест, где это может пойти не так:
- Вы передаете 5000 байт
X509EncodedKeySpec
большинство из которых 0. Вы уверены, что получаете правильный открытый ключ? - Как долго это
in
Строка? String.getBytes()
использует кодировку платформы по умолчанию и может иметь непредвиденные результаты. использованиеgetBytes("ASCII")
или жеgetBytes("UTF-8")
,
Как правило, вы должны просто использовать SSL и не пытаться реализовать асимметричное шифрование самостоятельно.