Как отметил Люк Джошуа Парк в комментариях, это звучит как сценарий использования учебника для секретной схемы обмена . В частности, я бы порекомендовал вам:
- Генерация случайного ключа AES (или другого симметричного шифра). Обязательно используйте для этого криптографически безопасный ГСЧ (например, Crypto.randomBytes () ), поскольку злоумышленник, который может угадать этот ключ, может также взломать всю схему!
- Зашифруйте данные с помощью этого ключа, используя аутентифицированный режим шифрования, такой как AES-SIV (как предусмотрено, например, miscreant ).
- Разделите ключ AES на несколько долей, используя Схема совместного доступа Шамира с желаемым порогом восстановления. (Некоторые реализации JS, которые я обнаружил при быстром поиске в Google, включают secrets.js , jsss и ThresholdJS .)
- Зашифруйте каждую папку с помощью открытого ключа другого пользователя.
- Отправьте каждому пользователю его зашифрованный общий ресурс и копию зашифрованных данных AES.
Отказ от ответственности: Я не проверял безопасность или правильность любого из API или библиотек, указанных выше. Криптографические методы, которые, по их утверждению, используются, кажутся разумными и подходящими для этой задачи, но я не могу гарантировать, что они были реализованы безопасно и правильно. Предостережение emptor.
Чтобы расшифровать данные, каждый пользователь может сначала расшифровать свою долю ключа AES, используя свой закрытый ключ, а затем можно объединить достаточное количество расшифрованных общих ресурсов (используя ту же реализацию секретного обмена Shamir, которая использовалась для их создания). ) восстановить исходный ключ AES, который затем можно использовать для расшифровки (и проверки целостности) данных.
Обратите внимание, что секретный обмен Шамиром подразумевает, что пользователи, которые объединяют свои акции, чтобы восстановить секрет, будут доверять друг другу, а не лгать о своих акциях или иным образом плохо себя вести. Если это не обязательно так, злоумышленник может обмануть других, используя различные способы & mdash; возможно, наиболее просто: подождать, пока все остальные покажут им свою долю, а затем отказаться от раскрытия своей доли другим. В общем, предотвращение таких атак практически невозможно без помощи какой-либо взаимно доверяющей стороны.
Однако, по крайней мере, использование режима шифрования, такого как AES-SIV со встроенной аутентификацией , должно гарантировать, что пользователи обнаружат, является ли восстановленный ключ AES неправильным, поскольку дешифрование затем завершится неудачно. Если вы хотите быть в этом более уверенным, вы можете захотите также отправить каждому из пользователей защищенный криптографический хеш (например, SHA-512 ) ключа AES, чтобы они можно проверить его правильность перед попыткой расшифровки.