2017-03-03 7 views
1

Ich versuche, RSA-Verschlüsselung und Entschlüsselung auf einem Schlüssel innerhalb AndroidKeyStore durchzuführen. Die Verschlüsselung wird erfolgreich abgeschlossen, aber wenn ich versuche, sie zu entschlüsseln, wird eine InvalidKeyException ausgelöst: Die Keystore-Operation ist bei Cipher.init() fehlgeschlagen.InvalidKeyException: Keystore-Vorgang bei RSA-Entschlüsselung auf Android-Gerät fehlgeschlagen

Hier ist mein keygeneration Code:

KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); 
AlgorithmParameterSpec spec = null; 
spec = new KeyGenParameterSpec.Builder(mAlias, 
     KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) 
     .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512) 
     .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1) 
     .build(); 
kpGenerator.initialize(spec); 
KeyPair kp = kpGenerator.generateKeyPair(); 

Hier ist mein encrypt Code:

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
keyStore.load(null); 
KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(mAlias, null); 
Cipher cip = null; 
RSAPublicKey pubKey = (RSAPublicKey) entry.getCertificate().getPublicKey(); 
cip = Cipher.getInstance("RSA/ECB/NoPadding"); 
cip.init(Cipher.ENCRYPT_MODE, pubKey); 
byte[] encryptBytes = cip.doFinal(challenge.getBytes()); 
String encryptedStr64 = Base64.encodeToString(encryptBytes, Base64.DEFAULT); 

Hier ist mein Entschlüsselungs-Code:

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
keyStore.load(null); 
KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(mAlias, null); 
Cipher cip = null; 
cip = Cipher.getInstance("RSA/ECB/NoPadding"); 
cip.init(Cipher.DECRYPT_MODE, entry.getPrivateKey()); 
byte[] decryptedBytes = cip.doFinal(Base64.decode(encrypted64, Base64.DEFAULT)); 
String plainText = new String(decryptedBytes); 

mir bewusst bin, dass die Polsterung im Schlüssel Generierungscode unterscheidet sich von meinem Ver-/Entschlüsselungscode. Wenn ich jedoch das Auffüllen meines Schlüsselgenerierungscodes zu KeyProperties.ENCRYPTION_PADDING_NONE ändere, erhalte ich stattdessen eine InvalidAlgorithmParameterException auf kpGenerator.initialize (spec). Mit "RSA/ECB/PKCS1Padding" in Entschlüsselung funktioniert es. Ungeachtet des Auffüllens von Verschlüsselung funktioniert es immer.

Ja, ich bin mir auch der Sicherheitsauswirkungen der Verwendung von Padding bewusst, aber für meine Anwendung brauche ich einen deterministischen Chiffretext.

Hier ist der Stacktrace mit InvalidKeyException:

03-06 09:10:32.710 5058 5058 W System.err: java.security.InvalidKeyException: Keystore operation failed 
03-06 09:10:32.713 5058 5058 W System.err: at android.security.KeyStore.getInvalidKeyException(KeyStore.java:692) 
03-06 09:10:32.713 5058 5058 W System.err: at android.security.KeyStore.getInvalidKeyException(KeyStore.java:712) 
03-06 09:10:32.713 5058 5058 W System.err: at android.security.keystore.KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(KeyStoreCryptoOperationUtils.java:54) 
03-06 09:10:32.713 5058 5058 W System.err: at android.security.keystore.KeyStoreCryptoOperationUtils.getExceptionForCipherInit(KeyStoreCryptoOperationUtils.java:89) 
03-06 09:10:32.713 5058 5058 W System.err: at android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:263) 
03-06 09:10:32.713 5058 5058 W System.err: at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:108) 
03-06 09:10:32.713 5058 5058 W System.err: at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:612) 
03-06 09:10:32.713 5058 5058 W System.err: at javax.crypto.Cipher.tryCombinations(Cipher.java:532) 
03-06 09:10:32.714 5058 5058 W System.err: at javax.crypto.Cipher.getSpi(Cipher.java:437) 
03-06 09:10:32.714 5058 5058 W System.err: at javax.crypto.Cipher.init(Cipher.java:815) 
03-06 09:10:32.714 5058 5058 W System.err: at javax.crypto.Cipher.init(Cipher.java:774) 
03-06 09:10:32.714 5058 5058 W System.err: at dfpidentifiers.my.test.app.MainActivity.decrypt(MainActivity.java:950) 
03-06 09:10:32.714 5058 5058 W System.err: at dfpidentifiers.my.test.app.MainActivity.onCreate(MainActivity.java:117) 
03-06 09:10:32.714 5058 5058 W System.err: at android.app.Activity.performCreate(Activity.java:6251) 
03-06 09:10:32.714 5058 5058 W System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread.-wrap11(ActivityThread.java) 
03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
03-06 09:10:32.714 5058 5058 W System.err: at android.os.Handler.dispatchMessage(Handler.java:102) 
03-06 09:10:32.714 5058 5058 W System.err: at android.os.Looper.loop(Looper.java:148) 
03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread.main(ActivityThread.java:5417) 
03-06 09:10:32.714 5058 5058 W System.err: at java.lang.reflect.Method.invoke(Native Method) 
03-06 09:10:32.714 5058 5058 W System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
03-06 09:10:32.714 5058 5058 W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
03-06 09:10:32.714 5058 5058 W System.err: Caused by: android.security.KeyStoreException: Incompatible padding mode 
03-06 09:10:32.714 5058 5058 W System.err: at android.security.KeyStore.getKeyStoreException(KeyStore.java:632) 
03-06 09:10:32.714 5058 5058 W System.err: ... 24 more 

Vom stacktrace, so scheint es, ein nicht kompatibles Padding-Modus zu sein, aber wie erstelle ich ein Schlüsselpaar, das keine Polsterung unterstützt?

+0

Könnten Sie bitte den vollständigen Stacktrace posten? –

+1

Beachten Sie, dass die deterministische asymmetrische Kryptographie normalerweise als No-Go-Bereich betrachtet wird; Ein Angreifer kann einfach versuchen, mehrere Nachrichten zu verschlüsseln, um eine Nachricht zu finden, die mit Ihrem Geheimtext übereinstimmt. Wenn Sie bereits genügend zufällige Bytes in der Nachricht haben, würde ich erwägen, dies auf die volle Modulusgröße (-1 höchstwertiges Bit) zu erweitern, indem z. HKDF oder XOF und RSA verschlüsseln diesen Wert. Dann können Sie HKDF wieder verwenden, um einen symmetrischen Schlüssel aus dem Wert abzuleiten (vor der Verschlüsselung/nach der Entschlüsselung) und schließlich diesen zu verwenden, um den verschlüsselten Text mit z. AES-GCM. –

+0

Vielleicht müssen Sie einen Rückruf-Handler für das Passwort übergeben. Wenn dies Ihr Problem ist, erlauben Sie mir bitte, die Frage zu beantworten; Ohne Stack-Trace oder Keystore können wir keine Lösungen verifizieren. –

Antwort

2

Die InvalidKeyException wurde tatsächlich durch einen Unterschied in der Auffüllung während der Schlüsselgenerierung und -entschlüsselung verursacht. Nicht sicher, warum die Verschlüsselung nicht die gleiche Ausnahme ausgelöst hat.

Ich war auch anfangs nicht in der Lage, NoPadding während der Schlüsselerzeugung zu verwenden, da IND-CPA benötigt wird. Ich muss setRandomizedEncryptionRequired (true) setzen, um dies zu überschreiben.

+0

Danke für Ihre Rückmeldung! –

Verwandte Themen