-
Die Erfindung betrifft allgemein das technische Gebiet des Ausspähungsschutzes bei tragbaren Datenträgern. Spezieller betrifft die Erfindung das technische Gebiet, das Ausspähen von geheimzuhaltenden Daten zu verhindern, wenn ein tragbarer Datenträger eine Operationssequenz ausführt und dabei Cache-Zugriffe erfolgen. Ein tragbarer Datenträger im Sinne des vorliegenden Dokuments kann z. B. eine Chipkarte (smart card) in unterschiedlichen Bauformen oder ein Chipmodul oder ein sonstiges ressourcenbeschränktes System mit mindestens einem Prozessorkern, einem Hauptspeicher und einem Cache-Speicher sein.
-
Tragbare Datenträger werden oft für sicherheitskritische Anwendungen eingesetzt, beispielsweise bei Finanztransaktionen, zur Authentisierung im Mobilfunk, als Signaturkarte zur elektronischen Unterschrift und so weiter. Da durch eine unbefugte Verwendung hoher Schaden entstehen könnte, müssen geheime Daten, die auf solchen Datenträgern gespeichert sind, zuverlässig vor Ausspähung und Manipulation geschützt werden.
-
Es sind diverse Angriffsverfahren bekannt, bei denen physikalische Parameter des Datenträgers während der Programmausführung gemessen werden, um Rückschlüsse auf geheimzuhaltende Daten zu ziehen. Beispielsweise wird bei der einfachen Stromanalyse (SPA = Simple Power Analysis) die Stromaufnahme des Datenträgers während eines Berechnungsablaufs gemessen und untersucht. Bei der differentiellen Stromanalyse (DPA = Differential Power Analysis) wird dagegen die Stromaufnahme über viele Berechnungsabläufe hinweg statistisch ausgewertet.
-
Die gerade genannten Angriffe werden allgemein als Seitenkanalangriffe bezeichnet, weil der Informationsfluss nicht über den primären Kommunikationskanal des Datenträgers, sondern daran vorbei erfolgt. Kapitel 16.5.1 des Buches
"Handbuch der Chipkarten" von W. Rankl und W. Effing, Hauser Verlag, 5. Auflage, 2008, Seiten 740–771, gibt einen Überblick über diverse Angriffs- und Abwehrverfahren. Die Abwehr von Seitenkanalangriffen ist auch Thema diverser Patentdokumente wie zum Beispiel der Offenlegungsschriften
DE 198 22 218 A1 ,
WO 99/35782 A1 ,
WO 99/67919 A2 und
US 2002/ 0124178 A1 .
-
Untersuchungen haben gezeigt, dass bei leistungsfähigen Datenträgern, die einen Cache-Speicher aufweisen, zusätzliche Möglichkeiten für Seitenkanalangriffe bestehen. Es ist nämlich in der Regel möglich, aus dem Zeitverhalten und/oder dem Stromaufnahmemuster bei der Programmausführung zu bestimmen, ob ein Cache-Treffer (cache hit) oder ein Cache-Fehlschlag (cache miss) auftritt. Aus dieser Information können wiederum Rückschlüsse auf geheimzuhaltende Daten gezogen werden, wenn diese Daten mit der ausgeführten Operationssequenz – und insbesondere mit den Datenwerten, auf die bei dieser Operationssequenz zugegriffen wird – korreliert sind.
-
Als Beispiel für eine ausspähungsgefährdete Operationssequenz sei die modulare Potenzierung, auch bekannt als „modulare Exponentiation”, eines Datenwertes v1 mit einem Exponenten d nach dem gut bekannten ”Quadriere und Multipliziere”-Verfahren (square and multiply method) genannt. Dieses Verfahren ist beispielsweise als Verfahren 2.143 in dem Buch
"Handbook of Applied Cryptography" von A. Menezes, P. van Oorschot und S. Vanstone, CRC Press, 1996, Seite 71, beschrieben. Eine modulare Potenzierung wird z. B. bei RSA-Berechnungen verwendet. Der Exponent d bildet den privaten RSA-Schlüssel und muss daher vor Ausspähung geschützt werden.
-
Die Berechnung von v1d mod N nach dem ”Quadriere und Multipliziere”-Verfahren erfolgt in einer Schleife, die für jedes Bit des Exponenten d – beginnend mit dem höchstwertigen Bit – je einmal durchlaufen wird. Bei jedem Schleifendurchlauf wird zunächst ein Zwischenwert v2 quadriert.
-
Wenn das betrachtete Bit des Exponenten d den Wert ”1” aufweist, so wird ferner der Zwischenwert v2 mit dem Datenwert v1 multipliziert. Insgesamt ergibt sich das folgende Verfahren; die Bitpositionen des Exponenten d seien hierbei mit d(i) für i = 0, 1, ..., k bezeichnet, so dass d = Σi=0,1,...,k d(i)·2i gilt:
SETZE v2 := 1
FÜR i = k, (k-1), ..., 1, 0, FÜHRE AUS
SETZE v2 := v2·v2 mod N
WENN d(i) = 1 DANN SETZE v2 := v2·v1 mod N
-
Nach dem Berechnungsablauf gilt dann v2 = v1d mod N. Das Zugriffsmuster auf die Datenwerte v1 und v2 während der Berechnung hängt von den Bits des geheimzuhaltenden Exponenten d ab.
-
Die Datenwerte v1 und v2 können beispielsweise eine Größe von je 256 Byte (2048 Bit) aufweisen. Der Cache-Speicher ist bei tragbaren Datenträgern in der Regel relativ klein und kann z. B. eine Größe von 2 KByte aufweisen. Wenn der Cache-Speicher bereits zum Teil mit anderen Daten belegt ist, dann ist möglicherweise nur genügend Platz für einen der beiden Datenwerte v1 und v2 – nicht jedoch für beide – vorhanden. In diesem Fall ergibt sich bei jedem Schleifendurchlauf mit d(i) = 1 mindestens ein Cache-Fehlschlag, weil zumindest der Datenwert v1 nachgeladen werden muss. Bei aufeinanderfolgenden Schleifendurchläufen mit d(i) = 0 treten dagegen keine Cache-Fehlschläge auf, weil stets nur auf den Datenwert v2 zugegriffen wird. Wie bereits erwähnt, ist zu erwarten, dass Cache-Fehlschläge aus dem Stromverlaufsbild erkennbar sind, so dass ein Angreifer Rückschlüsse auf die Bits des Exponenten d ziehen kann.
-
Bei manchen Mikrocontrollern sind spezielle Befehle vorgesehen, um Daten dauerhaft im Cache zu halten; dies wird als ”Blocken” des Cache bezeichnet.
-
Bei jedem Zugriff auf die geblockten Daten treten dann ausschließlich Cache-Treffer auf. Das Volumen der sicher verarbeitbaren Daten ist jedoch auf die Cache-Größe beschränkt. Es wäre wünschenswert, dieser Beschränkung nicht unterworfen zu sein.
-
Andere Mikrocontroller weisen keine Cache-Block-Befehle auf. Es wäre wünschenswert, auch in diesem Fall Angriffe der oben genannten Art zuverlässig zu verhindern.
-
Die Erfindung hat demgemäß die Aufgabe, die oben genannten Probleme ganz oder zum Teil zu lösen und eine Technik zum Schutz einer von einem tragbaren Datenträger ausgeführten Operationssequenz gegen Ausspähung zu schaffen, wobei das abzuwehrende Angriffsszenario auf einer Auswertung der Cache-Zugriffe – insbesondere der Cache-Treffer und Cache-Fehlschläge – während des Ausführers der Operationssequenz beruht. In bevorzugten Ausgestaltungen soll die Erfindung auch einsetzbar sein, wenn die Operationssequenz auf große Datenmengen zugreift oder wenn der Datenträger keine Cache-Block-Befehle unterstützt.
-
Erfindungsgemäß wird diese Aufgabe ganz oder zum Teil gelöst durch ein Verfahren mit den Merkmalen des Anspruchs 1, ein Computerprogrammprodukt gemäß Anspruch 11 und eine Vorrichtung, insbesondere einen tragbaren Datenträger, gemäß Anspruch 12. Die abhängigen Ansprüche betreffen optionale Merkmale einiger Ausführungsformen der Erfindung.
-
Die Erfindung geht von der Grundüberlegung aus, mindestens zwei Datenwerte, auf die bei der Ausführung der Operationssequenz zugegriffen werden kann, derart anzuordnen, dass in jeder Cache-Zeile, die einen Teil eines ersten Datenwerts enthält, auch ein Teil eines zweiten Datenwerts enthalten ist. Auf diese Weise wird sichergestellt, dass bei einem Zugriff auf einen der beiden Datenwerte das Auftreten eines Cache-Fehlschlags oder eines Cache-Treffers unabhängig davon ist, ob auf den ersten oder den zweiten Datenwert zugegriffen wird. Mit anderen Worten kann ein Angreifer aus dem Muster von Cache-Fehlschlägen und Cache-Treffern keine Rückschlüsse ziehen, in welcher Reihenfolge auf welche Datenwerte zugegriffen wurde. An dem Cacheverhalten ist lediglich die Gesamtzahl der Cache-Zugriffe ablesbar, jedoch ist nicht erkennbar, durch welche Operation ein Zugriff erfolgte.
-
Die erfindungsgemäße Belegung des Cache-Speichers wird in manchen Ausgestaltungen dadurch erzielt, dass der erste und der zweite Datenwert im Hauptspeicher miteinander verzahnt oder verschränkt gespeichert sind, so dass bei einem Laden eines Teils eines dieser Datenwerte in eine Cache-Zeile zwingend auch ein Teil des anderen Datenwerts in diese Cache-Zeile geladen wird.
-
In manchen Ausgestaltungen sind weitere Datenwerte vorgesehen. Wenn jede Cache-Zeile genügend groß ist, um je einen Teil jedes Datenwerts, auf den der Prozessorkern beim Ausführen der Operationssequenz zuzugreifen vermag, aufzunehmen, dann werden in manchen Ausführungsformen diese weiteren Datenwerte verzahnt oder verschränkt mit dem ersten und dem zweiten Datenwert im Hauptspeicher abgelegt, so dass jedes Feld im Hauptspeicher, das einen Teil eines der Datenwerte enthält, auch je einen Teil jedes anderen Datenwerts enthält.
-
Sind dagegen die Cache-Zeilen nicht groß genug, so werden in manchen Ausgestaltungen Feldgruppen im Hauptspeicher gebildet, so dass jede Feldgruppe, die einen Teil eines der Datenwerte enthält, auch je einen Teil jedes anderen Datenwerts enthält. Die Operationssequenz kann in den letztgenannten Ausführungsformen derart ausgestaltet sein, dass, wenn der Prozessorkern auf einen in einem Feld einer Feldgruppe enthaltenen Teil eines Datenwerts zugreift, auch Zugriffe auf alle anderen Felder dieser Feldgruppe erfolgen.
-
In manchen Ausführungsformen sind die Datenwerte konzeptuell in mehrere gleiche Teile unterteilt, wobei die Anzahl von Bit in jedem Teil jedes Datenwerts beispielsweise eine glatte Zweierpotenz und ein glatter Bruchteil der Anzahl von Bit in den Nutzdaten jeder Cache-Zeile ist. Zum Beispiel kann jeder Teil 8 Bit oder 16 Bit aufweisen, wenn die Anzahl von Bit in den Nutzdaten jeder Cache-Zeile 32 Bit oder 64 Bit beträgt.
-
In manchen Ausgestaltungen implementiert die Operationssequenz ein Verfahren der eingangs genannten Art, beispielsweise ein ”Quadriere und Multipliziere”-Verfahren zur modularen Potenzierung.
-
Ausführungen der Erfindung können auch in anderen Operationssequenzen eingesetzt werden, beispielsweise für Fenstermethoden zur Exponentiation, wie sie etwa im erwähnten ”Handbook of Applied Cryptography” in Kapitel 14.82 beschrieben sind. Dabei wird in einem ersten Schritt zunächst eine kleine Anzahl von Werten (v1, v2, ..., vn) berechnet. In einem zweiten Schritt wird dann abhängig von dem geheimzuhaltenden Exponenten in einer Schleife jeweils eine Multiplikation mit einem der Werte vi durchgeführt. Eine weitere Anwendungsmöglichkeit der Erfindung sind ”Verdopple und Addiere”-Verfahren (double and add) zur Multiplikation, speziell bei der Berechnung in elliptischen Kurven, wie sie z. B. in
Bodo Möller: „Securing Elliptic Curve Point Multiplication against Side-Channel Attacks", ISC 2001, Springer LNVS, S. 324–334 oder in der
WO 02/091332 A2 beschrieben sind. Ein solches ”Verdopple und Addiere”-Verfahren kann dabei auch mit einer Fenstermethode verknüpft sein, wobei der Exponent hierfür in eine geeignete Darstellung gebracht ist.
-
Das erfindungsgemäße Computerprogrammprodukt weist Programmbefehle auf, um das erfindungsgemäße Verfahren zu implementieren. Ein derartiges Computerprogrammprodukt kann ein körperliches Medium sein, z. B. ein Halbleiterspeicher oder eine Diskette oder eine CD-ROM. Das Computerprogrammprodukt kann jedoch auch ein nicht-körperliches Medium sein, z. B. ein über ein Computernetzwerk übermitteltes Signal. Insbesondere kann das Computerprogrammprodukt Programmbefehle enthalten, die im Zuge der Herstellung oder der Initialisierung oder der Personalisierung eines tragbaren Datenträgers in diesen eingebracht werden.
-
Die erfindungsgemäße Vorrichtung kann insbesondere ein tragbarer Datenträger, z. B. eine Chipkarte oder ein Chipmodul, sein. Ein derartiger Datenträger enthält in an sich bekannter Weise mindestens einen Prozessorkern, mehrere Speicher und diverse Hilfsbaugruppen wie z. B. Schnittstellenschaltungen, Zeitgeber und Verbindungselemente.
-
In bevorzugten Weiterbildungen weisen das Computerprogrammprodukt und/oder die Vorrichtung Merkmale auf, die den in der vorliegenden Beschreibung erwähnten und/oder den in den abhängigen Verfahrensansprüchen genannten Merkmalen entsprechen.
-
Weitere Merkmale, Aufgaben und Vorteile der Erfindung ergeben sich aus der folgenden Beschreibung eines Ausführungsbeispiels und mehrerer Ausführungsalternativen. Es wird auf die schematischen Zeichnungen verwiesen.
-
1 zeigt ein Blockdiagramm eines Datenträgers nach einem Ausführungsbeispiel der Erfindung, und
-
2 zeigt eine schematische Darstellung der Art und Weise, in der in einem Ausführungsbeispiel m Datenwerte in k Feldern des Hauptspeichers abgespeichert werden.
-
Der in 1 dargestellte tragbare Datenträger 10 ist als Chipkarte oder als Chipmodul ausgestaltet. In an sich bekannter Weise enthält der Datenträger 10 einen Mikrocontroller 12, der als integrierter Halbleiterchip mit einem Prozessorkern 14, einem Hauptspeicher 16, einem Cache-Speicher 18 und einer Schnittstellenschaltung 20 ausgestaltet ist. Der Hauptspeicher 16 ist in mehrere Speicherfelder unterteilt. Im vorliegenden Ausführungsbeispiel sind als Speicherfelder ein als ROM ausgebildeter Festwertspeicher 22, ein als EEPROM ausgebildeter, nicht-flüchtiger überschreibbarer Speicher 24 und ein als RAM ausgebildeter Arbeitsspeicher 26 vorgesehen. Der Cache-Speicher 18 weist eine Vielzahl von Cache-Zeilen 28.1, 28.2, ... auf, die im folgenden zusammenfassend als Cache-Zeilen 28.x bezeichnet werden. Jede Cache-Zeile 28.x enthält in an sich bekannter Weise Verwaltungsdaten 30 – z. B. ein Gültigkeitsbit und eine Kennung (tag) – sowie Nutzdaten 32. In den vorliegend beschriebenen Ausführungsbeispielen wird davon ausgegangen, dass die Nutzdaten 32 jeder Cache-Zeile 28.x aus einer vorgegebenen Anzahl m von Speicherwörtern bestehen. Beispielsweise können in jeder Cache-Zeile 28.x vier Wörter Nutzdaten 32 enthalten sein (m = 4), wobei die Wortbreite in der Regel von der Busbreite des Mikrocontrollers 12 abhängt und z. B. ein Byte betragen kann.
-
Die Cache-Zeilen 28.x sind die kleinste Einheit des Cache-Speichers 18. Dies heißt, dass bei einem Ladevorgang in den Cache-Speicher 18 stets alle m Wörter der Nutzdaten 32 aus dem Hauptspeicher 16 in die entsprechende Cache-Zeile 28.x eingeschrieben werden, wodurch die gesamten bisher in der Cache-Zeile 28.x enthaltenen Nutzdaten 32 überschrieben werden.
-
Der Mikrocontroller 12 ist so ausgestaltet, dass Zugriffe auf mindestens einen Bereich 34 des Hauptspeichers 16 über den Cache-Speicher 18 erfolgen. In den hier beschriebenen Ausführungsbeispielen wird der Einfachheit halber angenommen, dass dieser ”cachebare” Bereich 34 mit dem Arbeitsspeicher 26 übereinstimmt. Es sind jedoch auch Ausführungsformen möglich, bei denen der Bereich 34 nur Teile des Arbeitsspeichers 26 und/oder zusätzlich Teile des nicht-flüchtigen überschreibbaren Speichers 24 umfasst.
-
Ferner wird bei dem hier beschriebenen Ausführungsbeispiel angenommen, dass der Bereich 34 konzeptuell in eine Vielzahl von Feldern 36.1,. 36.2, ... unterteilt ist, die im folgenden zusammenfassend als Felder 36.x bezeichnet werden. Jedes Feld 36.x enthält ebenfalls m Wörter, die bei jedem Nachladevorgang in jeweils genau eine Cache-Zeile 28.x übertragen werden. Mit anderen Worten werden Daten, die sich in einem einzigen Feld 36.x befinden, stets gemeinsam in eine einzige Cache-Zeile 28.x geladen. Dies impliziert nicht, dass ein Feld 36.x bei jedem Ladevorgang immer in dieselbe Cache-Zeile 28.x geladen wird, auch wenn es Ausführungsformen gibt, in denen dies der Fall ist.
-
In den hier beschriebenen Ausführungsbeispielen unterteilen die Felder 36.x den Bereich 34 lückenlos in Gruppen zu je m Speicherwörtern, und zwar beginnend von einer Adresse 0. Das x-te Feld 36.x umfasst somit die Wörter mit den Adressen a, a + 1, ... a + m – 1 für eine Startadresse a = m·(x – 1). In Ausführungsalternativen können die Felder 36.x jedoch auch anders ausgebildet und angeordnet sein. Insbesondere brauchen die Felder 36.x weder einheitlich groß zu sein noch lückenlos noch überlappungsfrei angeordnet zu sein. Die Felder 36.x können vielmehr beliebige Teilmengen des Bereichs 34 sein, die lediglich die Eigenschaft aufweisen müssen, dass die Speicherwörter jedes Feldes 36.x stets gemeinsam von einer Cache-Zeile 28.x erfasst werden.
-
1 geht beispielhaft von einer aus zwei verschiedenen Arten von Operationen aufgebauten Operationssequenz aus, wobei beide Arten von Operationen auf zwei Datenwerte v1 und v2 zuzugreifen vermögen und von einem vergleichbaren Operationstyp sind, so daß sie bei gegebenem gleichen Cacheverhalten praktisch nicht unterscheidbar sind. Die verschiedenen Operationen werden in einer verzahnten Abfolge ausgeführt, wobei die genaue Folge der Zugriffe von einem geheimzuhaltenden Wert d abhängt und soll verschleiert werden. Eine solche Operationssequenz ist eingangs am Beispiel des ”Quadriere und Multipliziere”-Verfahrens erläutert worden. Auf der logischen Programmebene sind die Datenwerte v1 und v2 als Variablen des ausgeführten Programms zu verstehen. In der Implementierung auf dem Datenträger 10 befinden sich die Datenwerte v1 und v2 dagegen im Hauptspeicher 16 sowie gegebenenfalls zusätzlich im Cache-Speicher 18.
-
Die vorliegende Ausführungsform der Erfindung soll nun anhand eines Beispiels mit sehr kurzen Datenwerten v1 und v2, die jeweils nur so lang wie die Nutzdaten 32 in einer Cache-Zeile 28.x sind, erläutert werden. Der erste Datenwert v1 ist konzeptuell in zwei Teile v11 und v12 unterteilt, und entsprechend ist der zweite Datenwert v2 in zwei Teile v21 und v22 unterteilt. Die Datenwerte v1 und v2 sind ineinander verzahnt im Hauptspeicher 16 gespeichert, und zwar derart, dass sich je ein Teil jedes Datenwerts v1, v2 in je einem Feld 36.x befindet. Genauer enthält das erste Feld 36.1 die beiden ersten Teile v11 und v21 der beiden Datenwerte v1, v2, und das zweite Feld 36.2 enthält die beiden zweiten Teile v12 und v22 der beiden Datenwerte v1, v2.
-
Die ineinander verzahnte Anordnung der Datenwerte v1 und v2 überträgt sich automatisch vom Hauptspeicher 16 auf den Cache-Speicher 18 weil, wie oben erwähnt, bei jedem Nachladevorgang je ein Feld 36.x des Hauptspeichers 16 vollständig in genau eine Cache-Zeile 28.x geladen wird. Somit gilt auch für alle Cache-Zeilen 28.x die Eigenschaft, dass, wenn sich ein Teil (z. B. v11) eines der Datenwerte (z. B. v1) in der Cache-Zeile 28.x befindet, auch ein Teil (z. B. v21) des anderen Datenwerts (z. B. v2) darin enthalten ist. Dies hat zur Folge, dass das Auftreten eines Cache-Treffers oder eines Cache-Fehlschlags unabhängig davon ist, ob der Prozessorkern 14 auf den ersten Datenwert v1 oder den zweiten Datenwert v2 zugreift. Somit kann ein Angreifer, der z. B. durch eine Stromanalyse Cache-Fehlschläge zu erkennen vermag, daraus nicht ableiten, auf welchen Datenwert v1 oder v2 der Zugriff erfolgte.
-
Wie bereits erwähnt, sind in der Darstellung von 1 die Datenwerte v1, v2 nur jeweils so lang wie ein Feld 36.x des Hauptspeichers 16 bzw. eine Cache-Zeile 28.x und damit außergewöhnlich kurz. In einen praxisnäheren Anwendungsfall umfasst jeder Datenwert v1, v2 beispielsweise 256 Byte, während jedes Feld 36.x und jede Cache-Zeile 28.x beispielsweise 4 Byte Nutzdaten enthalten. In diesem Fall müssen die Datenwerte v1, v2 auf insgesamt 128 Felder 36.x verteilt werden, so dass jedes dieser Felder 36.x mindestens je einen Teil jedes der Datenwerte v1, v2 enthält. Dies kann beispielsweise dadurch geschehen, dass die Datenwerte v1, v2 alternierend in Teilen von je einem Byte oder je zwei Byte in den Bereich 34 eingeschrieben werden, und zwar beginnend mit einer Feldgrenze.
-
Allgemein lässt sich das Prinzip der hier beschriebenen Ausführungsbeispiele wie folgt zusammenfassen: Es sei eine Operationssequenz vorgegeben, die potentiell – also nicht notwendigerweise bei jeder Ausführung – auf n Datenwerte vi mit i = 1, 2, ..., n zugreift. Jeder der Datenwerte vi sei in k Teile vij mit j = 1, 2, ..., k unterteilt. Diese Teile vij werden nun so im Hauptspeicher 16 angeordnet, dass jedes Feld 36.x – und damit auch jede Cache-Zeile 28.x – das/die mindestens einen Teil vij enthält, auch alle anderen Teile v1j, v2j, ... vnj enthält.
-
Prinzipiell können die Teile vij beliebig lang sein und brauchen auch nicht alle die gleiche Länge aufzuweisen. In vielen praktischen Ausgestaltungen ist aus Effizienzgründen jedoch eine einheitliche Feldlänge vorgesehen, die beispielsweise 1 Bit oder 1 Byte oder 2 Byte oder 1 Speicherwort betragen kann. Auch die Datenwerte vi brauchen nicht zwingend die gleiche Länge aufzuweisen. In manchen Ausführungsformen sind jedoch Datenwerte vi einheitlicher Länge vorgesehen. Hierzu können beispielsweise kürzere Datenwerte vi durch Anfügen beliebiger Daten (padding) auf die gemeinsame Länge ergänzt werden.
-
2 veranschaulicht ein Ausführungsbeispiel, bei dem jedes Feld 36.x eine Lange von m Speicherwörtern aufweist und die gleiche Anzahl von Datenwerten vi mit i = 1, 2, ..., m vorgesehen sind. Wenn die Operationssequenz tatsächlich nur auf n Datenwerte mit n < m zugreift, dann werden zusätzliche Datenwerte v(n + 1), ..., vm zumindest konzeptuell als Dummy-Variablen angelegt. Ferner umfasst in diesem Ausführungsbeispiel jeder Datenwert vi genau k Teile vij für j = 1, 2, ..., k, wobei jeder Teil vij genau ein Speicherwort umfasst. Die Teile vij können dann beispielsweise wie folgt alternierend im Hauptspeicher 16 abgelegt werden, und zwar beginnend bei einer Startadresse, die ein ganzzahliges Vielfaches der Feldlänge m ist:
v11, v21, ..., vm1, v12, v22, ..., vm2, ...., v1k, v2k, ..., vmk
-
Wiederum gilt, dass die Teile v1j, v2j, ..., vmj jeweils gemeinsam durch eine Cache-Zeile 28.x erfasst werden. Somit wird auch bei jedem Cache-Zugriff auf einen dieser Teile v1j, v2j, ..., vmj stets die gleiche Cache-Zeile 28.x angesprochen. Ja nachdem, ob sich die Daten im Cache 18 befinden oder nicht, ergibt sich ein Cache-Treffer oder ein Cache-Fehlschlag. Da aber das Auftreten von Treffer oder Fehlschlag unabhängig davon ist, auf welchen der Teile v1j, v2j, ..., vmj zugegriffen werden sollte, kann ein Angreifer daraus keine Rückschlüsse auf den ausgeführten Berechnungsablauf ziehen.
-
In dem Ausführungsbeispiel gemäß 2 wurde angenommen, dass die Felder 36.x – und entsprechend die Cache-Zeilen 28.x – groß genug sind, um je einen Teil vij jedes der Datenwerte vi aufzunehmen. Auch wenn diese Bedingung nicht erfüllt ist, kann die erfindungsgemäße Idee in weiteren Ausführungsformen angewendet werden. Es werden hierzu die Felder 36.x konzeptuell zu Gruppen zusammengefasst, so dass jede Feldgruppe insgesamt genügend Speicherplatz für je einen Teil vij jedes der Datenwerte vi bietet. Die Operationssequenz wird dann so verändert, dass bei einem Zugriff auf ein Feld 36.x, das in einer Feldgruppe enthalten ist, immer auch auf alle anderen Felder 36.x dieser Feldgruppe zugegriffen wird, auch wenn die in den anderen Feldern 36.x enthaltenen Daten für die auszuführende Berechnung nicht benötigt werden.
-
In einer beispielhaften Implementierung der gerade beschriebenen Erweiterung seien n Datenwerte vi vorgesehen, die wiederum – wie bei dem Ausführungsbeispiel von 2 – je k Teile vij zu je einem Speicherwort aufweisen. Wieder kann die einheitliche Länge der Datenwerte vi gegebenenfalls durch Anhängen von Dummy-Daten hergestellt werden. Ferner umfasse jedes Feld 36.x im Hauptspeicher m Speicherwörter, wobei aber im vorliegenden Beispiel n > m gelte. Ohne Einschränkung werde n = g·m für eine Gruppengröße g > 1 angenommen; diese Bedingung kann durch das Hinzufügen von Dummy-Datenwerten stets erfüllt werden.
-
Die Datenwerte vi werden dann, ähnlich wie bei dem Ausführungsbeispiel von 2, in der folgenden alternierenden Sequenz im Hauptspeicher 16 abgelegt, und zwar mit einer Startadresse, die ein ganzzahliges Vielfaches der Feldlänge m ist und den Anfang einer Feldgruppe definiert:
v11, v21, ..., vn1, v12, v22, ..., vn2, ..., v1k, v2k, ..., vnk
-
Die Teile v1j, v2j, ..., vnj befinden sich somit jeweils gemeinsam in einer einzigen Gruppe von g aufeinanderfolgenden Feldern 36.x.
-
Das vom Prozessorkern 14 ausgeführte Programm wird so ausgestaltet, dass jeder Zugriff auf einen Teil vij durch eine Sequenz von Zugriffen auf die Teile v(r1)j, v(r2)j, ..., v(rg)j ersetzt wird, wobei r1 = i mod m mit r1 ∊ {1, 2, ..., m) gilt und r2 = r1 + m, r3 = r2 + m bis zu rg = r(g-1) + m gelten. Von diesen Teilen ist lediglich der Teil vij erforderlich; alle anderen Teile können verworfen werden. Wenn beispielsweise die Operationssequenz bei n = 16 Datenwerten vi und einer Feldlänge m = 4 den Teil v7j benötigt, so wird eine Sequenz von Zugriffen auf die Teile v3j, v7j, v10j, v13j ausgeführt, weil r1 = 7 mod 4 = 3, r2 = r1 + 4 = 7, r3 = r2 + 4 = 10 und r4 = r3 + 4 = 13 gelten.
-
Bei der gerade beschriebenen Ausgestaltung mit mehr als m Datenwerten vi ist das Cache-Verhalten beim Zugriff auf einen Datenwert vi unabhängig von i, weil Zugriffe innerhalb des Bereichs v1j, v2j, ..., vmj beziehungsweise innerhalb des Bereichs v(m + 1)j, v(m + 2)j, ..., v(2·m)j und so weiter durch je eine einzige Cache-Zeile 28.x abgedeckt werden, und weil durch die Zugriffssequenz v(r1)j, v(r2)j, ..., v(rg)j alle diese Bereiche je genau einmal angesprochen werden. Auch hier kann also ein Angreifer, der Cache-Treffer und Cache-Fehlschläge ausspäht, daraus keine Rückschlüsse auf den Index i des von der Operationssequenz benötigten Datenwerts vi ziehen.
-
Es versteht sich, dass die hier beschriebenen Ausführungsformen und Ausführungsvarianten lediglich als Beispiele zu sehen sind. Weitere Abwandlungen und Kombinationen der hier beschriebenen Merkmale sind für den Fachmann unmittelbar ersichtlich.
-
ZITATE ENTHALTEN IN DER BESCHREIBUNG
-
Diese Liste der vom Anmelder aufgeführten Dokumente wurde automatisiert erzeugt und ist ausschließlich zur besseren Information des Lesers aufgenommen. Die Liste ist nicht Bestandteil der deutschen Patent- bzw. Gebrauchsmusteranmeldung. Das DPMA übernimmt keinerlei Haftung für etwaige Fehler oder Auslassungen.
-
Zitierte Patentliteratur
-
- DE 19822218 A1 [0004]
- WO 99/35782 A1 [0004]
- WO 99/67919 A2 [0004]
- US 2002/0124178 A1 [0004]
- WO 02/091332 A2 [0022]
-
Zitierte Nicht-Patentliteratur
-
- ”Handbuch der Chipkarten” von W. Rankl und W. Effing, Hauser Verlag, 5. Auflage, 2008, Seiten 740–771 [0004]
- ”Handbook of Applied Cryptography” von A. Menezes, P. van Oorschot und S. Vanstone, CRC Press, 1996, Seite 71 [0006]
- Bodo Möller: „Securing Elliptic Curve Point Multiplication against Side-Channel Attacks”, ISC 2001, Springer LNVS, S. 324–334 [0022]