2015-02-14 3 views
0

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

package aes; 

import javax.crypto.*; 
import java.security.*; 
import javax.crypto.spec.SecretKeySpec; 
import sun.misc.*; 


public class AESencrpytion { 

    //private static final byte[] keyValue = new byte[]{'S','e','c','r','e','t'}; 


    public static String encrypt(String data) throws Exception{ 
    KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
    SecureRandom rand = new SecureRandom(); 
    keyGen.init(rand); 
    Key key = keyGen.generateKey(); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, key); 
    byte[] encValue = cipher.doFinal(data.getBytes()); 
    String encryptedValue = new BASE64Encoder().encode(encValue); 
    return encryptedValue; 
    } 

    public static String decrypt(String encData) throws Exception { 
    KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
    SecureRandom rand = new SecureRandom(); 
    keyGen.init(rand); 
    Key key = keyGen.generateKey(); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.DECRYPT_MODE, key); 
    byte[] decodedValue = new BASE64Decoder().decodeBuffer(encData); 
    //ERROR HAPPENS HERE 
    byte[] decValue = cipher.doFinal(decodedValue); 
    String decryptedVal = new String(decValue); 
    return decryptedVal; 
    } 

Основной класс:

package aes; 

public class AEStest { 

    public static void main(String[] args) throws Exception { 

    String password = "mypassword"; 
    String passwordEnc = AESencrpytion.encrypt(password); 
    String passwordDec = AESencrpytion.decrypt(passwordEnc); 

    System.out.println("Plain Text : " + password); 
    System.out.println("Encrypted Text : " + passwordEnc); 
    System.out.println("Decrypted Text : " + passwordDec); 
    } 
} 

Я новичок в AES и шифрования и это для домашнего задания. Спасибо вам за помощь! Я ценю это.

+0

Если пароль для аутентификации пользователя, то используйте PBKDF2 для хеширования и сравнения, когда пользователь действительно вступает в систему. Если это для чего-то еще, используйте случайный IV. –

+0

Всегда лучше использовать полноценный Cipher, например 'AES/CBC/PKCS5Padding''. –

ответ

0

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

Либо добавьте метод init в свой класс, чтобы сгенерировать ключ один раз или сгенерировать ключ вне класса и передать его в оба метода.

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