Как расшифровать файл на Java/Android, зашифрованный с помощью RSACertificate.der и RSAPrivatekey.p12

Я работаю над приложением Android для шифрования и дешифрования с использованием алгоритма RSA. Я намерен расшифровать файл, зашифрованный сервером с помощью файлов RSACertificate.der и RSAPrivatekey.p12.

Теперь у меня есть файлы Example.encriptedfile, RSACertificat.der и RSAPrivatekey.p12. Я хотел бы расшифровать приведенный выше файл example.encrypted, используя указанные выше ключи в JAVA.

Реализация для получения кода Privatekey And Decryption с использованием Cipher

Это файл example.encrypted.

    byte[] descryptedData = null;
    try {
        byte[] data = new byte[(int) file.length()];
        new FileInputStream(file).read(data)

        KeyStore keystore = KeyStore.getInstance("PKCS12");
        keystore.load(con.getAssets().open("rsaPrivate.p12"), "password".toCharArray());
        pk = (PrivateKey)keystore.getKey("1", "password".toCharArray());

        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, pk );
        descryptedData = cipher.doFinal(data);

    } catch (Exception e) {
        e.printStackTrace();
    }

    return new String(descryptedData);

Исключение для следующего кода:

java.security.InvalidKeyException: unknown key type passed to RSA
at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineInit(CipherSpi.java:277)
at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineInit(CipherSpi.java:381)
at javax.crypto.Cipher.init(Cipher.java:519)
at javax.crypto.Cipher.init(Cipher.java:479)

Так может ли кто-нибудь предоставить предложения и решения для реализации этого

Заранее спасибо.

Но то же самое


person Ganesh    schedule 15.05.2014    source источник


Ответы (1)


Если он зашифрован закрытым ключом, он вообще не зашифрован, так как любой, кто может получить открытый ключ, может расшифровать его, что может быть кем угодно.

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

Однако, возможно, целью было подписать его, и в этом случае вам нужно будет проверить его по открытому ключу. Для чего нужен публичный ключ, который есть в сертификате. Таким образом, вы загружаете сертификат в Certificate, с помощью java.security.cert API, а затем используете объект java.security.Signature для проверки подписи, используя открытый ключ, полученный из Certificate.

person user207421    schedule 15.05.2014
comment
Да, я использую тот же API, что и хранилище ключей KeyStore = KeyStore.getInstance(PKCS12); keystore.load(con.getAssets().open(rsaPrivate.p12), password.toCharArray()); pk = (PrivateKey)keystore.getKey(1, password.toCharArray()); - person Ganesh; 15.05.2014
comment
Приведенный выше код может получить закрытый ключ, но при дешифровании с использованием Cipher cipher = Cipher.getInstance(RSA); cipher.init(Cipher.DECRYPT_MODE, pk); descryptedData = cipher.doFinal(данные); Получение исключения java.security.InvalidKeyException: неизвестный тип ключа, переданный в RSA на com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineInit(CipherSpi.java:277) - person Ganesh; 15.05.2014
comment
Вы, кажется, не прочитали ни слова из того, что я сказал. В любом случае вам нужно опубликовать эти исключения и всю их трассировку стека и ваш код. Отредактируйте его в своем вопросе. И укажите, какой номер строки какой. - person user207421; 15.05.2014