Saya mencoba menerapkan algoritma enkripsi berbasis kata sandi, tetapi saya mendapatkan pengecualian ini:
javax.crypto.BadPaddingException: Mengingat blok terakhir tidak diisi dengan benar
Apa masalahnya?
Ini kode saya:
public class PasswordCrypter {
private Key key;
public PasswordCrypter(String password) {
try{
KeyGenerator generator;
generator = KeyGenerator.getInstance("DES");
SecureRandom sec = new SecureRandom(password.getBytes());
generator.init(sec);
key = generator.generateKey();
} catch (Exception e) {
e.printStackTrace();
}
}
public byte[] encrypt(byte[] array) throws CrypterException {
try{
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(array);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public byte[] decrypt(byte[] array) throws CrypterException{
try{
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(array);
} catch(Exception e ){
e.printStackTrace();
}
return null;
}
}
(Tes JUnit)
public class PasswordCrypterTest {
private static final byte[] MESSAGE = "Alpacas are awesome!".getBytes();
private PasswordCrypter[] passwordCrypters;
private byte[][] encryptedMessages;
@Before
public void setUp() {
passwordCrypters = new PasswordCrypter[] {
new PasswordCrypter("passwd"),
new PasswordCrypter("passwd"),
new PasswordCrypter("otherPasswd")
};
encryptedMessages = new byte[passwordCrypters.length][];
for (int i = 0; i < passwordCrypters.length; i++) {
encryptedMessages[i] = passwordCrypters[i].encrypt(MESSAGE);
}
}
@Test
public void testEncrypt() {
for (byte[] encryptedMessage : encryptedMessages) {
assertFalse(Arrays.equals(MESSAGE, encryptedMessage));
}
assertFalse(Arrays.equals(encryptedMessages[0], encryptedMessages[2]));
assertFalse(Arrays.equals(encryptedMessages[1], encryptedMessages[2]));
}
@Test
public void testDecrypt() {
for (int i = 0; i < passwordCrypters.length; i++) {
assertArrayEquals(MESSAGE, passwordCrypters[i].decrypt(encryptedMessages[i]));
}
assertArrayEquals(MESSAGE, passwordCrypters[0].decrypt(encryptedMessages[1]));
assertArrayEquals(MESSAGE, passwordCrypters[1].decrypt(encryptedMessages[0]));
try {
assertFalse(Arrays.equals(MESSAGE, passwordCrypters[0].decrypt(encryptedMessages[2])));
} catch (CrypterException e) {
// Anything goes as long as the above statement is not true.
}
try {
assertFalse(Arrays.equals(MESSAGE, passwordCrypters[2].decrypt(encryptedMessages[1])));
} catch (CrypterException e) {
// Anything goes as long as the above statement is not true.
}
}
}
javax.crypto.BadPaddingException: Given final block not properly padded
. Haruskah saya memperlakukan ini sebagai kunci yang salah?tergantung pada algoritma kriptografi yang Anda gunakan, Anda mungkin harus menambahkan beberapa padding byte di akhir sebelum mengenkripsi array byte sehingga panjang array byte adalah kelipatan dari ukuran blok:
Khususnya dalam kasus Anda skema padding yang Anda pilih adalah PKCS5 yang dijelaskan di sini: http://www.rsa.com/products/bsafe/documentation/cryptoj35html/doc/dev_guide/group_ CJ _SYM__PAD.html
(Saya berasumsi Anda memiliki masalah saat mencoba mengenkripsi)
Anda dapat memilih skema padding Anda saat Anda membuat instance objek Cipher. Nilai yang didukung bergantung pada penyedia keamanan yang Anda gunakan.
Ngomong-ngomong, apakah Anda yakin ingin menggunakan mekanisme enkripsi simetris untuk mengenkripsi sandi? Bukankah lebih baik hash satu arah? Jika Anda benar-benar harus dapat mendekripsi kata sandi, DES adalah solusi yang cukup lemah, Anda mungkin tertarik untuk menggunakan sesuatu yang lebih kuat seperti AES jika Anda ingin tetap menggunakan algoritme simetris.
sumber
Saya menemui masalah ini karena sistem operasi, platform sederhana untuk berbeda tentang implementasi JRE.
akan mendapatkan nilai yang sama di Windows, sedangkan di Linux berbeda. Jadi di Linux perlu diubah menjadi
"SHA1PRNG" adalah algoritme yang digunakan, Anda dapat merujuk di sini untuk info selengkapnya tentang algoritme.
sumber
Ini juga bisa menjadi masalah ketika Anda memasukkan kata sandi yang salah untuk kunci tanda Anda.
sumber