2011-12-25 15 views
5
cipher = Cipher.getInstance("Blowfish"); 

Questo genera un'eccezione java.security.NoSuchAlgorithmException: implementazione di Cipher Blowfish non trovata.Crittografia Blowfish in Android

Ho controllato sia local_policy.jar che US_export_policy.jar e non sono stati modificati dal momento dell'installazione di java. Cosa può causare questo problema?

Edit:

Object[] o = Security.getAlgorithms("Cipher").toArray(); 
    for (int i=0; i<o.length; i++) { 
     System.out.println((String)o[i]); 
    } 

Quando eseguo questo codice ottengo lista senza "Blowfish", ma tra i nomi degli algoritmi come DES o RSA ci sono alcuni nomi sconosciuti, come "1.2.840.113549.1.1.7" e così. Perché non c'è Blowfish o è nascosto in quei numeri?

risposta

2

Yeap, non riuscivo a trovare la soluzione e appena usato la libreria crittografica GNU. Funziona bene.

2

cipher = Cipher.getInstance("Blowfish")

funziona solo con Android 2.3 e superiori, quindi potrebbe essere che il vostro obiettivo è sotto Android 2.3?

EDIT: Se si vuole costruire a 2.3 o diciamo 4.0 ICS, ma anche supportare i dispositivi più bassi è possibile aggiungere qualcosa di simile al tuo Manifest.xml:

<uses-sdk android:minSdkVersion="3" /> 
<uses-sdk android:targetSdkVersion="14" /> 

L'unico problema è che ci si deve offrire Blowfish come opzione che non sarebbe una scelta valida (non selezionabile/disattivata) di un metodo di crittografia per chiunque abbia meno di 2.3, direi. Provalo! Costruiscilo e provalo su una varietà di versioni dell'SDK. In bocca al lupo!

+0

Io uso Android 2.1, quindi come posso utilizzare Blowfish in Android 2.1? – Sergey

+0

Purtroppo, non è possibile. Ma potresti sempre scegliere il target 2.3, ma consentire versioni di SDK più basse come questa. Inserirò il codice in una modifica sopra come soluzione. – TryTryAgain

+0

questo è il problema, mi serve la piattaforma 2.1 – Sergey

2

L'unica soluzione che posso suggerire è un pacchetto esterno se si desidera il supporto completo della piattaforma.

Android viene fornito con una versione ridotta di BouncyCastle. Quale credo stia avendo funzioni addizionali aggiunte mentre le versioni progrediscono.

Tuttavia, l'importazione del jar BouncyCastle completo in Android causa numerosi problemi poiché la versione Android utilizza gli stessi nomi.

La soluzione che ho usato è utilizzare SpongyCastle. L'ho usato in precedenza, ma non ho guardato attraverso il codice sorgente per garantire che non siano state apportate modifiche.

Una guida all'installazione: How to include the Spongy Castle JAR in Android?

2

local_policy.jar e US_export_policy.jar non sono rilevanti per Android. È necessario eseguire il codice dell'algoritmo su Android per ottenere un risultato significativo. Come altri hanno notato, il provider Android JCE è basato su Bouncy Castle, ma non include tutti gli algoritmi. Per poter utilizzare tutti gli algoritmi è necessario raggruppare la libreria completa nella tua app. Utilizzare Spongy Castle per semplificare la procedura. Dopo aver fatto, l'unico cambiamento è necessario è quello di specificare il provider come 'SC':

Cipher c = Cipher.getInstance("Blowfish", "SC"); 
0

Ho usato la crittografia blowfish sulla mia applicazione Android. Non so perché, ma la crittografia blowfish è stata commentata dalla libreria castello gonfiabile su Android.

Ho dovuto scaricare le sorgenti del castello rimbalzante, ho cambiato il nome del provider da BC a BC2 e rinominato il nome del pacchetto in bouncycastle2 per evitare un conflitto con quello già sul sdk di Android. Poi ho aggiunto questo barattolo personalizzato Bouncy Castle nella mia applicazione come un nuovo barattolo e funziona benissimo!