2013-12-12 6 views
9

Ich möchte ein RSA-Schlüsselpaar im Android Keystore generieren. Seit Android 4.3 soll es möglich sein RSA-Schlüssel im Android-Keystore zu generieren.Android KeyStore privaten Exponenten kann nicht extrahiert werden

ich generieren mein RSA-Schlüssel durch (funktioniert)

 Calendar notBefore = Calendar.getInstance(); 
     Calendar notAfter = Calendar.getInstance(); 
     notAfter.add(1, Calendar.YEAR); 
     KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(ctx) 
       .setAlias("key") 
       .setSubject(
         new X500Principal(String.format("CN=%s, OU=%s", 
           "key", ctx.getPackageName()))) 
       .setSerialNumber(BigInteger.ONE) 
       .setStartDate(notBefore.getTime()) 
       .setEndDate(notAfter.getTime()).build(); 
      KeyPairGenerator kpg; 
      kpg = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); 
      kpg.initialize(spec); 
      KeyPair kp = kpg.genKeyPair(); 
      publicKey = kp.getPublic(); 
      privateKey = kp.getPrivate(); 

mein RSA-Verschlüsselung sieht aus wie (funktioniert auch):

public static byte[] RSAEncrypt(final byte[] plain) 
     throws NoSuchAlgorithmException, NoSuchPaddingException, 
     InvalidKeyException, IllegalBlockSizeException, BadPaddingException { 

    Cipher cipher = Cipher.getInstance("RSA"); 
    System.out.println("RSA Encryption key: " + publicKey.getAlgorithm()); 
    System.out.println("RSA Encryption key: " + publicKey.getEncoded()); 

    cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
    byte[] encryptedBytes = cipher.doFinal(plain); 
    return encryptedBytes; 
} 

Entschlüsselung:

public static byte[] RSADecrypt(final byte[] encryptedBytes) 
     throws NoSuchAlgorithmException, NoSuchPaddingException, 
     InvalidKeyException, IllegalBlockSizeException, BadPaddingException { 

    Cipher cipher1 = Cipher.getInstance("RSA"); 

    System.out.println("RSA Encryption key: " + privateKey.getAlgorithm()); 
    System.out.println("RSA Encryption key: " + privateKey.getEncoded()); 

    cipher1.init(Cipher.DECRYPT_MODE, privateKey); 
    byte[] decryptedBytes = cipher1.doFinal(encryptedBytes); 
    return decryptedBytes; 
} 

In der Entschlüsselung Funktion Ich bekomme die folgende Fehlermeldung (wenn der privateKey codiert ist, und in cipher1.init()):

12-12 21:49:40.338: E/AndroidRuntime(20423): FATAL EXCEPTION: main 
12-12 21:49:40.338: E/AndroidRuntime(20423): java.lang.UnsupportedOperationException: private exponent cannot be extracted 
12-12 21:49:40.338: E/AndroidRuntime(20423): at org.apache.harmony.xnet.provider.jsse.OpenSSLRSAPrivateKey.getPrivateExponent(OpenSSLRSAPrivateKey.java:143) 

Ich verstehe es nicht. Ist es nicht möglich, einen RSA-Schlüssel im Android KeyStore zu generieren? Kann mir jemand ein Beispiel für die Generierung eines RSA-Schlüssels im Android KeyStore geben und ihn mit dem privaten Schlüssel entschlüsseln?

Vielen Dank im Voraus!

Antwort

14

Nach the code glaube ich, dass der OpenSSL-Anbieter verhindert, dass der private Exponent exportiert wird, wenn der Schlüssel in das Gerät generiert wurde.

@Override 
public final BigInteger getPrivateExponent() { 
    if (key.isEngineBased()) { 
     throw new UnsupportedOperationException("private exponent cannot be extracted"); 
    } 

    ensureReadParams(); 
    return privateExponent; 
} 

So müssen Sie wahrscheinlich spezifizieren, dass Sie den gleichen Krypto-Anbieter verwenden möchten, wenn Sie die Chiffre Instanz zu erhalten. Dieser Anbieter supports these RSA ciphers:

  • RSA/EZB/NoPadding
  • RSA/EZB/PKCS1Padding

Sie sollten eine Instanz der Chiffre auf diese Weise erstellen:

Cipher cipher1 = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL"); 
+1

'BigInteodeger' sollte sei 'BigInteger', kann aber nicht bearbeitet werden, da die Änderung weniger als 6 Zeichen beträgt. :( –

+1

Danke Mark. Ich habe den Beitrag aktualisiert. – Jcs

+2

Gibt es eine Möglichkeit, dies mit SpongyCastle für die Rückwärtskompatibilität arbeiten? – zubietaroberto

Verwandte Themen