文件加密和解密在Java中,解密不起作用

时间:2017-05-09 14:18:25

标签: java file encryption des

大家好我必须这样做,我可以根据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();
        }

1 个答案:

答案 0 :(得分:2)

您的代码在这里:

    while ((bytesReads = fis.read(encText)) != -1) {
        fis.read(decrypt.doFinal(encText), 0, bytesReads);
    }

显然是错误的:您需要编写通过调用decrypt.doFinal生成的纯文本,就像在加密过程中一样。目前,您正在通过下一个密文块覆盖生成的明文,因为您在循环中调用read两次。

此外,根据您的DES Cipher实施,您忘记了IV。

许多其他事情也是错误的,包括:

  • 使用getAvailable();
  • 进行流处理
  • 使用56位DES密码;
  • 使用ECB模式;
  • 重复调用doFinal(这导致了非常大的开销和不安全的代码);
  • 未使用CipherInputStreamCipherOutputStream(等等);
  • 使用字符串作为键;
  • 发生异常时忘记关闭流(使用try资源);
  • printStackTracke()异常处理;
  • 使用static字段作为变量。

new String(encText)中使用平台编码可能只是错误的。

请注意,使用错误的密钥/密文组合可能也会导致此错误。

相关问题