Tôi có một tệp khóa riêng được viết bằng DES/ECB/PKCS5Padding (khóa 56 bit DES được tạo bởi một cụm từ bí mật) và tôi muốn giải mã nó. Tôi không biết tại sao, nhưng mỗi lần tôi cố gắng decript, phương pháp doFinal của lớp mật mã của tôi là ném lỗi này:BadPaddingException: Cho khối cuối cùng không đúng đệm
javax.crypto.BadPaddingException: Given final block not properly padded at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) at com.sun.crypto.provider.DESCipher.engineDoFinal(DashoA13*..) at javax.crypto.Cipher.doFinal(DashoA13*..) at...
Đây là mã của tôi:
public static PrivateKey readPrivateKeyFromFile(File file, String chaveSecreta) {
try {
SecureRandom r = new SecureRandom(chaveSecreta.getBytes());
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
keyGen.init(56, r);
Key key = keyGen.generateKey();
byte[] privateKeyBytes = decryptPKFile(file, key);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
PrivateKey privateKey = null;
try {
privateKey = keyFactory.generatePrivate(privateKeySpec);
} catch (InvalidKeySpecException e) {
JOptionPane.showMessageDialog(null, "Erro 01, tente mais tarde");
}
return privateKey;
} catch (NoSuchAlgorithmException e) {
JOptionPane.showMessageDialog(null, "Erro 02, tente mais tarde");
}
return null;
}
public static byte[] decryptPKFile(File file, Key key){
try{
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
byte[] cipherText = readBytes(file);
cipher.init(Cipher.DECRYPT_MODE, key);
System.out.println(cipher);
System.out.println(cipherText);
byte[] text = cipher.doFinal(cipherText);
return text;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
public static byte[] readBytes(File file) {
try {
FileInputStream fs = new FileInputStream(file);
byte content[] = new byte[(int) file.length()];
fs.read(content);
return content;
} catch (FileNotFoundException e) {
System.out.println("Arquivo não encontrado!");
e.printStackTrace();
} catch (IOException ioe) {
System.out.println("Erro ao ler arquivo!");
ioe.printStackTrace();
}
return null;
}
Bất kỳ syggestions?
Tôi đoán đầu vào bạn đọc từ tệp không phải là văn bản được mã hóa hợp lệ. Với DES là thuật toán khối, bạn nên kiểm tra xem chiều dài của tập tin là phép nhân của 64. Nếu không, nó sẽ có nghĩa là, tập tin đó bị hỏng. – markubik
Bạn có nghĩa là bội số của 8? Đó là, tập tin không bị hỏng, tôi đã kiểm tra. –
@markubik Đó là một khóa ngẫu nhiên: P –