Ранцевая криптосистема Шора-Ривеста

Материал из testwiki
Перейти к навигации Перейти к поиску

Ранцевая криптосистема Шора-Ривеста была предложена в 1985 году (Chor, 1985; Chor and Rivest, 1988)[1]. В настоящее время она является единственной известной схемой шифрования, основанной на задаче о ранце, которая не использует модульного умножения для маскировки простой задачи о ранце[2] На данный момент создано множество рюкзачных криптосистем, например ранцевая криптосистема Меркла — Хеллмана. Однако практически все существующие на сегодняшний день взломаны или признаны потенциально небезопасными, примечательным исключением является схема Шор-Ривеста. Криптосистема Шора-Ривеста является одной из немногих не взломанных систем[3].

Описание алгоритма

Пусть пользователь B хочет отправить зашифрованное сообщение A. Для этого:

Для генерации открытого и закрытого ключей нужно[4]:

  1. Выбрать конечное поле 𝔽𝑞 характеристики 𝑝, где 𝑞=𝑝, 𝑝, и для которого возможно эффективно решать задачу дискретного логарифмирования (см. Особенности криптосистемы 3)
  2. Выбрать случайный монотонный неприводимый многочлен 𝑓(x) степени над 𝑝. Элементы 𝔽𝑞 будут представлены как многочлены от 𝑝[𝑥] степени меньше , причем умножение можно выполняться по модулю 𝑓(x).
  3. Выбрать случайный примитивный многочлен 𝑔(x) поля 𝔽𝑞.
  4. Вычислить дискретный логарифм 𝑎𝑖=log𝑔(𝑥)(𝑥+𝑖) элемента поля (𝑥+𝑖).
  5. Выбрать случайную перестановку π на множестве целых чисел {0,1,2,...,p1}
  6. Выбрать случайное целое число d, 0dph2
  7. Вычислить ci=(aπ(i)+d)mod(ph1) , 0ip1

Открытым ключом 𝖠 является ((c0,c1,...,cp1),p,h); закрытым ключом 𝖠 является (f(x),g(x),π,d)

Для генерации случайного мононического неприводимого многочлена можно использовать следующий алгоритм:[5]

ВХОД: простое p и положительное целое число m.

ВЫХОД: монотонный неприводимый многочлен 𝑓(x) степени m в 𝑝[𝑥].

Полученный многочлен будет неприводимым, ввиду следующей теоремы:

  • Случайно выбрать целые числа a0,a1,a2,...,am1 между 0 и p1 с a00. Представить многочлен 𝑓(x) в виде" f(x)=xm+am1xm1+...+a2x2+a1x+a0
  • Выбрать u(x)=x
  • Для i от 1 до m2 сделать следующие действия:
  1. Вычислить u(x)=u(x)pmodf(x). (Заметить, что u(x) является многочленом от 𝑝[𝑥] степени меньше m)
  2. Вычислить d(x)=gcd(f(x),u(x)x)
  3. Если d(x)1 вернуть 𝑓(x) «приводимый».
  • Если 𝑓(x) приводимый — повторить шаги алгоритма. Иначе вернуть 𝑓(x)

    Неприводимый многочлен

    f(x)𝑝[𝑥]

    степени

    m

    является примитивным многочленом тогда и только тогда, когда

    𝑓(x)

    делит

    xk1

    для

    k=pm1

    и для не меньшего положительного целого

    k

    .[6]

Для генерации случайного мононического примитивного многочлена можно использовать следующий алгоритм:[7]

ВХОД: простое p, целое число m ≥ 1 и различные простые множители r1,r2,...,rt из pm1.

ВЫХОД: монотонный примитивный многочлен 𝑓(x) степени m в 𝑝[𝑥].

  • Генерировать случайный монотонный неприводимый многочлен над 𝑝.
  • Для i от 1 до t сделать следующие действия:
  1. Вычислить l(x)=x(pm1)/rimodf(x)
  2. Если l(x)=1 вернуть 𝑓(x) «не примитивный».
  • Если 𝑓(x) примитивный — повторить шаги алгоритма. Иначе вернуть 𝑓(x)

Шифрование

Для шифрования с открытым ключом 𝖡 нужно сделать следующее[4]:

  • Получить открытый ключ 𝖠 ((c0,c1,...,cp1),p,h)
  • Представить сообщение m как двоичную строку длины lg(ph), где (ph) является биномиальным коэффициентом (ph)=p!h!(ph)!
  • Рассмотреть m как двоичное представление целого числа. Преобразовать это целое число в двоичный вектор M=(M0,M1,...,Mp1) длины p, имеющий ровно h единиц следующим образом:
  1. Выбрать l=h
  2. Для i от 1 до p выполнить следующие действия: Если m(pil) то выбрать Mi1=1, m=m(pil), l=l1. В противном случае выбрать Mi1=0. (Примечание: (n0)=1 для n0 ;(0l)=0 для l1)
  • Вычислить c=i=op1(Mici)mod(ph1)
  • Отправить зашифрованный текст c в 𝖠

Дешифрование

Для дешифрования с открытым ключом 𝖠 нужно сделать следующее[4]:

  • Вычислить r=(chd)mod(ph1)
  • Вычислить u(x)=g(x)rmodf(x)
  • Вычислить s(x)=u(x)+f(x), монотонный многочлен степени над 𝑝
  • Разложить s(x) на произведение линейных множителей над 𝑝: s(x)=j=1h(x+tj), где tjp (см. Особенности криптосистемы 5)
  • Вычислить двоичный вектор M=(M0,M1,...,Mp1) следующим образом. Компоненты M, которые равны 1, имеют индексы π1(tj),1jh. Остальные компоненты равны 0.
  • Сообщение m восстанавливается из M следующим образом:
  1. Выбрать m=0, l=h
  2. Для i от 1 до p выполнить следующие действия: Если Mi1=1, то выбрать m=m+(pil) и l=l1

Доказательство

Для доказательства работы схемы можно заметить, что[8]

u(x)=g(x)rmodf(x)g(x)chdg(x)(i=0p1Mici)hd(modf(x))g(x)(i=0p1Mi(aπ(i)+d))hdg(x)i=0p1Miaπ(i)(modf(x))i=0p1[g(x)aπ(i)]Mii=0p1(x+π(i))Mi(modf(x))

Так как i=0p1(x+π(i))Mi и s(x) — монические многочлены степени и конгруэнтны по модулю f(x), то:

s(x)=u(x)+f(x)=i=0p1(x+π(i))Mi

Следовательно, корней s(x) все лежат в 𝑝, и применение π1 к этим корням дает координаты M, которые равны 1.

Пример

В качестве примера можно рассмотреть работу схемы в случае, когда параметры относительно малы[9]

Генерация ключей

Для генерации ключей A выполняет следующее:

  • Выбирает p=7 и h=4
  • Выбирает неприводимый многочлен f(x)=x4+3x3+5x2+6x+2 степени 4 над 7 . Элементы конечного поля 𝔽74 представлены как многочлены от 7[𝑥] степени меньше 4, причем умножение выполняется по модулю f(x).
  • Выбирает случайный примитивный элемент g(x)=3x3+3x2+6
  • Вычисляет следующие дискретные логарифмы
ao=logg(x)(x)=1028a1=logg(x)(x+1)=1935a2=logg(x)(x+2)=2054a3=logg(x)(x+3)=1008a4=logg(x)(x+4)=379a5=logg(x)(x+5)=1780a6=logg(x)(x+6)=223
  • Выбирает случайную перестановку π на {0,1,2,3,4,5,6}, определяемой π(0)=6,π(1)=4,π(2)=0,π(3)=2,π(4)=1,π(5)=5,π(6)=3
  • Выбирает случайное целое число d=1702
  • Вычисляет
co=(a6+d)mod2400=1925c1=(a4+d)mod2400=2081c2=(a0+d)mod2400=330c3=(a2+d)mod2400=1356c4=(a1+d)mod2400=1237c5=(a5+d)mod2400=1082c6=(a3+d)mod2400=310
  • Открытым ключом 𝖠 является ((co,c1,c2,c3,c4,c5,c6),p=7,h=4), а закрытый ключ 𝖠=(f(x),g(x),π,d)

Шифрование

Чтобы зашифровать сообщение m=22 для 𝖠, 𝖡 делает следующее:

  • Получает открытый ключ 𝖠 открытого ключа
  • Представляет m как двоичную строку длиной 5: m=10110. (так как lg(74)=5)
  • Использует метод, описанный на шаге 3 " алгоритма Шифрования ", для преобразования m в бинарный вектор M=(1,0,1,1,0,0,1) длины 7.
  • Вычисляет c=(c0+c2+c3+c6)mod2400=1521
  • Отправляет c=1521 в 𝖠

Дешифрование

Чтобы расшифровать зашифрованный текст c=1521, 𝖠 делает следующие действия:

  • Вычисляет r=(chd)mod(2400)=1913
  • Вычисляет u(x)=g(x)1913modf(x)=x3+3x2+2x+5
  • Вычисляет s(x)=u(x)+f(x)=x4+4x3+x2+x
  • Факторизует s(x)=x(x+2)(x+3)(x+6)(так t1=0, t2=2, t3=3, t4=6)
  • Компоненты M, которые равны 1, имеют индексы π1(0)=2, π1(2)=3, π1(3)=6 и π1(6)=0. Следовательно, M=(1,0,1,1,0,0,1)
  • Использует метод, описанный на шаге 6 " алгоритма дешифрования ", чтобы преобразовать M в целое число m=22, тем самым восстанавливая исходный текст.

Особенности криптосистемы

  • Известно, что система небезопасна, если раскрыты части секретного ключа, например, если известны g(x) и d в некотором представлении 𝔽𝑞 или если f(x) известно, или если π известен[10]
  • Хотя схема Шор-Ривеста была описана только для случая p простой, она распространяется на случай, когда базовое поле 𝑝 заменяется полем первичного степенного порядка[11]
  • Чтобы сделать задачу дискретного логарифма выполнимой на шаге 1 алгоритма " Генерация ключей ", параметры p и h могут быть выбраны так, что q=ph1 имеет только малые множители. В этом случае для эффективного вычисления дискретных логарифмов можно использовать алгоритм Полига — Хеллмана в конечном поле 𝔽𝑞[12]
  • На практике рекомендуемый размер параметров: p200 и h25. Один конкретный выбор первоначально предложенных параметров: p=197 и h=24; в этом случае наибольший простой коэффициент 197241 составляет 10316017, а плотность набора ранца составляет около 1.077. Другие первоначально заданные параметры: {p=211,h=24},{p=35,h=24} (базовое поле 𝔽35) и {p=28,h=25} (базовое поле 𝔽28)[13]
  • Шифрование — очень быстрая операция. Расшифровка выполняется намного медленнее, узким местом является вычисление u(x) на шаге 2 " алгоритма дешифрования ". Корни s(x) на шаге 4 можно найти, просто попробовав все возможности в 𝑝[14]
  • Основным недостатком схемы Шор-Ривеста является то, что открытый ключ довольно велик, а именно бит (ph.lgp). Для параметров p=197 и h=24 это около 36000 бит[15]
  • Расширение сообщения происходит в lgph/lg(ph). Для p=197 и h=24, это 1.797[16]

Атаки с раскрытием частичного ключа

В этом разделе Шаблон:Iw показывает, что он может монтировать атаку, когда раскрывается какая-либо часть секретного ключа. Несколько таких атак уже опубликованы в документе[17] и некоторые из них были улучшены ниже.[18]

Секретные ключи состоят из:

  1. элемент t𝔽q с степенью h
  2. генератор g
  3. целое число dq1
  4. перестановка π на множестве целых чисел {0,1,2,...,p1}

Атака с раскрытием части t

Если предположим, что π(0)=i и π(1)=j (из-за симметрии в секретном ключе мы знаем, что будет выполняться произвольный выбор (i,j)), мы можем вычислить log(t+αi) и log(t+αj), то решим систему уравнения:

c0=d+log(t+αi)logg
c1=d+log(t+αj)logg с неизвестными d и logg[17]

Атака с раскрытием части g

Если предположим, что π(0)=i и π(1)=j (из-за симметрии в секретном ключе мы знаем, что будет выполняться произвольный выбор (i,j)), мы можем вычислить:

gc0c1=t+αit+αj

затем разрешить t

Атака с раскрытием части π

Найдем линейную комбинацию с формой i=1p1xi(cic0)=0 с относительно небольшими интегральными коэффициентами xi. Это можно выполнить с помощью алгоритма Lenstra-Lenstra-Lovász[19]. Мы можем ожидать, что |xi|B с Bphp1. Обозначая это, получаем некоторое уравнение:

iI(t+απ(i))xi=iJ(t+απ(j))xj

с неотрицательными малыми степенями, который является полиномиальным уравнением с малой степенью, которое может быть эффективно разрешено.[17]

Атака с раскрытием части π и gpr

Мы можем интерполировать полином Q(x) с h/r+1 парами (απ(i),gprci). Таким образом, мы получаем многочлен h/r — степени, корни которого являются сопряженными t. Потом мы можем решить его, чтобы получить t и выполнить атаку с раскрытием части t

См. также

Примечания

Шаблон:Примечания

Шаблон:Задача о ранце Шаблон:Криптосистемы с открытым ключом