2016-04-27 8 views
0

Ich mache RSA-Verschlüsselung und Entschlüsselung in meiner Anwendung.Ich habe zwei Dateien im Ordner Vermögenswerte, public_key.cer für die Verschlüsselung und private_key.cer für decryption.Getting der öffentliche Schlüssel aus der Datei, die ich mache, wie unten.Erhalten Ausnahme beim Versuch, den privaten Schlüssel aus Zertifikat

CertificateFactory certFactory = CertificateFactory.getInstance(X.509, BC); 
InputStream is = context.getAssets().open("public_Key.cer"); 
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(is); 
publicKey = cert.getPublicKey(); 

RSA-Verschlüsselung funktioniert gut, während ich bin vor Problem bei dem Versuch, Privae Schlüssel aus certificate.Below ist der Code zu bekommen mit dem privaten Schlüssel

InputStream is = context.getAssets().open("private_key.cer"); 
PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(new BASE64Decoder().decodeBuffer(is)); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC"); 
PrivateKey privateKey = keyFactory.generatePrivate(privSpec); 

Ich bin immer zu bekommen Ausnahme.

com.android.org.bouncycastle.jcajce.provider.asymmetric.util.ExtendedInvalidKeySpecException: unable to process key spec: java.lang.IllegalArgumentException: unknown object in getInstance: com.android.org.bouncycastle.asn1.DERApplicationSpecific 
at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi.engineGeneratePrivate(KeyFactorySpi.java:105) 
at java.security.KeyFactory.generatePrivate(KeyFactory.java:186) 
at com.teknospire.ndasenda_agent.utils.Conversion.decryptUsingPrivateKey(Conversion.java:111) 
at com.teknospire.ndasenda_agent.utils.Conversion.getDecryptedSkey(Conversion.java:243) 
at com.teknospire.ndasenda_agent.json.JsonCreationAndExtraction.readLoginParams(JsonCreationAndExtraction.java:40) 
at com.mockUp.ndasenda.LoginActivity$LoginRequest.doInBackground(LoginActivity.java:283) 
at com.mockUp.ndasenda.LoginActivity$LoginRequest.doInBackground(LoginActivity.java:1) 
at android.os.AsyncTask$2.call(AsyncTask.java:288) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:848) 
Caused by: java.lang.IllegalArgumentException: unknown object in getInstance: com.android.org.bouncycastle.asn1.DERApplicationSpecific 
at com.android.org.bouncycastle.asn1.ASN1Sequence.getInstance(ASN1Sequence.java:50) 
at com.android.org.bouncycastle.asn1.ASN1Sequence.getInstance(ASN1Sequence.java:33) 
at com.android.org.bouncycastle.asn1.pkcs.PrivateKeyInfo.getInstance(PrivateKeyInfo.java:45) 
at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi.engineGeneratePrivate(KeyFactorySpi.java:91) 
... 12 more 
java.lang.NullPointerException 
at org.bouncycastle.crypto.params.KeyParameter.<init>(KeyParameter.java:13) 
at com.teknospire.ndasenda_agent.utils.Conversion.decryptUsingSessionKey(Conversion.java:145) 
at com.teknospire.ndasenda_agent.utils.Conversion.getDecryptionData(Conversion.java:185) 
at com.teknospire.ndasenda_agent.json.JsonCreationAndExtraction.readLoginParams(JsonCreationAndExtraction.java:41) 
at com.mockUp.ndasenda.LoginActivity$LoginRequest.doInBackground(LoginActivity.java:283) 
at com.mockUp.ndasenda.LoginActivity$LoginRequest.doInBackground(LoginActivity.java:1) 
at android.os.AsyncTask$2.call(AsyncTask.java:288) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:848) 

Kann mir jemand helfen, wie private Schlüssel aus Cer-Datei zu lesen.

Vielen Dank im Voraus.

+0

Es gibt viele mögliche Formate für private Schlüssel; Ihr Code erwartet das PKCS8 Format, aber Sie sagen nichts über das Format von 'private_key.cer'. –

Antwort

0

prüfen this für die Basisimplementierung

Auszug aus der Website

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

    byte[] input = new byte[] { (byte) 0xbe, (byte) 0xef }; 
    Cipher cipher = Cipher.getInstance("RSA/None/NoPadding", "BC"); 

    KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC"); 
    RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(
     "12345678", 16), new BigInteger("11", 16)); 
    RSAPrivateKeySpec privKeySpec = new RSAPrivateKeySpec(new BigInteger(
     "12345678", 16), new BigInteger("12345678", 
     16)); 

    RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(pubKeySpec); 
    RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(privKeySpec); 

    cipher.init(Cipher.ENCRYPT_MODE, pubKey); 

    byte[] cipherText = cipher.doFinal(input); 
    System.out.println("cipher: " + new String(cipherText)); 

    cipher.init(Cipher.DECRYPT_MODE, privKey); 
    byte[] plainText = cipher.doFinal(cipherText); 
    System.out.println("plain : " + new String(plainText)); 
+0

Danke für die Antwort, aber dieser Code wird neue Schlüssel generieren, richtig? .Ich habe bereits Schlüssel zur Verfügung, ich will nur wissen, wie man den privaten Schlüssel aus dem Zertifikat lesen. – venky

+0

Überprüfen Sie, ob Ihr Problem mit der Binärcodierung zusammenhängt. http://newsgroups.derkeiler.com/Archive/Comp/comp.lang.java.security/2006-01/msg00010.html – am110787

+0

Ja, ich lösche nicht die BEGIN-END-Tags, jetzt nachdem ich sie entfernt habe, bin ich unter Ausnahme java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: Fehler: 0D0680A8: asn1 Encoding-Routinen: ASN1_CHECK_TLEN: falscher Tag – venky

0

-Code für private Schlüssel aus einer Datei bekommen:

private KeyStore.PrivateKeyEntry getKeyFromFile(String keyStoreFile, 
    String Password, Context cntx) { 
    KeyStore.PrivateKeyEntry entry = null; 
    try { 
     AssetManager am = cntx.getAssets(); 
     char[] keyStorePassword = Password.toCharArray(); 
     // Load the KeyStore and get the signing key and certificate. 
     KeyStore ks = KeyStore.getInstance("PKCS12"); 

     ks.load(am.open(keyStoreFile), keyStorePassword); 
     String alias = ks.aliases().nextElement(); 

     Entry entry1 = ks.getEntry(alias, new KeyStore.PasswordProtection(
       keyStorePassword)); 
     entry = (KeyStore.PrivateKeyEntry) entry1; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return entry; 
} 

Sie Ihre Daten entschlüsseln kann folgende Methode verwendet:

public byte[] decryptUsingPrivateKey(String encryptedData, Context cntx) { 

    byte[] utf8 = null; 
    try { 
     KeyStore.PrivateKeyEntry privateKey = getKeyFromFile(
       "PrivateKeyFile.pfx", "privatekeypassword", cntx); 

     Cipher rsa; 
     rsa = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     rsa.init(Cipher.DECRYPT_MODE, privateKey.getPrivateKey()); 
     utf8 = rsa.doFinal(Base64.decode(encryptedData)); 

    } catch (Exception e) { 
     System.out.println(e); 
    } 

    return utf8; 
} 

Hinweis:

  1. diese nutzen zu können, die Bibliothek ‚bcprov-jdk15on-152.jar‘ in Ihrer Anwendung in Android
  2. Mit privaten Schlüsseldatei kompilieren müssen, ist keine gute Praxis. Hoffe, Sie verwenden es im Testserver.
+0

Danke für Ihre Antwort, ich bekomme die Ausnahme bei der Verwendung Ihres Codes java.security.KeyStoreException : java.security.NoSuchAlgorithmException: KeyStore PKCS-Implementierung nicht gefunden, was wird der Algorithmus für .cer typr-Dateien sein? – venky

+0

Versuchen Sie diesen Link: http://www.programcreek.com/java-api-examples/java.security.KeyStoreException .Ich werde Ihnen auf CER-Dateien zurückkommen. –