2014-09-19 27 views
6

Ho un paio di librerie, C#, PHP e Android dove tutte codificano/decodificano una stringa nello stesso modo in modo che siano tutte compatibili tra loro, cioè C# scrive e crittografa i dati in un database e PHP possono decrittografarlo e restituire la stringa originale.AES-256 e PKCS7Padding non riescono in Java

Ora ho bisogno di fare la stessa cosa con un'applicazione Java standard, quindi ho preso il codice dalla mia libreria Android e ho bisogno di librerie ma sto ottenendo un'eccezione. Per quanto ne so, il codice non era specifico per Android quindi non dovrebbe essere un problema.

Qui di seguito è la mia funzione di crittografia

public static String encrypt(String plainPasword) 
    { 
      String password = ""; 
      try 
      { 
       SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES"); 
       IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US-ASCII")); 

       Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 

       cipher.init(Cipher.ENCRYPT_MODE, key, iv); 

       byte[] encoded = cipher.doFinal(plainPasword.getBytes()); 
       password = new String(Base64.encodeBase64(encoded)); 

      } 
      catch (Exception ex) 
      { 
       System.err.println("Encryption Exception: " + ex.toString()); 
      } 
      return password; 
    } 

Quando chiamo Encryption.encrypt("myString"); ottengo la seguente eccezione:

Encryption Exception: java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding 

Come ho detto questo codice sta lavorando bene su Android e non dovrebbe fare alcuna differenza da dove proviene.

Grazie per l'aiuto che puoi fornire.

UPDATE

ho scoperto che avevo bisogno PKCS5Padding invece di 7, grazie ad un collegamento su un commento. Sono ora però ottenere la seguente eccezione:

Encryption Exception: java.security.InvalidKeyException: Illegal key size 
+1

http://stackoverflow.com/questions/10193567/java-security-nosuchalgorithmexception-cannot-find-any-provider-supporting-aes – srkavin

+0

Grazie quando ho cercato su Google non ho trovato nulla anche se ora che ho cambiato ora mi sta dicendo che la chiave è una dimensione non valida – Boardy

+0

Avrai bisogno dei file di criteri JCE di forza illimitata. http://deveshsharma.info/2012/10/09/fixing-java-security-invalidkeyexception-illegal-key-size-exception/ – srkavin

risposta

16

In primo luogo, in Java, il nome imbottitura standard è PKCS5Padding, non PKCS7Padding. Java sta effettivamente eseguendo il padding PKCS # 7, ma nella specifica JCA, PKCS5Padding è il nome dato.

Successivamente, si sta tentando di utilizzare AES-256, quindi è necessario installare i file di politica Unlimited Strength Jurisdiction.

Si spera che questo sia solo un esempio e non si stia utilizzando la stessa IV per ogni messaggio, giusto?

+0

È solo un esempio, ho copiato le politiche ma sto ancora ottenendo lo stesso eccetto in – Boardy

+0

Probabilmente hai ottenuto la versione sbagliata o le hai messe nel posto sbagliato. Dovrai fornire maggiori dettagli o semplicemente rivedere attentamente ciò che hai fatto. – erickson

+1

Ho trovato il problema. Avevo copiato i file in Program Files \ Java \ jre \ ... ma stavo usando un jre in bundle all'interno della directory JDK. Ho copiato i file in questo e funziona tutto ora. Grazie per l'aiuto. È un po 'strano per me perché Android non ha nessuno di questi problemi, soprattutto perché sto usando la stessa libreria – Boardy