Einer der besten Algorithmen für das allgemeine Subset-Sum Problem
ist der Meet-in-the-Middle Algorithmus.
Für Knapsack-Vektoren mit geringer Dichte gibt es eine effektivere Methode. Hierbei wird das Subset-Sum Problem reduziert auf das Problem, einen Vektor zu finden, der eine kleine Länge hat.
Definition
Gegeben sei ein Knapsack-Vektor A = (a1, ..., an). Sei amax das größte Element in A: amax = maxi ai, i = 1 ... n. Dann ist die Dichte dA des Knapsack-Vektors A
In Kryptosystemen, die auf dem Subset-Sum Problem basieren, ist die Dichte eines Knapsacks fast immer kleiner als Eins, da andernfalls mehrere Teilmengen A' von A existieren können, die sich zu einer Summe s aufsummieren. Dann wäre eine eindeutige Entschlüsselung nicht mehr möglich.
Definition
Ein Vektor v aus Rn ist ein geordnetes Tupel mit Elementen vi aus R:
Definition
Sei v = (v1, v2, ..., vn) ein Vektor aus Rn. Dann hat v die (euklidische) Länge
Definition
Sei {bi}i=1...m eine Menge von Vektoren aus Rn mit m <= n. Genau dann ist {bi} linear abhängig, wenn es ki aus R gibt mit
Definition
Sei {bi}i=1...n eine Menge von n linear unabhängigen Vektoren aus Rn. Dann ist {bi}i=1...n eine Basis für Rn. Jeder Vektor v aus Rn kann eindeutig geschrieben werden kann als Linearkombination der Menge {bi}i=1...n
Definition
Seien m linear unabhängige Vektoren {bi}i=1...m gegeben, m <= n. Dann ist das Gitter (lattice) L, das von {bi}i=1...m erzeugt wird, die Menge aller ganzzahligen Linearkombinationen von {bi}:
Eng verbunden mit einem Gitter L ist das kürzeste-Vektor Problem (SVP: shortest vector problem): für ein gegebenes Gitter L ist der kürzeste Vektor aus L zu finden, der ungleich dem Nullvektor ist.
Nimmt man als Länge eines Vektors die Supremumsnorm, dann ist das Problem NP-hart. Für die euklidische Norm jedoch läßt sich die Aussage nicht machen. Es ist ein offenes Problem.
(Die Supremumsnorm || ||8eines Vektors v = (v1, ..., vn) ist definiert als ||v||8 = max |vi|i=1...n.)
Ein Gitter L kann durch mehrere Basen beschrieben werden. Eine "gute" Basis für ein Gitter besteht aus Vektoren mit möglichst "kleinen" Längen und wird reduzierte Basis gennant. Die Gitter-Reduktions-Theorie befasst sich damit, "gute" Basen für ein Gitter L zu erzeugen.
Algorithmen, die eine gegebene Basis B für ein Gitter L in eine reduzierte Basis überführen, werden Gitter-Basis-Reduktionsalgorithmen genannt. Ein Vertreter dieser Algorithmen ist der nach seinen Entwicklern Lenstra, Lenstra und Lovász benannte L3-Algorithmus. Eine L3-reduzierte Basis hat u.a. die Eigenschaft, dass ihr erster Vektor, b'1 um höchstens einen exponentiellen Faktor größer ist als der kleinste nichtnull Vektor aus L (bzgl. der euklidischen Länge):
Im Folgenden wird gezeigt, wie ein Subset-Sum Problem gelöst werden kann, wenn der Knapsack-Vektor eine geringe Dichte hat. Da kryptographische Knapsack-Vektoren fast immer eine Dichte kleiner als Eins haben, trifft dieses Verfahren auch auf diese zu.
Um aus B und c die Nachricht p zu erhalten, führe nacheinander folgende Schritte aus:
M = | |||||
1 | 0 | 0 | ... | 0 | tb1 |
0 | 1 | 0 | ... | 0 | tb2 |
0 | 0 | 1 | ... | 0 | tb3 |
... | ... | ... | ... | ... | ... |
0 | 0 | 0 | ... | 1 | tbn |
0.5 | 0.5 | 0.5 | ... | 0.5 | tc |
Definiere den Vektor mi als die i-te Zeile von M, i = 1...(n+1). Sei L das Gitter, das von {mi}i=1...n erzeugt wird.
Sei nun p = (p1, p2, ..., pn) die Klartextnachricht,
aus der der Chiffretext c hervorgegangen ist.
Betrachte den Vektor y = p1m1 + p2m2
+ ... + pnmn - mn+1. Da pi aus {0, 1}, liegt y im Gitter L, das von {mi} erzeugt wird.
Vektorenaddition wird durchgeführt, indem die einzelnen Komponenten addiert werden. Die einzelnen Komponenten yi des Vektors y lauten deshalb
y1 = | p1 + 0 + ... + 0 - 0.5 = p1 - 0.5 |
y2 = | 0 + p2 + 0 + ... + 0 - 0.5 = p2 - 0.5 |
... | |
yi = | 0 + ... + 0 + pi + 0 + ... +0 - 0.5 = pi - 0.5 |
... | |
yn = | 0 + ... + 0 + pn - 0.5 = pn - 0.5 |
yn+1 = | t(b1p1 + b2p2 + ... + bnpn) - tc = 0 |
Da pi aus {0, 1}, gilt y = (±0.5, ±0.5, ..., ±0.5, 0) und ||y|| = (n/4)1/2. Die Länge von y ist also gering.
Wenn nun die Dichte des Knapsack-Vektors B, dB, klein ist, B also große Elemente hat, dann sind die meisten Vektoren, die
aus {mi}i=1...(n+1) durch ganzzahligeLinearkombinationen
entstehen, groß.
Für jeden Vektor m'k aus {b'i} mit m'k = (±0.5, ±0.5, ..., ±0.5, 0) werden nun folgende Schritte ausgeführt:
In [CO91] wird gezeigt, dass das Subset-Sum Problem für Knapsack-Vektoren mit Dichte d < 0.9408... fast immer gelöst werden kann.
Voraussetzung ist ein Orakel: ein fiktiver Algorithmus, der eine gegebene Basis für ein Gitter L derart reduziert, dass die dabei erhaltene reduzierte Basis IMMER den kürzesten nichtnull Vektor aus L enthält.
Gesucht ist dann die Wahrscheinlichkeit, dass (±0.5, ±0.5, ..., ±0.5, 0) der kleinste Vektor in L ist.
Andersherum, die Wahrscheinlichkeit, dass ein küzerer Vektor aus L existiert als (±0.5, ±0.5, ..., ±0.5, 0), geht gegen Null, wenn n gegen unendlich geht und der Knapsack-Vektor eine Dichte d < 0,9408... hat.
Die Voraussetzung, den kürzesten Vektor aus L zu finden, trifft beim L3 Algorithmus nicht zu. Hier kann u.a. nur garantiert werden, dass der erste Vektor der reduzierten Basis B', b'1, in der Länge beschränkt ist:
![]() |
Shamirs Algorithmus | ![]() |