Pengecualian padding buruk di AES

Saya sedang mengerjakan proyek di mana saya perlu mengirimkan tautan verifikasi ke pengguna. Jadi dienkripsi nama penggunanya menggunakan enkripsi AES. Kode saya berfungsi dengan baik, yaitu enkripsi dan dekripsi berfungsi dengan baik tetapi hanya di program ketika saya mengujinya. Saya mengenkripsi string dan kemudian mendekripsinya. Ini berfungsi dengan baik 'secara lokal'.

Masalahnya adalah, ketika saya mengirim email dengan link aktivasi dan mengkliknya, saya mendapat error:

javax.crypto.BadPaddingException: Given final block not properly padded

Kode saya seperti yang ditunjukkan di bawah ini:

public class AES {

private static final String algo="AES";
private static final byte[] keyValue= 
        new byte[]{somekey};

private static Key generateKey() throws Exception{

    Key key= new SecretKeySpec(keyValue, algo);

    return key;
}

public static String encrypt(String  email) throws Exception{

    Key key=generateKey();
    Cipher c=Cipher.getInstance(algo);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encVal=c.doFinal(email.getBytes());
    String encryptedEmail= new BASE64Encoder().encode(encVal);

    return encryptedEmail;
}

public static String decrypt(String encryptedEmail) throws Exception{

    Key key=generateKey();
    Cipher c=Cipher.getInstance(algo);
    c.init(Cipher.DECRYPT_MODE, key);

    byte[] decodeEmail= new BASE64Decoder().decodeBuffer(encryptedEmail);
    byte[] decodedEmail=c.doFinal(decodeEmail);

    String decryptedEmail= new String(decodedEmail);

    return decryptedEmail;
    }

}


person kunal18    schedule 21.07.2012    source sumber
comment
Apakah ada orang yang mau membantu saya? Tolong, ini mendesak!   -  person kunal18    schedule 21.07.2012
comment
BadPaddingException dilemparkan setiap kali ada yang salah dengan masukan algoritme (kunci atau teks sandi dalam kasus Anda). Apakah Anda membandingkan output dari pengkodean/dekode basis 64? Anda tidak boleh menggunakan kelas Sun internal, coba perpustakaan Bouncy Castle atau Apache sebagai gantinya.   -  person Maarten Bodewes    schedule 21.07.2012
comment
Sudahkah Anda menyelesaikan masalahnya? Jika ya, dapatkah Anda menunjukkan apa yang menyebabkannya dan menerima atau mengirimkan jawabannya?   -  person Maarten Bodewes    schedule 30.07.2012


Jawaban (2)


Saya menjalankannya menggunakan encoder/decoder Base64 dari perpustakaan Bouncy Castle, tidak ada masalah sama sekali. Periksa input/output Anda dan gunakan encoder/decoder base 64 yang valid, bukan encoder/decoder internal Sun dengan input/output yang tidak ditentukan.

Peringatan: saat Anda menggunakan pengkodean karakter yang tidak ditentukan, pengkodean tersebut akan menggunakan platform yang spesifik, sehingga input/output Anda mungkin berbeda pada sistem yang terpisah. Coba dan gunakan Charset.forName("UTF8") untuk pengkodean karakter yang paling kompatibel (dalam konstruktor String dan metode toBytes).

person Maarten Bodewes    schedule 21.07.2012
comment
Saya berani bertaruh pada pengkodean karakter sebagai masalahnya. - person President James K. Polk; 21.07.2012
comment
@GregS mungkin, bisa jadi string base64 tidak ditransfer dengan benar, jika tidak, konversi bisa gagal secara diam-diam, tapi itu akan terjadi setelah dekripsi - person Maarten Bodewes; 21.07.2012

Kode Anda tampaknya tidak menyetel padding pada enkripsi atau dekripsi. Jauh lebih baik untuk mengatur padding secara eksplisit di kedua ujungnya. Tampaknya Anda juga tidak menyetel mode, sekali lagi itu perlu dilakukan secara eksplisit.

Saya menyarankan "AES/CBC/PKCS5Padding" sebagai pilihan yang jelas.

person rossum    schedule 21.07.2012
comment
Semuanya benar, tetapi karena AES/ECB/PKCS5Padding digunakan secara default, ini bukan merupakan jawaban. - person Maarten Bodewes; 21.07.2012
comment
Mode ECB tidak aman, hindarilah. CBC atau CTR aman. Gunakan GCM jika Anda ingin autentikasi juga. Lebih baik tidak bergantung pada default, ini dapat menyebabkan kesalahan. Apa default di pihak penerima? - person rossum; 21.07.2012
comment
Saya pikir pihak penerima disertakan dalam kode (enkripsi dan dekripsi ditentukan); masalahnya adalah kode tersebut sebenarnya berfungsi dengan baik. Catatan: Saya bukan penulis pertanyaan tersebut. - person Maarten Bodewes; 21.07.2012
comment
Ya, kodenya berfungsi dengan baik.. Maksud saya, kode tersebut berfungsi dengan baik saat saya menjalankan main(). Saya meneruskan sebuah string, menampilkannya setelah mengenkripsinya dan kemudian menampilkannya lagi setelah mendekripsinya. Semuanya baik-baik saja sampai saat ini. Tetapi ketika saya mengirim email yang berisi tautan dengan string terenkripsi sebagai parameternya, saya mendapat pengecualian saat mengunjungi tautan tersebut. - person kunal18; 22.07.2012
comment
Apakah Anda mendekripsi email di mesin yang sama atau di mesin berbeda? Sudahkah Anda memeriksa bahwa email terenkripsi yang diterima sama byte-demi-bytenya dengan email yang Anda kirim? - person rossum; 23.07.2012