Как зашифровать одно сообщение для нескольких получателей?

StackOverflow https://stackoverflow.com/questions/38846

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Чтобы собрать ключ, мы используем операцию XOR на наших элементах Rn:
K = R1 & # 8853; R2 & # 8853; R3 & # 8853; , , , & # 8853; Rn & # 8722; 1 & # 8853; Rn

С помощью функции XOR (& # 8853;) каждый фрагмент по своей сути важен при восстановлении ключа: если какие-либо биты в любом из фрагментов изменены, то ключ не подлежит восстановлению.

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

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

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

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)

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top