我正在尝试加密和解密任何类型的文件,并使用解密文件存储到我的本地系统。我使用以下代码执行此操作。
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();
}
}
在上面的代码中,解密文件存储在本地系统内存中。但我需要使用解密文件而不存储到我的系统中。因为我不希望其他人使用我的解密文件。任何人都可以帮我解决这个问题吗?
答案 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/