Возможно ли шифрование в другом порядке, чем расшифровка? - PullRequest
4 голосов
/ 05 января 2010

Можно ли зашифровать в одном порядке и расшифровать в другом? Например, у меня есть следующее:

  • plain_text.txt
  • Пара открытых / закрытых ключей 1
  • Пара открытых / закрытых ключей 2

Пример

Шифрование:

public1(public2(plain_text.txt))

дешифрование:

private1(private2(encrypted))

Есть ли алгоритм шифрования, который позволяет это? Это вообще возможно?

Ответы [ 6 ]

5 голосов
/ 05 января 2010

В большинстве случаев вы не можете изменить порядок расшифровки. Схемы, позволяющие изменить порядок дешифрования, называются коммутативными криптосистемами. Одна криптосистема с открытым ключом, которую можно использовать для построения коммутативной криптосистемы, шифрование Эль-Гамаля .

Вот только основная идея: предположим, что g является генератором подходящая группа G, для которой сложно вычислить дискретные логарифмы. Пусть x A и x B будут двумя закрытыми ключами, h A = g x A и ч В = г х В быть соответствующими открытыми ключами. Обе пары ключей используют одну группу G (то есть тот же модуль p, если мы используем G = Z / (p)). Это одно из преимуществ Схема ElGamal, что он все еще безопасен, если два пользователя совместно используют одну группу (или модуль). RSA, с другой стороны, будет небезопасным.

Шифрование сообщения m с помощью h A дает зашифрованный текст

(м ч A r , г r ).

Обратите внимание, что знание секретного ключа x A позволяет расшифровать, потому что

r ) x A = h A r

Чтобы зашифровать зашифрованный текст во второй раз, нужно сначала повторно зашифровать существующий зашифрованный текст с открытым ключом А. Он выбирает случайный r 'и вычисляет

(мч A r h A r ', g r g r' ) = (мч A r + r ', g r + r' ).

Результатом является еще одно действительное шифрование с открытым ключом А. Это повторное шифрование необходимо, чтобы избежать атаки, которая работает, например, против RSA с равным модулем, как показано ниже. Затем можно было бы зашифровать с открытым ключом B, давая

(mh A r + r ' h B s , g r + r' , г * 1 092 * S ).

Расшифровка возможна в любом порядке, например, зная x A позволяет вычислить

(g r + r ') x A = h A r + r'

и, следовательно, можно вычислить

(м ч В с , г с ),

именно этого мы и хотим: шифрование m открытым ключом B.

Существует ряд тонкостей, которые необходимо соблюдать, чтобы получить безопасную реализацию. И понять это не так просто. Для получения дополнительной информации см., Например, Phd Стивена Вейса , который содержит главу о коммутативном шифровании.


Существует ряд проблем, если использовать ту же идею с «учебником RSA». Во-первых, чтобы сделать шифрование коммутативным, необходимо, чтобы оба пользователя A и B использовали один и тот же модуль. Например. A использует (n, e A , d A ), а B использует (n, e B , d B ), где n это модуль, e A , e B открытые ключи и d A , d B секретные ключи. Однако, например, зная (n, e A , d A ), можно вычислить n и, следовательно, вычислить секретный ключ B, который, конечно, является одним большим недостатком.

Теперь мы можем зашифровать m как

м е А мод н,

снова зашифровать как

м е А е В мод n,

расшифровывает с секретным ключом А, давая

м е В мод н,

и расшифровываем снова с секретным ключом B, чтобы получить m. Это выглядит хорошо, пока никто не заметит, что злоумышленник, который может перехватить два шифротекста c = m e A mod n и c '= m e B mod n, может использовать Алгоритм Евклида, чтобы найти r, s такой, что

r e A + s e B = 1

, а затем вычислить

m = c r (c ') s мод №.

Эта идея также работает против решения с использованием RC4, предложенного в другом ответе. Тезис Вейса содержит подробное описание атаки.

3 голосов
/ 05 января 2010

В большинстве публичных реализаций RSA это было бы невозможно. Процедура дешифрования ожидает, что открытый текст будет в определенном формате (то есть правильно заполнен) и завершится неудачей, если это не так. Опять же, при шифровании он применяет заполнение к открытому тексту, а не использует блоб как есть.

/ * Математика RSA учитывает это, AFAIK, при условии, что модули двух ключей взаимно просты (что верно почти всегда). Но вам, вероятно, придется свернуть собственную реализацию. * /

Другая проблема заключается в том, что числовое значение блока открытого текста должно быть меньше модуля. Таким образом, модуль первого ключа должен быть меньше, чем у второго ключа, в противном случае нет никакой гарантии, что первый зашифрованный текст будет надлежащим открытым текстом для второго раунда шифрования.

OpenSSL имеет, я смутно помню, режим без заполнения. Возможно, вам повезет с этим.

РЕДАКТИРОВАТЬ: в общем, придумывать свои собственные криптографические примитивы - плохая идея в 99,9% случаев. Если ваш интерес чисто академический, то будьте моим гостем; но если вам нужен определенный фрагмент прикладной функциональности (то есть что-то зашифровывать, так что для расшифровки необходимо согласие двух не доверяющих сторон), то вы определенно на ложном пути.

EDIT2: математика RSA учитывает это, если модули идентичны. Вычеркните абзац второй. Но наличие двух ключей с одинаковым модулем очень сильно подрывает безопасность. Если Алиса имеет закрытый ключ (m, d) и Синди как закрытый ключ (m, d ') - при условии того же m - тогда Алиса может определить d' за O (m) времени, учитывая одну пару открытого текста / шифротекста от Синди. Не хорошо.

1 голос
/ 05 января 2010

Это будет верно только в том случае, если алгоритм шифрования ведет себя как особый тип математической группы . Большинство (все?) Алгоритмов блочного шифрования не являются такими группами.

1 голос
/ 05 января 2010

С шифрованием открытым ключом / закрытым ключом ответ - нет. PubK1(PubK2(plain.text)) => encrypted.text. Вы должны расшифровать с PrivK2(PrivK1(encrypted.text)).

Однако, если вы используете симметричный потоковый шифр, такой как RC4, вы можете изменить порядок дешифрования (A xor B xor C = C xor B xor A). Но это, очевидно, не алгоритм открытого / закрытого ключа.

0 голосов
/ 05 января 2010

Нет, это не работает. Проще говоря, вы не можете гарантировать уникальную расшифровку, потому что один модуль больше другого.

РЕДАКТИРОВАТЬ: я предполагаю, что это RSA. Если нет, то мне придется подумать о некоторых других.

РЕДАКТИРОВАТЬ2: Если вы всегда готовы сначала использовать меньший модуль, тогда он работает.

0 голосов
/ 05 января 2010

AFAIK это должно быть возможно с небольшим изменением RSA.Хотя я не знаю ни одного инструмента, который мог бы это сделать.

...