我相信 CipherInputStream 可能会对您有所帮助。它的功能与普通的 InputStream 对象一样,但也应用了 Cipher(加密或解密)。如果您想以非纯文本格式读取文件,请使用 CipherOutputStream 写入文件,然后像在另一端使用 CipherInputStream 的任何其他文件一样正常读取它。
如果您的文件已经加密(听起来确实如此),您只需要将 CipherInputStream 初始化为用于创建本机代码的任何加密方法。
FileInputStream in = new FileInputStream("YOUR DIRECTORY");
Cipher decryptionCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, createKey(password));
CipherInputStream ciphIn = new CipherInputtStream(in, decryptionCipher);
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[8];
int i = in.read(buffer);
while (i != -1)
{
//just like a file copy
out.write(buffer, 0, i)
i = in.read(buffer);
}
/*
* YOUR NATIVE DATA UNENCRYPTED
*/
byte[] nativeFileData = out.toByteArray();
ciphIn.close();
in.close();
创建密钥方法:
public SecretKey createKey(String password) throws NoSuchAlgorithmException, InvalidKeySpecException
{
//hash the password
MessageDigest msgDigest = MessageDigest.getInstance("SHA-1");
msgDigest.update(key);
byte[] hash = msgDigest.digest();
byte[] salt = new byte[8]{};
new SecureRandom(hash).nextBytes(salt);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec keySpec = new PBEKeySpec(hash, salt, 65536, 128);
SecretKey tmp = factory.generateSecret(keySpec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
return secret;
}
您现在将拥有一个包含本机未加密字节的字节数组。所以现在你可以使用 JNI/JNA 类来运行它(假设它像一个 exe 或其他东西)。可以将本机代码加载到内存中。然后将该内存分配为可执行文件,您可以使用本机系统调用将其作为汇编指令运行。已经有一篇关于这样做的堆栈溢出文章位于here。由您决定以 JNI 格式实现它。
就打开 PDF/DOCS 文件而言,您说的是使用您一无所知的系统调用接口的专有程序读取专有文件格式。我也很困惑为什么用户可以打开这些文件并查看内容,但他们无法访问该文件。如果你能澄清那将是很棒的。您可以做的是获取此字节数组并使用库将 pdf 渲染为 png 图像,然后使用 javafx 显示图像。
我知道这个答案并不正确,但我希望它对您有所帮助或至少为您指明正确的方向。
干杯。