2017-05-22 10 views
-2

JAVA에서 AES/GCM/NoPadding 암호화 및 암호 해독을 구현하려고합니다. 사용되는 키는 수신자의 공개 키와 발신자의 개인 키 (ECDH) .. 암호화가 잘 작동합니다 (iv 포함 또는 제외). 그러나, 나는 Java에서 AES GCM 암호화 및 암호 해독

내가 예외가 ... 해독 할 수 없습니까 : javax.crypto.BadPaddingException : GCM에 맥 체크

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

왜 base64로 해독 된 String을 다시 인코딩합니까? Base64 인코더로 인한 문제 일 수 있습니다. 수업 중에 어떤 수입이 있습니까? – michip96

+1

코드가 컴파일되지 않아서 질문에 투표했습니다. –

답변

1

당신은 암호화 및 암호 해독 정확히 동일한 IV를 사용해야합니다 실패 동일한 암호문이며 서로 다른 암호문을 생성하는 각 암호화마다 달라야합니다. IV는 비밀이 아니므로 암호문과 함께 보낼 수 있습니다. 대개 암호문 앞에 붙이고 해독하기 전에 잘라낸 것입니다.

+0

전체 답변이 아닐 수도 있지만 시작일뿐입니다. 자바의 GCM 모드에서 인증 태그가 어떻게 처리되는지 모르겠습니다. –

+0

이것은 암호문의 일부로 간주되므로, (BadPaddingException'에서 파생 된) 클래스의 인스턴스를 던집니다. 이것은 지옥처럼 추악하며 AEAD 암호에 대한 최악의 설계 결정 중 하나입니다. 다시 말하자면, 어떤 실수로 인해 [RFC 5116] (https://tools.ietf.org/html/rfc5116)에서 표준화되었습니다. 나쁜 습관이 표준화되어 있음을 보여줍니다. –

0

두 Cipher.init 호출 모두에 대해 GCMParameterSpec 인스턴스 (IV 포함)를 제공해야합니다. 이미 지적했듯이 IV는 암호화와 암호 해독 모두에서 동일해야하며 고유해야합니다.