Как зашифровать одно сообщение для нескольких получателей? - PullRequest
8 голосов
/ 02 сентября 2008

Каковы основные принципы обеспечения шифрования данных ровно двумя ключами (которые могут быть основаны на пароле), но для дешифрования данных требуется только один (любой) из двух ключей?

Например, данные шифруются паролем пользователя и паролем его компании, а затем он или его компания могут расшифровать данные. Ни один из них не знает другого пароля. Сохраняется только одна копия зашифрованных данных.

Я не имею в виду открытый / закрытый ключ. Вероятно, с помощью криптографии с симметричным ключом, и, возможно, это связано с тем, что XOR соединяет ключи вместе, чтобы использовать их для шифрования.

Обновление: я также хотел бы найти решение, которое вообще не предполагает хранения ключей.

Ответы [ 5 ]

19 голосов
/ 02 сентября 2008

Обычно это делается для создания единого симметричного ключа для шифрования данных. Затем вы шифруете симметричный ключ ключом или паролем каждого получателя, чтобы они могли расшифровать его самостоятельно. S / MIME (фактически синтаксис криптографических сообщений, на котором основан S / MIME) использует эту технику.

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

6 голосов
/ 02 сентября 2008

Вообще говоря, то, что вы делаете, - это шифруете данные с помощью случайно сгенерированного ключа, а затем добавляете версии этого случайного ключа, которые были зашифрованы каждым известным ключом. Поэтому любой, у кого есть действительный ключ, может обнаружить «настоящий» ключ, который использовался для шифрования данных.

1 голос
/ 06 августа 2014

Если я вас правильно понял, у вас есть некоторые данные, которые вы хотите зашифровать и распределить ключ шифрования, разбитый на n «частей ключа». (В вашем случае 2 части)

Для этого вы можете использовать разделение на основе XOR, вот как это работает: Вы предоставляете необходимое количество частей - n, а секретный ключ - K. Чтобы сгенерировать n частей вашего ключа, вам нужно создать (n - 1) случайные числа: R1, R2, R3,. , , , Rn − 1. Для этого вы можете использовать генератор чисел SecureRandom, который предотвратит дублирование. Когда вы используете функцию XOR для этих частей Rn-1 и ваш ключ - K:
Rn = R1 ⊕ R2 ⊕ R3 ⊕. , , ⊕ Rn − 1 ⊕ K

Теперь у вас есть n фигур: R1, R2, R3,…, Rn-1, Rn, и вы можете уничтожить K. Эти фрагменты могут быть распространены в вашем коде или отправлены пользователям.

Чтобы собрать ключ, мы используем операцию XOR на наших Rn-компонентах:
K = R1 ⊕ R2 ⊕ R3 ⊕. , , ⊕ Rn − 1 ⊕ Rn

При использовании функции XOR (⊕) каждый фрагмент по своей сути важен для восстановления ключа; если какие-либо биты в любом из фрагментов изменены, ключ не подлежит восстановлению.

Для получения дополнительной информации и кода вы можете взглянуть на утилиту Android, которую я написал для этой цели:
Проект GitHub: https://github.com/aivarsda/Secret-Key-Split-Util

Также вы можете попробовать демонстрационное приложение Secret Key Splitter, которое использует эту Утилиту:
GooglePlay: https://play.google.com/store/apps/details?id=com.aivarsda.keysplitter

0 голосов
/ 16 сентября 2008

В более общем случае секрет (в данном приложении - ключ дешифрования данных) может быть разделен на общие ресурсы, так что для восстановления секретного кода требуется некоторое пороговое число этих общих ресурсов. Это называется секретным разделением или с n общими ресурсами и порогом t, (t, n) -пороговой схемы.

Один из способов сделать это - создать многочлен порядка t-1, установить секрет в качестве первого коэффициента и выбрать остальные коэффициенты случайным образом. Затем n случайных точек на этой кривой выбираются и становятся долями.

0 голосов
/ 02 сентября 2008

Я думаю, что подумал о решении, которое будет работать:

D = data to encrypt
h1 = hash(userpassword)
h2 = hash(companyPassword)
k = h1 concat h2

E = function to encrypt
//C is the encrypted data
C = E_h1(h2) concat E_h2(h1) concat E_k(D)

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

Возможно, есть лучшее решение, чем это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...