Криптосистема Накаша — Штерна
Криптосистема Накаша — Штерна (англ. Naccache — Stern cryptosystem)— криптографический алгоритм с открытым ключом, основывающийся на вычислительной сложности задачи дискретного логарифмирования. В отличие от RSA, гомоморфен по сложению и вычитанию, а не по умножению .
Разработана Дэвидом Накаше и Жаком Штерном в 1998 году[1] в двух версиях: детерминированный и вероятностный. Является усовершенствованием схемы Бенало[2] — авторы смогли построить вероятностную гомоморфную криптосистему с семантической стойкостью и значительно уменьшить отношение между размером шифротекста и размером открытого текста .
Существует реализация (python3) алгоритмов генерации ключа, шифрования и дешифрования[3].
Сравнение с RSA
Сходства
Различия
- Использование разных односторонних функций с потайным входом. Как подчеркивают авторы[1], этот пункт имеет большой теоретический интерес, потому что, по их мнению, на данный момент существует только небольшое разнообразие односторонних функций с потайным входом, а это напрямую влияет на скорость создания новых криптосистем с открытым ключом[1].
- Стойкость этого алгоритма не связана напрямую со стойкостью алгоритма шифрования криптосистемы RSA. А именно, стойкость RSA связана со сложностью задачи факторизации целых чисел, а стойкость криптосистемы Накаша — Штерна — с сложностью задачи дискретного логарифмирования[4] .
- Криптосистема RSA гомоморфна по умножению, а криптосистема Накаша — Штерна — по сложению[1] .
Описание детерминированного варианта криптосистемы
В общем, детерминированный вариант криптосистемы Накаша — Штерна может быть описан следующим образом: пусть [math]\displaystyle{ \sigma }[/math] — B-гладкое (B мало — обычно это 10-битное число), нечетное, свободное от квадратов число и пусть [math]\displaystyle{ n = pq }[/math] — RSA число (Обычно полагают, [math]\displaystyle{ n }[/math] — это как минимум 768-битное число), такое что [math]\displaystyle{ \sigma }[/math] делит [math]\displaystyle{ \phi(n) }[/math] и оно взаимно просто с [math]\displaystyle{ \phi(n)/\sigma }[/math], где [math]\displaystyle{ \phi(n) }[/math]— это функция Эйлера. Далее, пусть [math]\displaystyle{ g \in \Z/n\Z }[/math] порядка [math]\displaystyle{ \phi(n)/4 }[/math]. Тогда тройка чисел [math]\displaystyle{ p,\ q,\ \sigma }[/math] формирует закрытый ключ. Сообщение [math]\displaystyle{ m }[/math], меньшее чем [math]\displaystyle{ \sigma }[/math], шифруется как [math]\displaystyle{ g^{m}mod\ n }[/math]. Расшифрование основано на использовании простых делителей числа [math]\displaystyle{ \sigma }[/math][1].
Генерация ключа
- Выбрать [math]\displaystyle{ k }[/math] «маленьких простых чисел» [math]\displaystyle{ p_{1}, ..., p_{k} }[/math] где [math]\displaystyle{ k }[/math] — четное. Здесь фраза «маленькие простые числа» означает, что берутся или первые из простых чисел(1, 3, 5, …) или генерируются каким-либо другим способом, кроме как использования алгоритмов генерации больших простых чисел.
- Пусть [math]\displaystyle{ u = \prod_{i=1}^{k/2} p_i }[/math], [math]\displaystyle{ \upsilon =\prod_{i=k/2 + 1}^{k} p_i }[/math] и [math]\displaystyle{ \sigma = uv = \prod_{i=1}^k p_i }[/math]
- Выбрать 2 «больших простых числа» [math]\displaystyle{ a,\ b }[/math], таких, что [math]\displaystyle{ p = 2au + 1 }[/math], [math]\displaystyle{ q = 2b\upsilon + 1 }[/math] — простые. Здесь фраза «большие простые числа» использована в том смысле, в каком ее использует в алгоритмах генерации больших простых чисел.
- Пусть [math]\displaystyle{ n = pq }[/math]. В литературе число [math]\displaystyle{ n }[/math] — произведение «больших простых чисел» — называют RSA число.
- Выбрать случайным образом число [math]\displaystyle{ g\ mod\ n }[/math], такое что у [math]\displaystyle{ g }[/math] порядок [math]\displaystyle{ \phi(n)/4 }[/math]
Тогда открытый ключ формирует тройка чисел [math]\displaystyle{ \sigma,\ n,\ g }[/math]. А закрытый — [math]\displaystyle{ p,\ q }[/math][1]
С ростом числа [math]\displaystyle{ n }[/math] генерация ключа становится очень затратной по времени операцией, потому что число a должно быть в подходящем диапазоне и, кроме того, удовлетворять тестам на простоту вместе с числом [math]\displaystyle{ p = 2au + 1 }[/math]. Для обхода этого затруднения, авторы предлагают сначала сгенерировать простые числа [math]\displaystyle{ a,\ b,\ u, \upsilon }[/math] и затем, подбирая вспомогательные простые числа [math]\displaystyle{ p', q' }[/math], достичь равенства [math]\displaystyle{ p = 2aup' + 1 }[/math]и [math]\displaystyle{ q = 2b\upsilon q' + 1 }[/math], где [math]\displaystyle{ p,\ q }[/math] будут простыми[1].
Шифрование
Шифрование состоит из единственной операции возведения в степень по модулю [math]\displaystyle{ n }[/math]: сообщение [math]\displaystyle{ m }[/math], меньшее [math]\displaystyle{ \sigma }[/math], шифруется как [math]\displaystyle{ E(m) = g^m mod\ n }[/math]. Причём здесь никак не используются [math]\displaystyle{ \sigma }[/math].[1]
Расшифрование
Расшифрование основано на китайской теореме об остатках. Пусть [math]\displaystyle{ p_i,\ 1 \leq i \leq k }[/math] — простые делители [math]\displaystyle{ \sigma }[/math]. Алгоритм вычисляет [math]\displaystyle{ m_{i} = m\ mod\ p_{i} }[/math] и затем дешифрует сообщение m с помощью китайской теоремы об остатках[1].
Чтобы найти mi при заданном шифротексте [math]\displaystyle{ c = g^m mod\ n }[/math], алгоритм вычисляет [math]\displaystyle{ c_{i}\ = \ c^{\phi(n)/p_{i}}\ mod\ n }[/math], что в точности равно [math]\displaystyle{ g^{m_{i}\phi(n)/p_{i}}\ mod\ n }[/math]. Это следует из следующих вычислений — здесь [math]\displaystyle{ y_{i} = (m - m_{i})/p_{i} }[/math]: [math]\displaystyle{ c_{i}\ =\ c^{\phi(n)/p_{i}}\ =\ g^{m\phi(n)/p_{i}}\ =\ g^{(m_{i} + y_{i}p_{i})\phi(n)/p_{i}}\ =\ g^{m_{i}\phi(n)/p_{i}}g^{y_{i}\phi(n)}\ =\ g^{m_{i}\phi(n)/p_{i}}\ mod\ n }[/math]. Сравнивая этот результат со всеми возможными степенями [math]\displaystyle{ g^{j\phi(n)/p_{i}} }[/math], можно найти значение [math]\displaystyle{ m_{i} }[/math]. Более формально функция расшифрования представлена псевдокодом[1]:
for [math]\displaystyle{ i }[/math] = 1 to [math]\displaystyle{ k }[/math]:
[math]\displaystyle{ c_{i}\ = \ c^{\phi(n)/p_{i}}\ mod\ n }[/math]for [math]\displaystyle{ j }[/math] = 0 to [math]\displaystyle{ p_i }[/math] — 1:
if [math]\displaystyle{ c_{i} == g^{j\phi(n)/p_{i}}\ mod\ n }[/math]:
[math]\displaystyle{ m_i= j }[/math]
[math]\displaystyle{ x }[/math] = ChineseReminder([math]\displaystyle{ m_i }[/math], [math]\displaystyle{ p_i }[/math])
Пример
Генерация ключа для [math]\displaystyle{ k = 6 }[/math]
[см. «Описание детерминированного варианта криптосистемы»]
[math]\displaystyle{ p = 21211 = 2 * 101 * 3 * 5 * 7 + 1 }[/math]
[math]\displaystyle{ q = 928643 = 2 * 191 * 11 * 13 * 17 + 1 }[/math]
[math]\displaystyle{ n = 21211 * 928643 = 19697446673 }[/math]
[math]\displaystyle{ g = 131 }[/math]
[math]\displaystyle{ \sigma = 3 * 5 * 7 * 11 * 13 * 17 }[/math]
[math]\displaystyle{ p_1 = 3,..., p_6 = 17 }[/math]
i=1 | i=2 | i=3 | i=4 | i=5 | i=6 | |
---|---|---|---|---|---|---|
j = 0 | 1 | 1 | 1 | 1 | 1 | 1 |
j = 1 | 1966 | 6544 | 1967 | 6273 | 6043 | 372 |
j = 2 | 9560 | 3339 | 4968 | 7876 | 4792 | 7757 |
j = 3 | 9400 | 1765 | 8720 | 262 | 3397 | |
j = 4 | 6488 | 8651 | 6291 | 702 | ||
j = 5 | 2782 | 4691 | 677 | 4586 | ||
j = 6 | 9489 | 1890 | 8135 | |||
j = 7 | 8537 | 6878 | 3902 | |||
j = 8 | 2312 | 2571 | 5930 | |||
j = 9 | 7701 | 7180 | 6399 | |||
j = 10 | 8291 | 9771 | ||||
j = 11 | 678 | 9771 | ||||
j = 12 | 609 | |||||
j = 13 | 7337 | |||||
j = 14 | 6892 | |||||
j = 15 | 3370 | |||||
j = 16 | 3489 |
Шифрование [math]\displaystyle{ m = 202 }[/math]
[math]\displaystyle{ c = g^{m} mod\ n = 131202\ mod\ 19697446673 }[/math]
Расшифрование
[math]\displaystyle{ c^{\phi(n)/ p_1}\ mod\ n mod\ 10000 = 1996 }[/math]
[math]\displaystyle{ c^{\phi(n)/ p_2}\ mod\ n\ mod\ 10000 = 3339 }[/math]
[math]\displaystyle{ c^{\phi(n)/ p_3}\ mod\ n\ mod\ 10000 = 2782 }[/math]
[math]\displaystyle{ c^{\phi(n)/ p_4}\ mod\ n\ mod\ 10000 = 7994 }[/math]
[math]\displaystyle{ c^{\phi(n)/ p_5}\ mod\ n\ mod\ 10000 = 1890 }[/math]
[math]\displaystyle{ c^{\phi(n) / \ p_6}\ mod\ n\ mod\ 10000 = 3370 }[/math]
Далее, используя таблицу, расположенную выше:
[math]\displaystyle{ m_1 = m\ mod\ 3 = table(1996) = 1 }[/math]
[math]\displaystyle{ m_2= m\ mod\ 5 = table(3339) = 2 }[/math]
[math]\displaystyle{ m_3 = m\ mod\ 7 = table(2782) = 1996 }[/math]
[math]\displaystyle{ m_4 = m\ mod\ 11 = table(7994) = 4 }[/math]
[math]\displaystyle{ m_5 = m\ mod\ 13 = table(1890) = 7 }[/math]
[math]\displaystyle{ m_6 = m\ mod\ 17 = table(3370) = 15 }[/math]
и по китайской теореме об остатках получаем: [math]\displaystyle{ m= 202 }[/math][1]
Описание вероятностного варианта криптосистемы
Вероятностный вариант криптосистемы — это усовершенствование предшествующих вероятностных криптосистем (например, криптосистемы Бенало).
Предшествующие криптосистемы имели очень существенный недостаток: чтобы зашифровать маленький набор данных [math]\displaystyle{ S }[/math] (например, голоса 0, 1 в электронном голосовании), детерминированные криптосистемы, например, RSA, не подходят[1], потому что для расшифровки будет достаточно сравнить шифротекст с зашифрованными элемента набора [math]\displaystyle{ S }[/math]. Это свойство криптосистем — невозможность различить шифротексты различных элементов набора S, называется семантической стойкостью[5]. Но при сочетании гомомофрности и семантической стойкости, предшествующие криптосистемы начинали генерировать около килобайта шифротекста, чтобы зашифровать открытый текст в несколько бит[1]. В криптосистеме Накаша — Штерна, кроме того, что есть свойства гомоморфности, семантической стойкости, отношение между размером шифротекста и размером открытого текста в точности равно [math]\displaystyle{ n / \sigma }[/math]. Авторы утверждают, что безопасно взять [math]\displaystyle{ \sigma / n \lt \frac{1}{4} }[/math][1].
Генерация ключа
- Выбрать [math]\displaystyle{ k }[/math] «маленьких простых чисел» [math]\displaystyle{ p_{1}, ..., p_{k} }[/math] где [math]\displaystyle{ k }[/math] — четное. Здесь фраза «маленькие простые числа» означает, что берутся или первые из простых чисел(1, 3, 5, …) или генерируются каким-либо другим способом, кроме как использования алгоритмов генерации больших простых чисел.
- Пусть [math]\displaystyle{ u = \prod_{i=1}^{k/2} p_i }[/math], [math]\displaystyle{ \upsilon = \prod_{i=k/2 + 1}^{k} p_i }[/math] и [math]\displaystyle{ \sigma = uv = \prod_{i=1}^k p_i }[/math]
- Выбрать 2 «больших простых числа» [math]\displaystyle{ a,\ b }[/math], таких, что [math]\displaystyle{ p = 2au + 1 }[/math], [math]\displaystyle{ q = 2b\upsilon + 1 }[/math] — простые. Здесь фраза «большие простые числа» использована в том смысле, в каком ее использует в алгоритмах генерации больших простых чисел.
- Пусть [math]\displaystyle{ n = pq }[/math] — RSA число.
- Выбрать случайным образом число [math]\displaystyle{ g\ mod\ n }[/math], такое что у [math]\displaystyle{ g }[/math] порядок [math]\displaystyle{ \phi(n)/4 }[/math]
Тогда открытый ключ формирует тройка чисел [math]\displaystyle{ \sigma,\ n,\ g }[/math]. А закрытый — [math]\displaystyle{ p,\ q }[/math][1]
Шифрование
Шифрование в вероятностном варианте очень похоже на шифрование в детерминированном варианте[см. «Описание детерминированного варианта криптосистемы»]. А именно, пусть [math]\displaystyle{ x }[/math]— случайным образом выбранное положительное число из кольца вычетов по модулю [math]\displaystyle{ n }[/math]: [math]\displaystyle{ x \in \mathbb Z/n\mathbb Z }[/math]. Тогда алгоритм записывается в виде [math]\displaystyle{ E(m) = x^{\sigma}g^{m} mod\ n }[/math][1]
Расшифрование
Расшифрование в вероятностном варианте алгоритма Д. Накаше и Ж. Штерна остается без изменений в сравнении с детерминированным вариантом [см. «Описание детерминированного варианта криптосистемы»]. Эффект от умножение на [math]\displaystyle{ x^{\sigma} }[/math] при шифровании учитывается, когда мы возводим шифротекст в степени [math]\displaystyle{ \phi(n)/p_i }[/math]. Проделаем вычисления, чтобы убедиться в этом.
Пусть [math]\displaystyle{ p_i, 1 \leq i \leq k }[/math] — простые делители [math]\displaystyle{ \sigma }[/math]. Алгоритм вычисляет [math]\displaystyle{ m_{i} = m\ mod\ p_{i} }[/math] и затем дешифрует сообщение [math]\displaystyle{ m }[/math] с помощью китайской теоремы об остатках.
Чтобы найти [math]\displaystyle{ m_i }[/math], при заданном шифротексте [math]\displaystyle{ c = x^{\sigma}g^{m} mod\ n }[/math], алгоритм вычисляет [math]\displaystyle{ c_{i}\ = \ c^{\phi(n)/p_{i}}\ mod\ n }[/math], что в точности равно [math]\displaystyle{ g^{m_{i}\phi(n)/p_{i}}\ mod\ n }[/math]. Это следует из следующих вычислений:
- [math]\displaystyle{ \begin{matrix} c^{\phi(n)/p_i} &\equiv& x^{\sigma \phi(n)/p_i} g^{m\phi(n)/p_i} \mod n\\ &\equiv& g^{(m_i + y_ip_i)\phi(n)/p_i} \mod n \\ &\equiv& g^{m_i\phi(n)/p_i} \mod n \end{matrix} }[/math]
Сравнивая этот результат со всеми возможными степенями [math]\displaystyle{ g^{j\phi(n)/p_{i}} }[/math], можно найти значение [math]\displaystyle{ m_{i} }[/math][1]
Применение
В превалирующем большинстве областей применения криптосистемы Накаша — Штерна используется свойство гомоморфности этой криптосистемы по сложению и вычитанию[6][2]:
- Предположим, что у клиента в банке на счету [math]\displaystyle{ m }[/math] и он хочет снять небольшую сумму [math]\displaystyle{ u }[/math]. Предположим также, что баланс [math]\displaystyle{ m }[/math] хранится в зашифрованном виде [math]\displaystyle{ E(m) }[/math], и представитель банка, выполняя операцию снятия со счета клиента суммы [math]\displaystyle{ u }[/math], не имеет доступа к расшифрованию данных счета. С помощью криптосистема Накаша — Штерна предлагается простое решение этой проблемы через операцию [math]\displaystyle{ E(m) / E(u)\ mod\ n }[/math] — это значение нового баланса на счету в зашифрованном виде : [math]\displaystyle{ m - u }[/math]. Более формально: пусть [math]\displaystyle{ E(m_1) = g^{m_1} mod\ n,\ E(m_2) = g^{m_2} mod\ n }[/math]— алгоритмы шифрования счетов [math]\displaystyle{ m_1,\ m_2 }[/math], тогда счет, равный сумме [math]\displaystyle{ m_1 }[/math]и [math]\displaystyle{ m_2 }[/math]вычисляется по следующей формуле: [math]\displaystyle{ E(m_1)E(m_2) = g^{m_1}g^{m_2} mod\ n = g^{m_1 + m_2} mod\ n }[/math][1].
- Безопасность облачных вычислений. Предположим, что в облаке [math]\displaystyle{ S }[/math] содержится множество пользователей (клиентов) [math]\displaystyle{ p_1 , ..., p_i , ..., p_l }[/math]. У пользователя [math]\displaystyle{ p_i }[/math] имеются конфиденциальные данные [math]\displaystyle{ x_i }[/math] , хранящиеся в облаке. Такая облачная услуга называется Storage aaS (хранилище как сервис). Пользователь [math]\displaystyle{ p_i }[/math] может обратиться к облаку с запросом на вычисление значения некоторой функции [math]\displaystyle{ F }[/math], зависящей от конфиденциальных данных. Запрос должен состоять из описания функции [math]\displaystyle{ F }[/math], идентификатора пользователя и его открытого ключа [math]\displaystyle{ pk_i }[/math]. Облако должно проверить полномочия пользователя [math]\displaystyle{ p_i }[/math] на вычисление [math]\displaystyle{ F(x_i) }[/math]. Такая проверка может быть реализована с помощью стандартной процедуры электронной цифровой подписи. Если пользователь подтвердил свои права на вычисление функции [math]\displaystyle{ F }[/math], то облако должно вычислить значение [math]\displaystyle{ E(pk_i,\ F(x_i)) }[/math] и отправить его пользователю. В качестве [math]\displaystyle{ E }[/math] можно взять функцию шифрования любой гомоморфной криптосистемы с открытым ключом, какой, к примеру, является криптосистема Накаше — Штерна. Пользователь, который размещает в хранилище свои конфиденциальные данные и дает запрос на вычисление функции [math]\displaystyle{ F }[/math], не доверяет облаку и должен принимать соответствующие меры и предъявлять требования по обеспечению их безопасности. Очевидно, что было бы гораздо безопаснее передавать данные в таком виде, чтобы во время операций, которые производятся над ними, никоим образом не распространялась информация об этих данных. Поэтому, во-первых, данные необходимо шифровать, причем они должны поступать на сервер уже в шифрованном виде. Это означает, что шифрование должно осуществляться ещё пользователем. Во-вторых, необходимо обрабатывать эти данные без расшифровки, так как для передачи и хранения секретного ключа необходимо соблюдение определённых процедур, особенно сложных, если информация обрабатывается в недоверенной среде. Криптосистемы с гомоморфным шифрованием как раз помогают решить эти проблемы[7][2].
- Обфускация для защиты программных продуктов. Впервые о применении обфускации в криптографии было упомянуто в работе Диффи и Хеллмана[8]. В ней, для построения асимметричной криптосистемы, предложено использовать сложность задачи, заключающейся в анализе программ на низкоуровневом языке программирования (ассемблере, байт-коде). Основной целью обфускации является затруднение понимания функционирования программы. Поскольку все традиционные компьютерные архитектуры используют двоичные строки, применяя полностью гомоморфное шифрование над битами, можно вычислить любую функцию. Следовательно, можно гомоморфно зашифровать целиком всю программу так, что она сохранит свою функциональность[9].
- Электронное голосование. А именно, Пусть есть [math]\displaystyle{ n }[/math] кандидатов и дирекция, которая обладает этой криптосистемой, распространяет среди участников бюллетень-вектор [math]\displaystyle{ (p_1, ...,\ p_n) }[/math], где [math]\displaystyle{ p_i }[/math]— фамилия [math]\displaystyle{ i }[/math] — го кандидата. И у каждого участника есть открытый ключ [math]\displaystyle{ pk }[/math]. По итогу мы получаем — каждый избиратель возвращает дирекции вектор [math]\displaystyle{ (\nu_{1},..., \nu_{n}) }[/math], где [math]\displaystyle{ \nu_{i} \in \{0, 1\} }[/math]- вектор предпочтений. Победителем выбором считается тот кандидат, который набрал в сумме больше всех голосов — это число — сумма голосов — подсчитывается над шифрованными векторами избирателей. Это становится возможным благодаря гомоморфности. А польза от такого подхода в том, что нет необходимости расшифровывать данные избирателей для подсчета голосов — повышается безопасность выборов для избирателей[10].
- Область водяных знаков[11]. Гомоморфность криптосистемы позволяет наносить водяной знак на зашифрованные данные[12].
- Доказательство с нулевым разглашением. Гомоморфные системы применяются, когда появляется необходимость подтвердить владение какой-либо информации, которая поддается такой проверке без раскрытия самой информации[13][14].
Атаки
Широко известных атак на эту криптосистему не задокументировано. Сами авторы поощряют работу над взломом криптосистемы. В оригинальной статье предлагаются[1] 768 долларов тому, кто расшифрует шифротекст [math]\displaystyle{ c }[/math] и опубликует метод криптоанализа. Ниже представлены данные для этой задачи.
[math]\displaystyle{ c }[/math] = 13370fe62d81fde356d1842fd7e5fc1ae5b9b449
bdd00866597e61af4fb0d939283b04d3bb73f91f
0d9d61eb0014690e567ab89aa8df4a9164cd4c63
6df80806c7cdceda5cfda97bf7c42cc702512a49
dd196c8746c0e2f36ca2aee21d4a36a16
[math]\displaystyle{ g }[/math] = 0b9cf6a789959ed4f36b701a5065154f7f4f15176d731b4897875d26a9e244415e111479050894ba7
c532ada1903c63a84ef7edc29c208a8ddd3fb5f7
d43727b730f20d8e12c17cd5cf9ab4358147cb62
a9fb887bf15204e444ba6ade613274316
[math]\displaystyle{ n }[/math] = 1459b9617b8a9df6bd54341307f1256dafa241bd65b96ed14078e80dc6116001b83c5f88c7bbcb0b
db237daac2e76df5b415d089baa0fd078516e60e
2cdda7c26b858777604c5fbd19f0711bc75ce00a
5c37e2790b0d9d0ff9625c5ab9c7511d16
Здесь [math]\displaystyle{ k = 30 }[/math]([math]\displaystyle{ p_i }[/math]— формируются из первых [math]\displaystyle{ i }[/math] простых чисел, кроме 2)[1].
Ссылки
- ↑ 1,00 1,01 1,02 1,03 1,04 1,05 1,06 1,07 1,08 1,09 1,10 1,11 1,12 1,13 1,14 1,15 1,16 1,17 1,18 1,19 1,20 Jacques, Stern. A New Public Key Cryptosystem Based on Higher Residues (англ.) // ACM. — 1998. — P. 59–66. Архивировано 6 декабря 2006 года.
- ↑ 2,0 2,1 2,2 А.И. Трубей. Гомоморфное шифрование: безопасность облачных вычислений и другие приложения (обзор) (рус.) // Информатика. — 2015. — Январь. Архивировано 26 ноября 2018 года.
- ↑ Реализацию алгоритмов шифрования, расшифровывания, генерации ключа в криптосистеме Накаше — Штерна . Дата обращения: 16 декабря 2018. Архивировано 28 декабря 2020 года.
- ↑ Thomas W. Cusick. A comparison of RSA and the Naccache-Stern public-key cryptosystem (англ.) // Security Protocols. — Berlin, Heidelberg: Springer Berlin Heidelberg, 1997. — P. 111–116. — ISBN 9783540624943, 9783540680475. — doi:10.1007/3-540-62494-5_10. Архивировано 2 декабря 2018 года.
- ↑ S. Goldwasser, S. Micali. Probabilistic Encryption (англ.) // JCSS. — 1984. — Апрель. — P. 270—299.
- ↑ A Brief Overview of Homomorphic Cryptosystem and Their Applications // nternational Journal of Computer Applications. — 2015.
- ↑ R.L. Rivest, L. Adleman, M.L. Dertouzos. On data banks and privacy homomorphisms // Foundations of secure computation.
- ↑ W. Diffie, M. Hellman. New directions in cryptography // IEEE Trans. Inf. Theory.
- ↑ J. Alwen [et al.] On the relationship between functional encryption, obfuscation, and fully homomorphic encryption // Cryptography and Coding – 14th IMA Intern. Conf., IMACC-2013..
- ↑ J.D. Cohen Benaloh. Verifiable Secret-Ballot Elections (англ.) // Yale University : Ph-D thesis. — 1988.
- ↑ B. Pfitzmann, M. Schunter. Assymetric fingerprinting (англ.) // Spinger-Verlag. — 1996. — P. 84—95.
- ↑ Constructing Secure Content-Dependent Watermarking Scheme using Homomorphic Encryption.
- ↑ O. Goldreich, S. Micali, A. Wigderson. Proofs that Yield Nothing But Their Validity and a Methodology of Cryptographic Protocol Design (англ.). — 1986. — P. 174—187.
- ↑ G. Brassard, D. Chaum, C. Crépeau. Minimum Disclousure Proofs of Knowledge // JCSS. — 1988. Архивировано 27 сентября 2011 года.