2017-07-13 1 views
0

init initialisieren Ich bin ein bisschen neu in Sachen Verschlüsselung und Entschlüsselung. Und ich finde es wirklich schwer, ein gutes Material oder Tutorial dazu zu finden. Und ich habe in StackOverflow die damit verbundenen Fragen durchgelesen, fand keine gute Antwort für meine.Könnten wir das CIpher für ENCRYPT_MODE und DECRYPT_MODE

Hier ist mein Problem, wenn ich mit Transformation zu Verschlüsselung und Entschlüsselung will:

"AES/GCM/NoPadding"

Kann ich etwas tun unter:

public DaoEncryptionResult<byte[]> getEncryptionResult(final ByteBuffer bufferToEncrypt) { 
    try { 
     final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); 
     final SecretKey secretKey = new SecretKeySpec(BinaryKey, "AES"); 
     cipher.init(Cipher.ENCRYPT_MODE, secretKey, mSecureRandom); 
     final byte[] bytesToEncrypt = bufferToEncrypt.array(); 
     final byte[] cipherText = cipher.doFinal(bytesToEncrypt, 
       bufferToEncrypt.arrayOffset(), bufferToEncrypt.limit()); 
     final byte[] iv = cipher.getIV(); 
     return new DaoEncryptionResult<>(cipherText, iv); 
    } catch (final GeneralSecurityException securityException) { 
     throw new RuntimeException("Could not encrypt data", securityException); 
    } 
} 

public byte[] getDecryptionResult(final byte[] encodedData, final byte[] encodedIv) { 
    try { 
     final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); 
     final SecretKey secretKey = new SecretKeySpec(BinaryKey, "AES"); 
     cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(encodedIv)); 
     return cipher.doFinal(encodedData); 
    } catch (final GeneralSecurityException securityException) { 
     throw new RuntimeException("Could not decrypt data", securityException); 
    } 
} 

mSecureRandom wird einmal während des gesamten Anwendungslebenszyklus durch Aufruf von

initialisiert

neue Secure()

BinaryKey ist ein byte [], die durch Base64 aus String mit Base64.DEFAULT dekodiert wird

Die encodedData und encodedIv wird das gleiche wie das Ergebnis zurückgegeben in getEncryptionResult Methode .

Dadurch finde ich immer eine Ausnahme in Bezug auf das Entschlüsselungsproblem. Zum Beispiel:

javax.crypto.BadPaddingException: mac check in GCM failed 
    at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:854) 
    at javax.crypto.Cipher.doFinal(Cipher.java:1340) 
    at com.amazon.rabbit.android.data.dao.DaoEncryptionManagerImpl.getDecryptionResult(DaoEncryptionManagerImpl.java:250) 
+0

BTW, wenn jemand ein gutes Material über diese Verschlüsselung und Entschlüsselung Zeug kennt, könnten Sie den Link oder den Namen hier teilen? – user2989950

+1

Haben Sie Probleme mit diesem Code? Was ist deine Frage genau? –

+0

Ich habe die Ausnahmen aktualisiert, die ich gefunden habe. – user2989950

Antwort

0

als Antwort bereitgestellt aufgrund der Länge und Formatierung, die Beantwortung der Kommentar: (gutes Material über diese Verschlüsselung und Entschlüsselung Sachen, können Sie den Link teilen)

Es gibt Bücher:

Ein kostenloses PDF des Buches: Handbook of Applied Cryptography von Alfred J. Menezes, Paul C. van Oorschot und Scott A. Vanstone, siehe kostenlosen Download. Kapitel ist ein vernünftiger Start für aktuelle Verschlüsselungen.

Cryptography Decrypted von HX Mel und Doris M. Baker (guter Starter Ich mag wirklich)

Applied Cryptography von Bruce Schneier

Cryptography Engineering von Niels Ferguson, Bruce Schneier und Tadayoshi Kohno

Es gibt auch einige gute kostenlose Kurse im Internet als Coursera und Udacity.