여러 수신자에 대해 하나의 메시지를 암호화하는 방법은 무엇입니까?

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

문제

정확히 두 개의 키(비밀번호 기반일 수 있음)를 사용하여 데이터 암호화를 수행하지만 데이터를 해독하려면 두 키 중 하나만(둘 중 하나만 필요함) 기본 사항은 무엇입니까?

예를 들어, 데이터는 사용자의 비밀번호와 회사의 비밀번호로 암호화된 후 해당 사용자 또는 회사가 데이터를 해독할 수 있습니다.둘 중 누구도 다른 비밀번호를 모릅니다.암호화된 데이터의 복사본은 하나만 저장됩니다.

공개/개인 키를 의미하는 것이 아닙니다.아마도 대칭 키 암호화를 통해 암호화에 사용하기 위해 키를 함께 XOR하는 것과 같은 작업이 포함될 수도 있습니다.

업데이트:또한 키를 전혀 저장하지 않는 솔루션을 찾고 싶습니다.

도움이 되었습니까?

해결책

이것이 관례적으로 수행되는 방식은 데이터를 암호화하기 위한 단일 대칭 키를 생성하는 것입니다.그런 다음 각 수신자의 키 또는 비밀번호로 대칭 키를 암호화하면 수신자가 스스로 해독할 수 있습니다.S/MIME(실제로 S/MIME의 기반이 되는 암호화 메시지 구문)은 이 기술을 사용합니다.

이렇게 하면 암호화된 메시지의 복사본 하나만 저장하고 해당 키의 복사본은 여러 개 저장하면 됩니다.

다른 팁

일반적으로 말해서, 무작위로 생성된 키로 데이터를 암호화한 다음 알려진 모든 키로 암호화된 무작위 키 버전을 추가하는 것입니다.따라서 유효한 키를 가진 사람은 누구나 데이터를 암호화하는 데 사용된 '실제' 키를 발견할 수 있습니다.

내가 올바르게 이해했다면 암호화 키를 n개의 '키 조각'으로 분할하여 암호화하고 배포하려는 데이터가 있습니다.(귀하의 경우 2개 조각)

이를 위해 XOR 기반 분할을 사용할 수 있으며 작동 방식은 다음과 같습니다.필요한 조각 수(n)와 비밀 키(K)를 제공합니다.n개의 키 조각을 생성하려면 (n – 1)개의 난수를 생성해야 합니다.R1, R2, R3, ..., Rn-1.이를 위해 중복을 방지하는 SecureRandom 숫자 생성기를 사용할 수 있습니다. 그런 다음 이러한 Rn-1 부분과 키 - K에 대해 XOR 기능을 작동합니다.
Rn = R1 ⊕ R2 ⊕ R3 ⊕ ...⊕ Rn−1 ⊕ K

이제 n개의 조각이 생겼습니다.R1, R2, R3, …, Rn-1, Rn 및 K를 파괴할 수 있습니다.이러한 조각은 코드에 분산되거나 사용자에게 전송될 수 있습니다.

키를 재조립하기 위해 Rn 조각에 대해 XOR 연산을 사용합니다.
K = R1 ⊕ R2 ⊕ R3 ⊕ ...⊕ Rn−1 ⊕ Rn

XOR 기능(⊕)을 사용하면 각 조각이 키 재구성에 본질적으로 중요합니다. 조각의 비트가 변경되면 키를 복구할 수 없습니다.

자세한 정보와 코드를 보려면 해당 목적으로 제가 작성한 Android 유틸리티를 살펴보세요.
GitHub 프로젝트: https://github.com/aivarsda/Secret-Key-Split-Util

또한 해당 유틸리티를 사용하는 Secret Key Splitter 데모 앱을 사용해 볼 수도 있습니다.
구글 플레이: https://play.google.com/store/apps/details?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