如何使用java将文件解密到系统内存?

时间:2015-12-22 05:48:31

标签: java encryption

我正在尝试加密和解密任何类型的文件,并使用解密文件存储到我的本地系统。我使用以下代码执行此操作。

package get;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class CipherExample {

    public static void main(String[] args) {
        try {
            String key = "squirrel123"; // needs to be at least 8 characters for DES

            FileInputStream fis = new FileInputStream("/home/anand/Desktop/encrypt/c/cute.jpg");
            FileOutputStream fos = new FileOutputStream("/home/anand/Desktop/encrypt/c/encrypted.jpg");
            encrypt(key, fis, fos);

            FileInputStream fis2 = new FileInputStream("/home/anand/Desktop/encrypt/c/encrypted.jpg");
            FileOutputStream fos2 = new FileOutputStream("/home/anand/Desktop/encrypt/c/decrypted.jpg");
            decrypt(key, fis2, fos2);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public static void encrypt(String key, InputStream is, OutputStream os) throws Throwable {
        encryptOrDecrypt(key, Cipher.ENCRYPT_MODE, is, os);
    }

    public static void decrypt(String key, InputStream is, OutputStream os) throws Throwable {
        encryptOrDecrypt(key, Cipher.DECRYPT_MODE, is, os);
    }

    public static void encryptOrDecrypt(String key, int mode, InputStream is, OutputStream os) throws Throwable {

        DESKeySpec dks = new DESKeySpec(key.getBytes());
        SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
        SecretKey desKey = skf.generateSecret(dks);
        Cipher cipher = Cipher.getInstance("DES"); // DES/ECB/PKCS5Padding for SunJCE

        if (mode == Cipher.ENCRYPT_MODE) {
            cipher.init(Cipher.ENCRYPT_MODE, desKey);
            CipherInputStream cis = new CipherInputStream(is, cipher);
            doCopy(cis, os);
        } else if (mode == Cipher.DECRYPT_MODE) {
            cipher.init(Cipher.DECRYPT_MODE, desKey);

            // PipedInputStream pis = new PipedInputStream();
               // PipedOutputStream pos = new PipedOutputStream(pis);

            CipherOutputStream cos = new CipherOutputStream(os, cipher);
            //doCopying(is);

            doCopy(is, os);
        }
    }

    public static void doCopy(InputStream is, OutputStream os) throws IOException {
        byte[] bytes = new byte[64];
        int numBytes;
        while ((numBytes = is.read(bytes)) != -1) {
            os.write(bytes, 0, numBytes);
        }
        os.flush();
        os.close();
        is.close();

    }


    }

在上面的代码中,解密文件存储在本地系统内存中。但我需要使用解密文件而不存储到我的系统中。因为我不希望其他人使用我的解密文件。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

如果我正确地阅读您的问题,您希望解密文件保存在内存中,而不是将其写入磁盘,以便其他进程可以看到它?为此,请解密为ByteArrayOutputStream。解密完成后,您就可以将字节数组输出并按照您的选择使用它。 (它是文本数据吗?有一个String构造函数可以将其转换回字符串;当你这样做时,强烈建议指定Charset。)< / p>

此技术不适合非常大的文件。在这种情况下,直接流式传输到文件是首选选项。您需要注意确保正确设置文件权限。

答案 1 :(得分:0)

前段时间我正在研究如何使用本机java库解密受密码保护的zip文件。我找到了这个网站,该人使用FileInputStream并在运行中解密。所以这听起来很相似,你可以调整他用于你的应用程序的解密方法。

http://blog.alutam.com/2009/10/31/reading-password-protected-zip-files-in-java/