2016-06-16 8 views
1

Ich arbeite daran, objektive Graphalgorithmen zu erstellen, die im Grunde das Speicherzugriffsmuster eines Algorithmus verbergen. Es wird angenommen, dass der Speicher verschlüsselt ist, aber von einem Angreifer überwacht werden kann. Es wird davon ausgegangen, dass sich der Prozessor in der Cloud befindet, sicher ist und über einen eigenen Cache verfügt.Wird das Setzen einer Variablen, die sich selbst entspricht, tatsächlich in C++ ausgeführt?

Es ist bekannt, dass das Zugriffsmuster eines Diagramms Informationen über dieses Diagramm enthalten kann.

Um einen Algorithmus unbemerkt zu machen, ist es notwendig, dem Algorithmus Dummy-Arbeit hinzuzufügen. Eine solche Arbeit beinhaltet das Lesen und Schreiben von Daten, jedoch auf eine Weise, dass die Ergebnisse des Algorithmus nicht verändert werden (solche Änderungen würden den Algorithmus natürlich nutzlos machen).

Es ist notwendig, dass die Dummy-Arbeit in der Grafik selbst ist, sonst könnte der Angreifer verfolgen, welche Arbeit echt ist und welche Arbeit gefälscht ist.

Natürlich schafft Dummy Arbeit Verlangsamungen. Daher möchte ich als eine schlanke Lösung mir selbst eine Variable zuweisen. Dies würde ein Lesen und Schreiben zu einem Ort erzeugen, ohne tatsächlich irgendetwas zu ändern. Meine Frage ist, führen Compiler diesen Code tatsächlich aus (es scheint in gdb, aber ist das nur, weil es ein Debugger ist)? Ich benutze gcc, aber es wäre am besten, wenn der Algorithmus mit verschiedenen Compilern kompiliert werden könnte und trotzdem unbemerkt bleiben würde.

Die Alternative zum Festlegen einer Variablen, die sich selbst entspricht, wäre die Verwendung einer if-Anweisung: Überprüfen Sie, ob die Variable einem Wert entspricht, und legen Sie die Variable innerhalb der if-Anweisung auf diesen Wert fest. Wenn möglich, würde ich gerne Aussagen vermeiden, weil sie die Dinge verlangsamen.

Schließlich ist dieser Algorithmus Multithread. Wenn eine globale Variable gleich gesetzt ist, muss sie mit einem Mutex-Lock versehen werden? Solche Sperren werden natürlich die Dinge verlangsamen, daher möchte ich sie, wenn möglich, vermeiden.

+7

Die "als ob" -Regel bedeutet, dass Compiler alles optimieren können, was sie nachweisen können, ohne sichtbare Wirkung (im Rahmen der Sprache). Dies umfasst die Selbstzuweisung oder das Zuweisen eines Werts zu einer Variablen, die der Compiler beweisen kann, hat bereits diesen Wert. Sie müssen flüchtige Stoffe oder vielleicht Atomics verwenden. –

+0

Sie können definitiv überprüfen, ob ein Compiler mehrere Optimierungsebenen angegeben hat, indem Sie die Assembly überprüfen. – chris

+0

Ich bin mir ziemlich sicher, dass die Deklaration der Variablen "volatile" die Optimierung von Zuweisungen, sogar von Eigenzuweisungen, verhindern sollte. – Barmar

Antwort

0

Der Compiler-Optimierer würde diese Anweisung zum Compiler-Zeitpunkt wahrscheinlich vollständig entfernen, sodass sie wahrscheinlich nicht ausgeführt wird. Debuggen verwendet normalerweise keinen optimierten Code, da Sie jede Anweisung durchlaufen, damit sie dort ausgeführt wird. Wenn Sie möchten, können Sie die Compiler-Optimierung deaktivieren und dann Ihre Tests durchführen. Die Flagge für gcc ist -O0

How to disable compiler optimizations in gcc?

Edit: Über Ihre multithreaded Frage, hängt davon ab. Wenn der einzige Zugriff auf die Variable die self-Zuweisung ist, dann no, weil die interleaved-Ausführung den Wert der Variablen nicht ändern würde, egal wie viele Threads laufen. Wenn jedoch mindestens ein Thread die Variable auf andere Weise mutiert, müssten Sie Sperren verwenden.

+0

Danke. Ich habe in den Kommentaren entdeckt, dass es keinen Sinn macht, eine Selbstzuweisung vorzunehmen, da der Chiffretext sich nicht ändert, obwohl das Zugriffsmuster nicht beachtet würde. Konnte den Wald nicht für die Bäume sehen. –