我正致力于创建遗忘图算法,它基本上隐藏了算法的内存访问模式。假设内存已加密,但可由攻击者监控。假设处理器位于云中,是安全的,并且具有自己的缓存。
众所周知,图表的访问模式可以揭示有关该图表的信息。
为了使算法无视,有必要在算法中添加虚拟工作。这样的工作包括读取和写入数据,但这样做的方式是不会导致算法的结果发生变化(这种变化会使算法失效,当然)。
虚拟工作必须在图表本身上,否则攻击者将能够追踪哪些工作是真实的,哪些工作是假的。
当然,添加虚拟工作会导致速度减慢。因此,作为精益解决方案,我想为自己分配一个变量。这将创建对位置的读取和写入,而不实际更改任何内容。我的问题是,编译器实际执行此代码(它似乎在gdb中,但这只是因为它是一个调试器)?我使用的是gcc,但如果算法可以用不同的编译器进行编译并且仍然没有被遗忘,那将是最好的。
设置变量等于自身的替代方法是使用if语句:检查变量是否等于某个值,然后将变量设置为if语句中的该值。如果可能的话,我想避免if语句,因为它们会减慢速度。
最后,这个算法是多线程的。如果全局变量设置为等于它自己,是否需要在其上放置互斥锁?这样的锁当然会减慢速度,所以我想尽可能避免使用它们。
答案 0 :(得分:0)
编译器优化器可能会在编译器时完全删除该语句,因此不会执行它。调试通常不会使用优化代码,因为您逐步执行每个语句,以便在那里执行。如果需要,可以关闭编译器优化,然后进行测试。 gcc的标志是-O0
How to disable compiler optimizations in gcc?
编辑:关于你的多线程问题,取决于。如果对变量的唯一访问是自我赋值,那么不会因为无论运行多少线程,交错执行都不会更改变量的值。但是,如果至少有一个线程以某种其他方式改变变量,则必须使用锁。