RSA Android Шифрование / RSA PHP Расшифровка

Мне нужна помощь для решения моей проблемы.

Проблема: я хочу зашифровать число (A) с помощью открытого ключа RSA с платформы Android, а затем расшифровать его на PHP Server с помощью закрытого ключа. На каждой платформе я могу шифровать и дешифровать данные (это хорошо работает), но когда PHP-скрипт пытается расшифровать данные, зашифрованные из ANDROID, это не сработает!

Проблема не в HTTP-передаче, потому что я пытаюсь дешифровать непосредственно генерирующее шифрование от ANDROID (закодированное в Base64), и оно вообще не работает …

Findhere после моего 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()); } 

После шифрования данных я конвертирую байт [] в Base64 (Base64.encodeToString (input, Base64.DEFAULT)).

Для сертификата я использую конверты RSA 2048 Bits в формат DER для Android.

—————————————— РЕШЕНИЕ ——-

Ошибка в следующих строках:

 byte[] encodedKey = new byte[5000]; publicKeyFile.read(encodedKey); 

Мы должны четко прочитать открытый ключ:

 byte[] encodedKey = new byte[/*lenght of file*/]; publicKeyFile.read(encodedKey); 

Есть много мест, которые могут пойти не так:

  1. Вы передаете 5000 байтов в X509EncodedKeySpec , большинство из которых равны 0. Вы уверены, что получаете правильный открытый ключ?
  2. Как долго in String?
  3. String.getBytes() использует стандартную кодировку платформы и может иметь непреднамеренные результаты. Используйте getBytes("ASCII") или getBytes("UTF-8") .

Как правило, вы должны просто использовать SSL и не пытаться самостоятельно внедрять асимметричное шифрование.