Шифрование RSA Android создает исключение InvalidKeySpecException - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь зашифровать данные, используя заданный открытый ключ.

public static final String public_key = "MIIBCgKCAQEAr/oYAoxIcXnLzVDNN6TPJVjkwOJZnDcSEeoRntqhOvgjiycfswMWZZ5+UClJ4CMgMCVAs71BzAJzPv902Jt763SPkAO/vh6CwfLq2S3YcqDoRQJYZuSKQHW40R6sN7eFvQdxYhJnF45ketCdLdPFuF5o/ieChwLcCEDKzkWD7xio2TQlZ8jfzB4jNGr6bmW/aqF5ihe0pbhtfvlyM+jNF2vWeB1SCJ4v5zHLNKKYNy4cMsmIGHKB+0BaGVz87eYp65FFc2K9LawBBbWtVCxykYBzEnXRuU+0YzcTi4LThXg1cUsf++LK9qL/G7PZdN6HMGP7DYzgstFLfp8VRpKhqQIDAQAB";

String encryptData(String txt)
{
    String encoded = null;
    try {
        PublicKey key = KeyFactory.getInstance("RSA").generatePublic(
                new X509EncodedKeySpec(Base64.decode(public_key, Base64.DEFAULT)));

        Cipher cph = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cph.init(Cipher.ENCRYPT_MODE, key);
        encoded = Base64.encodeToString(cph.doFinal(txt.getBytes()),
                Base64.DEFAULT);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    return encoded;
}

И получите ошибку

W/System.err: java.security.spec.InvalidKeySpecException: 
java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
    at com.android.org.conscrypt.OpenSSLKey.getPublicKey(OpenSSLKey.java:143)
    at com.android.org.conscrypt.OpenSSLRSAKeyFactory.engineGeneratePublic(OpenSSLRSAKeyFactory.java:47)
    at java.security.KeyFactory.generatePublic(KeyFactory.java:172)

Я использовал тот же открытый ключ в Python3, с верхним / нижним колонтитулом «BEGIN PUBLIC KEY ... END PUBLIC KEY», и он отлично работает:

public_key = """-----BEGIN PUBLIC KEY-----
MIIBCgKCAQEAr/oYAoxIcXnLzVDNN6TPJVjkwOJZnDcSEeoRntqhOvgjiycfswMWZZ5+UClJ4CMgMCVAs71BzAJzPv902Jt763SPkAO/vh6CwfLq2S3YcqDoRQJYZuSKQHW40R6sN7eFvQdxYhJnF45ketCdLdPFuF5o/ieChwLcCEDKzkWD7xio2TQlZ8jfzB4jNGr6bmW/aqF5ihe0pbhtfvlyM+jNF2vWeB1SCJ4v5zHLNKKYNy4cMsmIGHKB+0BaGVz87eYp65FFc2K9LawBBbWtVCxykYBzEnXRuU+0YzcTi4LThXg1cUsf++LK9qL/G7PZdN6HMGP7DYzgstFLfp8VRpKhqQIDAQAB
-----END PUBLIC KEY-----
"""

def encode(msg):
    rsa_key = RSA.importKey(public_key)
    pks1_v1_5 = PKCS1_v1_5.new(rsa_key)
    encrypted = pks1_v1_5.encrypt(msg.encode('utf-8'))
    encrypted = base64.b64encode(encrypted)
    return encrypted

Может кто-нибудь помочь мне, плз?

--- РЕДАКТИРОВАТЬ ---

Я выполнил некоторую отладку кода Python: зашел в 'RSA.importKey (public_key)'. Я вижу, что он распознает ключ как ключ в кодировке PEM, удаляет верхний / нижний колонтитул и преобразует его в двоичный файл (binascii.a2b_base64). Двоичный файл передается в RSA._importKeyDER, который обнаруживает, что он соответствует стандарту PKCS # 1, и, в комментарии, «объект DER является последовательностью RSAPublicKey с двумя элементами».

1 Ответ

0 голосов
/ 11 ноября 2018

Вы генерируете свой открытый ключ из openssl, так как ваш открытый ключ слишком длинный:

например, я сгенерировал из openssl и заменил ваш открытый ключ, и все в порядке:

openssl genrsa -out key.pem 1024

openssl rsa -in key.pem -pubout > key.pub

и вставьте строку key.pub в свой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...