4.5.4 Knapsacks mit geringer Dichte

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

dA = n / log2(amax)

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:

v = (v1, v2, ..., vn), vi aus R, i = 1 ... n.

Definition
Sei v = (v1, v2, ..., vn) ein Vektor aus Rn. Dann hat v die (euklidische) Länge

||v|| = (v12 + ... + vn2)1/2

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

k1b1 + k2b2 + ... + kmbm = 0, nicht alle ki = 0

Andernfalls ist {bi}i=1...m linear unabhängig.

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

v = k1b1 + k2b2 + ... +knbn, ki aus R, 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}:

L = {v | v = z1b1 + z2b2 + ... + zmbm, wobei zi aus Z}

Die Menge {bi}i=1...m ist dann eine Basis für L. Ein Gitter kann mehrere Basen besitzen.

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):

||b'1|| <= 2(n-1)/2||v||, v aus L.


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.

Gegeben
  • öffentlicher Knapsack-Schlüssel B = (b1, ..., bn)
  • Chiffre c = pB = b1p1 + ... + bnpn, pi aus {0, 1}
Gesucht
  • Die Klartextnachricht p

Um aus B und c die Nachricht p zu erhalten, führe nacheinander folgende Schritte aus:

  1. Bilde aus dem öffentlichen Schlüssel B und dem Chiffretext c folgende (n+1)×(n+1)-Matrix M
    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
    Dabei ist t eine ganze Zahl mit t > (n/4)1/2.

    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ß.

  2. Der nächste Schritt besteht darin, die Basis {mi}i=1...(n+1) zu reduzieren.
  3. Sei {m'i}i=1...(n+1) die erhaltene reduzierte Basis. Nun wird die Basis überprüft, ob sie Vektoren m'i enthält, die folgende Form haben:
    m'i = (±0.5, ±0.5, ..., ±0.5, 0)

    Falls kein solcher Vektor m'i in der Basis enthalten ist, gibt es entweder keine Lösung für (B, c) oder der Basis-Reduktions-Algorithmus hat keine geeignete reduzierte Basis ermittelt.

    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:

    • Definiere den Vektor X = (x1, x2, ..., xn) durch xi = 0.5 + m'k, i , i = 1 ... n
    • Berechne die Summe s = XB = x1b1 + ... + xnbn
    • Falls s = c, ist X der gesuchte Lösungsvektor für (B, c), d.h. X ist die Klartextnachricht

    Falls s != c, dann
    • definiere X = (x1, x2, ..., xn) durch xi = 0.5 - m'k, i , i = 1 ... n
    • berechne die Summe s = XB = x1b1 + ... + xnbn
    • Falls s = c, ist X die Klartextnachricht für den Chiffretext c

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:

||b'1|| <= 2(n-1)/2||v||, v aus L
In der Praxis ist der L3-Algorithmus aber wesentlich besser als die eben erwähnte Abschätzung.


Applet starten

 
Shamirs Algorithmus