2017-04-19 3 views
0

Les fonctions asymétriques suivantes sont utilisées pour crypter et décrypter dans android .. il fonctionne parfaitement. Toutefois, lorsque je crypte en utilisant la fonction ci-dessous et décrypter en utilisant php ou une autre fonction (ce qui est assez similaire en utilisant éclipse) .. Je reçois null .. mauvaise exception padding .. Je ne peux pas résoudre le problème .. comme je suis le résultat .. et pourquoi ne fonctionne que si je crypte et décrypte en android ou en éclipse .. mais ne fonctionne pas entre PHP et Android ou simplement entre deux programmes Java .. mais sur Eclipse et Android ..Cryptage asymétrique entre android et php

Programme Android :

public String encryptAsymmetric(String input, Key key) throws GeneralSecurityException, IOException { 
    byte[] crypted = null; 
    try{ 

     Cipher cipher = Cipher.getInstance("RSA"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     crypted = cipher.doFinal(input.getBytes()); 
    }catch(Exception e){ 
     System.out.println(e.toString()); 
    }//Base64.encodeBase64(crypted) 

    return new String(Base64.encode(crypted, Base64.DEFAULT)); 
} 
public String decryptAsymmetric(String input, Key key){ 
    byte[] output = null; 
    try{ 

     Cipher cipher = Cipher.getInstance("RSA"); 
     cipher.init(Cipher.DECRYPT_MODE, key);//Base64.decodeBase64(input.getBytes()) 
     output = cipher.doFinal(Base64.decode(input.getBytes(), Base64.DEFAULT)); 
    }catch(Exception e){ 
     System.out.println(e.toString()); 
    } 
    return new String(output); 
} 

Eclipse (programme Java, ainsi):

public static String encryptAsymmetric(String input, Key key){ 
     byte[] crypted = null; 

     try{ 

      Cipher cipher = Cipher.getInstance("RSA"); 
      cipher.init(Cipher.ENCRYPT_MODE, key); 
      crypted = cipher.doFinal(input.getBytes()); 
     }catch(Exception e){ 
      System.out.println(e.toString()); 
     }//Base64.encodeBase64(crypted) 
     return new String(Base64.getEncoder().encode(crypted)); 
    } 
public static String decryptAsymmetric(String input, Key key){ 
    byte[] output = null; 
    try{ 

     Cipher cipher = Cipher.getInstance("RSA"); 
     cipher.init(Cipher.DECRYPT_MODE, key);//Base64.decodeBase64(input.getBytes()) 
     output = cipher.doFinal(Base64.getDecoder().decode(input.getBytes())); 
    }catch(Exception e){ 
     System.out.println(e.toString()); 
    } 
    return new String(output); 
} 
+2

'Cipher.getInstance (" RSA ");' repose sur le mode et le remplissage par défaut et n'est * pas * portable. Ne fais jamais cela. 'input.getBytes()' repose sur le jeu de caractères par défaut et n'est * pas * portable. Ne fais jamais cela. –

+0

pouvez-vous expliquer ce que vous entendez par portable dans ce contexte? –

+0

Le même code produira des résultats différents sur des plates-formes avec différents jeux de caractères par défaut et produira des résultats différents sur les plates-formes Oracle Oracle par rapport aux plates-formes Android. –

Répondre

1

Comme mentionné par les commentaires dans @ James input.getBytes et getInstance ne sont pas portables .. Je changé par code en ajoutant utf-8 et écrit RSA/BCE/PKCS1Padding au lieu de RSA et il fixe mon problème ..

public String encryptAsymmetric(String input, Key key) throws GeneralSecurityException, IOException { 
    byte[] crypted = null; 
    try{ 
     byte[] bytes = input.getBytes("UTF-8"); 
     //String text = new String(bytes, "UTF-8"); 
     Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     crypted = cipher.doFinal(bytes); 
    }catch(Exception e){ 
     System.out.println(e.toString()); 
    }//Base64.encodeBase64(crypted) 

    return new String(Base64.encode(crypted, Base64.DEFAULT)); 
} 
public String decryptAsymmetric(String input, Key key){ 
    byte[] output = null; 
    try{ 

     Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, key);//Base64.decodeBase64(input.getBytes()) 
     output = cipher.doFinal(Base64.decode(input.getBytes("UTf-8"), Base64.DEFAULT)); 
    }catch(Exception e){ 
     System.out.println(e.toString()); 
    } 
    return new String(output); 
}