2008-09-02 3 views
8

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

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

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

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

+0

Смотрите также: https://superuser.com/q/554513/199930 – 2017-09-15 01:55:46

ответ

18

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

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

+0

есть ли какие-либо проблемы безопасности с помощью этого метода? Если я отправляю несколько файлов (каждый файл с другим симметричным ключом) в тот же список получателей (назовите их A и B). Может ли человек посмотреть, что такое симметричный ключ (исходный текст) и зашифрованная форма для человека B, и определить ключ человека B, если отправлено достаточно сообщений? – 2009-05-10 23:00:50

+1

Asa, это будет зависеть от алгоритма, используемого для шифрования ключа шифрования содержимого (сообщения). Некоторые алгоритмы могут быть уязвимыми. Обычно я использую RSA для шифрования ключа шифрования содержимого, и там правильный режим заполнения может защищаться от атак с открытым текстом. Я использую OAEP, когда это возможно. – erickson 2009-05-11 00:53:47

+0

erickson, Итак, у вас будет ключ A, который использовался для шифрования сообщения, а затем отправить пользователю 1 копию A, зашифрованную с помощью ключа паба 1, отправить пользователю 2 копию A, зашифрованную с помощью ключа pub 2 и т. Д.? – user8675309 2017-11-16 16:56:46

6

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

0

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

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) 

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

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

0

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

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

1

Если я вас правильно понял, у вас есть данные, которые вы готовы для шифрования и распространения ключа шифрования расщепляется в п 'ключевых элементов. (В вашем случае 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 Utility, которую я написал для этой цели можно:
GitHub проекта: https://github.com/aivarsda/Secret-Key-Split-Util

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

Смежные вопросы