【问题标题】:Encrypting and decrypting a file using CipherInputStream and CipherOutputStream使用 CipherInputStream 和 CipherOutputStream 加密和解密文件
【发布时间】:2017-01-01 16:23:09
【问题描述】:

我一直在尝试用 AES 编写一个加密文件,然后使用 JCA 中提供的密码流对其进行解密。但是,我在读取文件时遇到了问题,因为解密出了问题。

public class CipherStreams {
public static void main(String[] args) {
    try {
        KeyGenerator keygen = KeyGenerator.getInstance("AES");
        Key k = keygen.generateKey();

        Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");
        aes.init(Cipher.ENCRYPT_MODE, k);
        FileOutputStream fs = new FileOutputStream("Encrypyed.txt");
        CipherOutputStream out = new CipherOutputStream(fs, aes);
        out.write("[Hello:Okay]\nOkay".getBytes());
        out.close();

        Cipher aes2 = Cipher.getInstance("AES/ECB/PKCS5Padding");
        aes2.init(Cipher.DECRYPT_MODE, k);

        FileInputStream fis = new FileInputStream("Encrypyed.txt");
        CipherInputStream in = new CipherInputStream(fis,aes2);
        byte[] b = new byte[8];
        int i = in.read(b);
        while(i!=-1) {
            System.out.print((char)i);
            i = in.read(b);
        }
    } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IOException ex) {
        Logger.getLogger(CipherStreams.class.getName()).log(Level.SEVERE, null, ex);
    }
}
}

我收到一个单字节输出为 5。谁能帮忙指出问题?

【问题讨论】:

    标签: java encryption jce


    【解决方案1】:

    您不是在写入读取的字节数,而是在写入正在读取的字节数。

    您还假设默认平台编码只是将每个字符转换为一个字节。

    只需与你在写时做的相反:读取所有内容,并将读取的字节数组转换为字符串,然后打印该字符串:

    public class CipherStreams {
        public static void main(String[] args) {
            try {
                KeyGenerator keygen = KeyGenerator.getInstance("AES");
                Key k = keygen.generateKey();
    
                Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");
                aes.init(Cipher.ENCRYPT_MODE, k);
                String fileName = "Encrypted.txt";
                FileOutputStream fs = new FileOutputStream(fileName);
                CipherOutputStream out = new CipherOutputStream(fs, aes);
                out.write("[Hello:Okay]\nOkay".getBytes());
                out.flush();
                out.close();
    
                Cipher aes2 = Cipher.getInstance("AES/ECB/PKCS5Padding");
                aes2.init(Cipher.DECRYPT_MODE, k);
    
                FileInputStream fis = new FileInputStream(fileName);
                CipherInputStream in = new CipherInputStream(fis, aes2);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
    
                byte[] b = new byte[1024];
                int numberOfBytedRead;
                while ((numberOfBytedRead = in.read(b)) >= 0) {
                    baos.write(b, 0, numberOfBytedRead);
                }
                System.out.println(new String(baos.toByteArray()));
            }
            catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IOException ex) {
                ex.printStackTrace();
                ;
            }
        }
    }
    

    【讨论】:

    • 这行得通。我没有意识到我正在写读取的字节数。谢谢!
    • 有效,但可以在阅读部分通过BufferedReader d = new BufferedReader(new InputStreamReader(new CipherInputStream(fis, cipher))); String decrypted = d.readLine();进行简化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2021-10-20
    • 2017-08-18
    相关资源
    最近更新 更多