Вопрос по android, rsa, java, php, public-key – Расшифровка RSA с открытым ключом

5

У меня возникли проблемы с расшифровкой в моем проекте Android.

Я получаю строку, подписанную с помощью закрытого ключа, и мне нужно проверить (расшифровать) ее с помощью открытого ключа. Я хотел бы получить точно такой же результат, как если бы я использовал функцию PHP - openssl_public_decrypt (http://php.net/manual/pl/function.openssl-public-decrypt.php )

Я должен сделать это в своем проекте Java, чтобы я мог использовать библиотеки Java (например, BouncyCastle или что-то еще, какие-либо рекомендации?)

Есть идеи как решить это?

Хорошо, вот мой код. Я получаю такой открытый ключ

<code>PEMReader reader = new PEMReader(new InputStreamReader(ctx
                .getAssets().open("pubkey.pem")));
        Object obj;
        while ((obj = reader.readObject()) != null) {
             if (obj instanceof RSAPublicKey) {
                pubKey = (RSAPublicKey) obj;
                return pubKey;
            }
        }
</code>

И я всегда получаю открытый ключ без проблем.

<code>Cipher c = Cipher.getInstance("RSA/NONE/NoPadding", "SC");
c.init(Cipher.DECRYPT_MODE, pubKey);
byte[] result = c.doFinal(data_to_decrypt.getBytes());
</code>

И в результате (после преобразования байтов в строку) я получаю022c06571c6a263b389fcd93159cb311abb880bddf51b7c916dd1ae...

где PHP-функции возвращает sd8dsa348acvcx87|00454|OK|15000|CDE и это правильный вывод.

Как я уже сказал, я пытаюсь расшифровать данные с помощью открытого ключа. Mike
Вы знаете больше о подписи? Какой алгоритм хеширования был использован, напримерRSAwithSHA1? Bruno
Выcannot расшифровывать данные с помощью открытого ключа, это не имеет смысла (несмотря на плохой выбор имен в PHP). & Quot;I'm getting a string encrypted with a private key& quot ;: это действительно не имеет смысла. Это подписано в лучшем случае. Конечно, с RSA это будут более или менее те же операции (но это не относится к DSA). Проблема заключается в том, что для подписания сообщения почти наверняка потребуется хеш, поэтому получить оригинальное сообщение невозможно. Bruno
В криптографии с открытым ключом: вы подписываете и расшифровываете / дешифруете, используя закрытый ключ; вы проверяете (подпись) и шифруете / шифруете с помощью открытого ключа. Какой вы пытаетесь сделать? Bruno
Итак, давайте предположим, что строка подписана, как я могу это проверить? Mike

Ваш Ответ

1   ответ
5

которая только разработана для этих вещей.

BouncyCastle - поставщик криптографии для этой платформы. Это означает, что оно предоставляет вашему Java Cryptography Extension реализации алгоритмов криптографии.

Вы найдете основные классы для этого в пакетахjava.security а такжеjavax.crypto

Чтобы расшифровать ваше сообщение с открытым ключом, вы можете попробовать следующее:

// Use RSA/NONE/NoPadding as algorithm and BouncyCastle as crypto provider
Cipher asymmetricCipher = Cipher.getInstance("RSA/NONE/NoPadding", "BC");

// asume, that publicKeyBytes contains a byte array representing
// your public key
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);

KeyFactory keyFactory;
keyFactory = KeyFactory.getInstance(publicKeySpec.getFormat());
Key key = keyFactory.generatePublic(publicKeySpec);

// initialize your cipher
asymmetricCipher.init(Cipher.DECRYPT_MODE, key);
// asuming, cipherText is a byte array containing your encrypted message
byte[] plainText = asymmetricCipher.doFinal(cipherText);

Обратите внимание, что этот примерvery основные и не хватает нескольких блоков попробовать ловить. Кроме того, вы не должны использовать асимметричный шифр без заполнения, так как это делает вас уязвимыми к атакам воспроизведения. Также могут возникнуть проблемы с длиной ключа. В некоторых пакетах Java максимально допустимая длина ключа ограничена. Это может быть решено с помощью файлов политики неограниченной силы.

Надеюсь, это поможет вам начать работу с криптографией Java.

Реализация KeyFactory X.509 не найдена
Спасибо за Ваш ответ. Раньше у меня было похожее решение, оно работает, но я получаю в результате что-то вроде этого: 022c06571c6a263b389fcd93159cb311abb880bddf51b7c916dd1ae ... где функция php возвращает дешифрованную строку, где проблема с этим? Mike
Я редактирую свой первый пост и добавляю немного кода, возможно, он поможет найти решение. Mike
Я конвертирую результат в строку, и вывод моего предыдущего комментария - это строка, преобразованная из массива байтов Mike
Метод возвращает байтовый массив. Вы конвертировали результат в строку? Также я просто признаю, что я не присвоил результат метода doFinal переменной ... собираюсь редактировать ответ ...

Похожие вопросы