gpt4 book ai didi

java - 如何使用java解密没有存储到系统内存中的文件?

转载 作者:行者123 更新时间:2023-11-30 10:52:15 24 4
gpt4 key购买 nike

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

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();

}


}

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

最佳答案

如果我没看错您的问题,您想将解密文件保存在内存中,而不是将其写入磁盘以供其他进程查看?为此,解密为 ByteArrayOutputStream。解密完成后,您就可以取出字节数组并按照您的选择使用它。 (它是文本数据吗?有一个 String 构造函数可以将其转换回字符串;强烈建议您在以下情况下指定 Charset你这样做。)

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

关于java - 如何使用java解密没有存储到系统内存中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34409246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com