大家好我必须这样做,我可以根据des算法加密文件,但我不能再次decyrpt文件,我收到错误信息那样:
javax.crypto.BadPaddingException给定最终块未正确填充
我无法解密文件我无法找到原因。请你帮帮我吧 感谢你们。
JAVA CODE:
public class Sifreleme {
public static void encrypt(){
try {
SecretKey key = KeyGenerator.getInstance("DES").generateKey();
FileOutputStream fosKey = new FileOutputStream("..\\KEY");
SecretKeyFactory keyfac = SecretKeyFactory.getInstance("DES");
DESKeySpec keyspec = (DESKeySpec) keyfac.getKeySpec(key, DESKeySpec.class);
fosKey.write(keyspec.getKey());
fosKey.close();
Cipher crypt = Cipher.getInstance("DES");
crypt.init(Cipher.ENCRYPT_MODE, key);
FileInputStream fis = new FileInputStream("C:\\Users\\akif\\Desktop\\zilsesi.mp3");
FileOutputStream fos = new FileOutputStream("C:\\Users\\akif\\Desktop\\sifrelenenzilsesi.mp3");
byte[] arrayBytes = new byte[8];
int bytesReads;
while ((bytesReads = fis.read(arrayBytes)) != -1) {
fos.write(crypt.doFinal(arrayBytes), 0, bytesReads);
}
fis.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void decrypt(){
try {
FileInputStream fisKey = new FileInputStream("..\\KEY");
byte[] arrayKey = new byte[fisKey.available()];
fisKey.read(arrayKey);
SecretKey key = new SecretKeySpec(arrayKey, "DES");
Cipher decrypt = Cipher.getInstance("DES");
decrypt.init(Cipher.DECRYPT_MODE, key);
FileInputStream fis = new FileInputStream("C:\\Users\\akif\\Desktop\\sifrelenenzilsesi.mp3");
byte[] encText = new byte[16];
int bytesReads;
while ((bytesReads = fis.read(encText)) != -1) {
fis.read(decrypt.doFinal(encText), 0, bytesReads);
}
fis.close();
System.out.println(new String(encText));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String []args) throws IOException{
encrypt();
decrypt();
}
答案 0 :(得分:2)
您的代码在这里:
while ((bytesReads = fis.read(encText)) != -1) {
fis.read(decrypt.doFinal(encText), 0, bytesReads);
}
显然是错误的:您需要编写通过调用decrypt.doFinal
生成的纯文本,就像在加密过程中一样。目前,您正在通过下一个密文块覆盖生成的明文,因为您在循环中调用read
两次。
此外,根据您的DES Cipher
实施,您忘记了IV。
许多其他事情也是错误的,包括:
getAvailable()
; doFinal
(这导致了非常大的开销和不安全的代码); CipherInputStream
和CipherOutputStream
(等等); try
资源); printStackTracke()
异常处理; static
字段作为变量。 在new String(encText)
中使用平台编码可能只是错误的。
请注意,使用错误的密钥/密文组合可能也会导致此错误。