假设我有一个文件“hello.txt”,其中包含“Hello,world!”文本。 我有应用程序“textreader”,它读取文件hello.txt并将其放入stdout。 接下来,我已经加密了文件“hello.txt”。可以解密它一个可以逐字节读取文件的特殊库。
我可以使用应用程序“textreader”使用我的库(或我的应用程序)从加密文件中读取普通文件吗?我不能根据问题的条款写一些临时文件。
可以使用命名管道(mkfifo),但先决条件是支持搜索。文件必须随机阅读。
如果我没有“textreader”的源代码,有没有人有任何想法可以做到这一点?
答案 0 :(得分:1)
编写一个替换标准Linux I / O例程的共享库,并load it with LD_PRELOAD。
如果应用程序动态链接到C库,这将起作用 - 如果" textreader"直接进行系统调用,然后拦截不起作用。
另见:
答案 1 :(得分:1)
如何简单地使用stdin?
如果textreader应用程序将hello.txt
转换为stdout,只需将textreader的输出传递给您自己的应用程序/脚本。例如:
$ ./textreader | ./myapp
根据您决定在应用程序中使用的语言,您可以像处理大多数流一样处理stdin。
以下SO答案应该为您提供有关如何从不同语言的stdin读取的更多信息:
维基百科也provides some helpful information regarding stdin。
编辑:正如您最初提出的那样,大多数流都是可搜索的。我在C ++中写了一个小例子,展示了如何寻找stdin
。
#include <iostream>
int main(void) {
int i = 0;
std::string buffer;
while (not std::cin.eof()) {
std::getline(std::cin, buffer);
if (buffer.find("while") != std::string::npos)
if (i < 10)
std::cin.seekg(0, std::ios::beg);
else
std::cin.seekg(0, std::ios::end);
std::cout << "Line " << i++ << ": " << buffer << std::endl;
}
return 0;
}
您可以使用g++ test.cpp -o test
编译代码,然后使用./test < test.cpp
运行代码。代码将两次输出文件的开头,直到while循环的开头。除了一次从stdin
读取一行之外,不会进行缓冲。
答案 2 :(得分:1)
通常,这是使用文件系统过滤器驱动程序完成的,该驱动程序将即时执行解密。为了支持随机搜索,您必须加密独立块(64-256Kb大)中的数据,并以解密形式将这些块缓存在内存中。这不是一项微不足道的任务,但可以完成。我不知道如何在Linux上实现过滤器驱动程序(我们为Windows提供类似的产品)。
答案 3 :(得分:0)
如何将加密文件加载到内存中并从内存缓冲区解密? 某些脚本语言(如perl,python等)可以读取整个文件并将其分配给变量