в данный момент я пытаюсь зашифровать с помощью 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 … в байт [] и попытайтесь декодировать его. Ничего не работает …
У кого-нибудь есть решение для этого?
Поскольку вы не задаете режим шифрования с помощью phpseclib, это означает, что вы используете (более безопасный и менее распространенный) режим шифрования OAEP. Я предполагаю, что Java по умолчанию использует шифрование PKCS1 ($rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
).
При этом в режиме OAEP и используемом ключе (1024-битный ключ; 128 байт) ограничение составляет 86 байт. Ограничение в режиме PKCS1 составляет 117 байт.
phpseclib 1.0 / 2.0 может не выдавать ошибок, поскольку phpseclib старается быть удобной для пользователя, разбивает строку на части максимального размера и зашифровывает каждый фрагмент отдельно. Вряд ли Java это сделает.
Других решений пока нет …