2017-05-22 3 views
-2

J'essaye d'implémenter le cryptage et le décryptage AES/GCM/NoPadding dans JAVA .. la clé utilisée est une clé partagée de la clé publique du récepteur et de la clé privée de l'expéditeur (ECDH Le cryptage fonctionne bien (avec et sans iv). Cependant, je suis incapable de déchiffrer ...Cryptage AES GCM et décryptage en JAVA

je reçois l'exception: javax.crypto.BadPaddingException: check mac GCM n'a

public static String encryptString(SecretKey key, String plainText) throws NoSuchProviderException, NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { 

     //IvParameterSpec ivSpec = new IvParameterSpec(iv); 
     Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");//AES/ECB/PKCS5Padding //"AES/GCM/NoPadding", "BC" 
     byte[] plainTextBytes = plainText.getBytes("UTF-8"); 
     byte[] cipherText; 

     //cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 

     cipher.init(Cipher.ENCRYPT_MODE, key); 
     return new String(Base64.getEncoder().encode(cipher.doFinal(plainTextBytes))); 
     } 



      public static String decryptString(SecretKey key, String 
      cipherText) throws NoSuchProviderException, 
      NoSuchAlgorithmException, NoSuchPaddingException, 
      InvalidKeyException, InvalidAlgorithmParameterException, 
      IllegalBlockSizeException, BadPaddingException, 
      UnsupportedEncodingException, ShortBufferException { 


     Key decryptionKey = new SecretKeySpec(key.getEncoded(), 
       key.getAlgorithm()); 
     IvParameterSpec ivSpec = new IvParameterSpec(ivString.getBytes("UTF-8")); 
     Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");//AES/GCM/NoPadding", "BC"); 

     cipher.init(Cipher.DECRYPT_MODE, decryptionKey, ivSpec); 
     return new String (Base64.getEncoder().encode(cipher.doFinal(Base64.getDecoder().decode(cipherText.getBytes())))); 

    } 
+1

Pourquoi encoder à nouveau votre chaîne déchiffrée avec base64? Ce peut être un problème causé par l'encodeur Base64. Quelles importations avez-vous dans votre classe? – michip96

+1

J'ai voté la question parce que le code ne compile même pas. –

Répondre

1

Vous devez utiliser exactement la même IV pour le chiffrement et le déchiffrement des même texte chiffré et il doit être différent pour chaque chiffrement qui produit des textes chiffrés différents. L'IV n'est pas un secret, vous pouvez donc l'envoyer avec le texte chiffré. Habituellement, il est simplement préfixé au texte chiffré et découpé avant le déchiffrement.

+0

Ce n'est peut-être pas la réponse complète, mais c'est un début. Je ne sais pas comment la balise d'authentification est gérée pour le mode GCM en Java. –

+0

Il est considéré comme faisant partie du texte chiffré et il lancera donc une instance de (une classe dérivée de) 'BadPaddingException'. C'est moche comme l'enfer et est l'une des pires décisions de conception pour les chiffrements AEAD. Là encore, pour une raison déçue, il a été standardisé dans [RFC 5116] (https://tools.ietf.org/html/rfc5116) - montrant que les mauvaises pratiques sont également standardisées. –

0

Vous devez fournir une instance de GCMParameterSpec (qui inclut l'IV) pour les deux appels Cipher.init. Comme cela a déjà été souligné, l'IV doit être la même pour le cryptage et le décryptage, et doit être unique.