2012-11-22 3 views
0

J'ai essayé d'utiliser le sel pour déchiffrer un message chiffré AES mais il renvoie toujours la valeur null. Quelqu'un peut-il regarder où je fais mal?AES déchiffrement est toujours nul

public static String decryptMessage(String encryptedMessage, String salt) { 

    String decryptedMessage = null; 
    String valueToDecrypt = encryptedMessage; 
    try { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance(ALGORITHM); 
    c.init(Cipher.DECRYPT_MODE, key); 


    for (int i = 0; i < ITERATIONS; i++) { 
     byte[] decodedValue = Base64.decodeBase64(valueToDecrypt); 
     byte[] decVal = c.doFinal(decodedValue); 
     decryptedMessage = new String(decVal).substring(salt.length()); 
     valueToDecrypt = decryptedMessage; 
    } 


    } catch (Exception e) { 
    e.printStackTrace(); 

    } 
    return decryptedMessage; 
} 

**EDIT:** 

Voici la méthode de cryptage correspondante qui fonctionne, je suppose.

private static final String ALGORITHM = "AES"; 
    private static final int ITERATIONS = 5; 
    private static final byte[] keyValue = new byte[] { '1', '2', '3', '4', 
      '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6' }; 


    public static String encryptMessage(String message, String salt) { 
     String encMessage = null; 
     byte[] encVal = null; 
     String messageWithSalt = null; 
     try { 
      Key key = generateKey(); 

      Cipher c = Cipher.getInstance(ALGORITHM); 
      c.init(Cipher.ENCRYPT_MODE, key); 

      for (int i = 0; i < ITERATIONS; i++) { 
       messageWithSalt = salt + encMessage; 
       encVal = c.doFinal(messageWithSalt.getBytes()); 
       byte[] encryptedValue = new Base64().encode(encVal); 
       encMessage = new String(encryptedValue); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 

     } 
     return encMessage; 
    } 

PS: L'ITERATION n'est PAS 0;

+0

Qu'est-ce que 'ALGORITHM'? – PearsonArtPhoto

+4

'ITERATIONS' est 0? :) – Leigh

+2

Vous avez oublié de poster le code de cryptage correspondant. – CodesInChaos

Répondre

1

Eh bien, j'ai trouvé l'erreur. C'était dans la méthode de cryptage. encMessage était null avant le début du processus de chiffrement. String encMessage = message a fait l'affaire. Donc, la méthode de cryptage est:

public static String encryptMessage(String message, String salt) { 
      String encMessage = message; 
      byte[] encVal = null; 
      String messageWithSalt = null; 
      try { 
       Key key = generateKey(); 

       Cipher c = Cipher.getInstance(ALGORITHM); 
       c.init(Cipher.ENCRYPT_MODE, key); 

       for (int i = 0; i < ITERATIONS; i++) { 
        messageWithSalt = salt + encMessage; 
        encVal = c.doFinal(messageWithSalt.getBytes()); 
        byte[] encryptedValue = new Base64().encode(encVal); 
        encMessage = new String(encryptedValue); 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 

      } 
      return encMessage; 
     } 
1

Je pense que votre méthode pourrait être brisée de façon chronique ou mal nommée. Vous générez une clé chaque fois que vous décryptez, alors que vous devriez avoir une clé préexistante qui correspond à celle utilisée pour le chiffrement. Vous passez également une valeur "salt" - note: c'est un terme normalement réservé au hachage - que vous ignorez complètement, sauf pour utiliser la taille comme une longueur de troncature sur votre résultat.

Certainement ce que je vois ci-dessus ne décrypte rien d'une manière sensible. Si vous pouvez décrire exactement ce que vous vouliez réaliser, nous pouvons éventuellement corriger le code ou vous diriger vers la méthode évaluée par des pairs pour effectuer cette tâche (qui peut déjà être implémentée dans les bibliothèques standard).

Questions connexes