RSA-шифрование в php для RSA-дешифрования в JAva

в данный момент я пытаюсь зашифровать с помощью rsa в php с помощью открытого ключа, созданного в приложении для Android, а затем снова расшифровать в приложении для Android.

Мой код для генерации ключей в Android:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.generateKeyPair();
PublicKey publicKey = kp.getPublic();
PrivateKey privateKey = kp.getPrivate();

С этими ключами я могу очень хорошо расшифровать и расшифровать. Ключ паба выглядит так:

OpenSSLRSAPublicKey{modulus=9ee9f82dd8429d9fa7f091c1d375b9c289bcf2c39ec57e175a2998b4bdd083465ef0fe6c7955c821b7e883929d017a9164a60290f1622f664a72096f5d2ffda7c7825c3d657c2d13d177445fa6cdd5d68b96346006a96040f5b09baae56d0c3efeaa77d57602f69018f5cefd60cb5c71b6b6f8a4b0472e8740367266917d8c13,publicExponent=10001}

В php я беру модуль и экспоненту, создавая зашифрованную строку с phpseclib 1.0

$rsa = new Crypt_RSA();
// $rsa->createKey();
$m = "9ee9f82dd8429d9fa7f091c1d375b9c289bcf2c39ec57e175a2998b4bdd083465ef0fe6c7955c821b7e883929d017a9164a60290f1622f664a72096f5d2ffda7c7825c3d657c2d13d177445fa6cdd5d68b96346006a96040f5b09baae56d0c3efeaa77d57602f69018f5cefd60cb5c71b6b6f8a4b0472e8740367266917d8c13";
$e = "10001";
$data = "hallo";
$modulus = new Math_BigInteger($m, 16);
$exponent = new Math_BigInteger($e, 16);
$rsa->loadKey(array('n' => $modulus, 'e' => $exponent));
$messageEncrypt = $rsa->encrypt($data);

В Android снова я загружаю ключ и расшифровываю его так:

Cipher cipher1 = Cipher.getInstance("RSA");
cipher1.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher1.doFinal(encrypted.getBytes());
String decrypted = new String(decryptedBytes);

Я всегда получаю неправильный расшифрованный открытый текст или сообщение об ошибке «Причины: java.lang.ArrayIndexOutOfBoundsException: слишком много данных для блока RSA» от Android.

Что я думаю: проблема в закодированном переводе. Этот php выводит другую закодированную версию, которую использует java. Поэтому я перепробовал много разных способов. Я пытался преобразовать вывод в строку / bin / hex / byte. Затем перенесите его с сокетом или копией + вставкой прямо в код. Преобразуйте его обратно из hex / bin … в байт [] и попытайтесь декодировать его. Ничего не работает …

У кого-нибудь есть решение для этого?

0

Решение

Поскольку вы не задаете режим шифрования с помощью phpseclib, это означает, что вы используете (более безопасный и менее распространенный) режим шифрования OAEP. Я предполагаю, что Java по умолчанию использует шифрование PKCS1 ($rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);).

При этом в режиме OAEP и используемом ключе (1024-битный ключ; 128 байт) ограничение составляет 86 байт. Ограничение в режиме PKCS1 составляет 117 байт.

phpseclib 1.0 / 2.0 может не выдавать ошибок, поскольку phpseclib старается быть удобной для пользователя, разбивает строку на части максимального размера и зашифровывает каждый фрагмент отдельно. Вряд ли Java это сделает.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector