0

Я пытаюсь использовать симметричный ключ, зашифрованный с помощью асимметричного шифрования, между двумя пользователями в веб-приложении весны. Но я получаю сообщение об ошибке javax.crypto.BadPaddingException.Ошибка обработки запроса; Вложенное исключение - javax.crypto.BadPaddingException: Ошибка дешифрования

Здесь подробно проблема. В одном методе контроллера я использую симметричный ключ AES для шифрования файлов, затем шифрую секретный ключ AES с открытым открытым ключом пользователя и сохраняя его в базе данных MySQL.

KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
    keyGen.init(128); 
    SecretKey secretKey = keyGen.generateKey(); 

    Cipher AESCipher= Cipher.getInstance("AES"); 
    AESCipher.init(Cipher.ENCRYPT_MODE, secretKey); 
    byte[] cipherData = AESCipher.doFinal(file.getBytes()); 
    //storing cipherData in database 

    Cipher RSACipher= Cipher.getInstance("RSA"); 
    RSACipher.init(Cipher.ENCRYPT_MODE, testPubKey); 
    byte[] aesKeyEncryptedBytes = RSACipher.doFinal(secretKey.getEncoded()); 
    //storing aesKeyEncryptedBytes in Database 

В другом методе контроллера я получаю зашифрованный SecretKey из базы данных, дешифрование SecretKey с помощью закрытого ключа. Создание нового секретного ключа AES для дешифрования зашифрованного файла.

 Cipher RSACipher= Cipher.getInstance("RSA"); 
     RSACipher.init(Cipher.DECRYPT_MODE, testPvtKey); 
     //file.getSymmetricKey method give us the encrypted AES symmetric key from database 
     byte[] decsymetricKeyBytes=RSACipher.doFinal(file.getSymetricKey()); 

     SecretKey symetricKey = new SecretKeySpec(decsymetricKeyBytes, 
       "AES"); 

     Cipher AESCipher= Cipher.getInstance("AES"); 
     AESCipher.init(Cipher.DECRYPT_MODE, symetricKey); 
     byte[] plainText = AESCipher.doFinal(file.getResourceFile()); 

Но он дает ошибку, когда я дешифрования зашифрованного симметричного ключа с помощью PrivateKey в этой строке кода.

byte[] decsymetricKeyBytes=RSACipher.doFinal(file.getSymetricKey()); 

Это дает эту ошибку

May 19, 2015 12:30:27 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [mvc-dispatcher] in context with path [/SP_SC_Hibernate] threw exception [Request processing failed; nested exception is javax.crypto.BadPaddingException: Decryption error] with root cause 
javax.crypto.BadPaddingException: Decryption error 
    at sun.security.rsa.RSAPadding.unpadV15(Unknown Source) 
    at sun.security.rsa.RSAPadding.unpad(Unknown Source) 
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363) 
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2121) 
    at com.dynamic.spring.ResourceController.downloadAsymmetricFile(ResourceController.java:396) 

помочь мне в этом, пожалуйста. Я использовал один и тот же подход в простом java-приложении [одна основная функция], где он работает отлично. Я также сделал статические экземпляры Cipher в своем приложении, чтобы зашифровать и расшифровать, но это тоже не работает.

Еще одна вещь Когда я расшифровываю зашифрованный симметричный ключ в том же методе контроллера, шифрование и дешифрование i-e происходит одним способом, он отлично работает.

Я не знаю, где я ошибаюсь или чего не хватает. Помощь будет очень оценена. Благодарю.

ответ

0

У меня проблема решена этим. Я сделал Ciphers статическим и инициализировал их в статических блоках. Затем я использую одни и те же шифры в обоих методах управления.

private static Cipher AESCipher = null; 
private static Cipher RSACipher = null; 

static { 
    try { 
     AESCipher = Cipher.getInstance("AES"); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (NoSuchPaddingException e) { 
     e.printStackTrace(); 
    } 
} 

static { 
    try { 
     RSACipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (NoSuchPaddingException e) { 
     e.printStackTrace(); 
    } 
} 
0

Возможно ли, что у вас неправильный закрытый ключ? Как вы можете проверить, совпадает ли он с открытым ключом?

+0

Нет, это невозможно. Потому что я храню закрытый и открытый ключ от userid в базе данных. Таким образом, я проверяю, что используется тот же самый закрытый ключ. Я проверил ключи. Он работает нормально. –

0

AES с ключами 128 не очень эффективен. Посмотрите на How to avoid installing "Unlimited Strength" JCE policy files when deploying an application?, то вы также должны убедиться, использовать 2048 или более на RSA;)

Для шифрования symmetic ключ с использованием RSA Cipher.WRAP_MODE и Cipher.wrap(key). По умолчанию RSA/ECB/PKCS1Padding может только обернуть ключи и не шифровать «нормальные» данные. RSA/ECB/OAEPWithSHA-256AndMGF1Padding должен иметь возможность шифровать normaly, но не может обернуть ключи. (У меня нет идеи, почему)

Смежные вопросы