여러 수신자에게 공개 키 암호화 사용
여러 수신자에게 보내려는 메시지가 있습니다.
각 수신자의 공개 키로 메시지를 개별적으로 암호화 한 다음 암호화 된 메시지를 각 수신자에게 보낼 수 있습니까?
공격자가 암호화 된 모든 메시지를 얻고 모든 메시지가 동일한 콘텐츠를 가지고 있지만 다른 키로 암호화되어 있음을 알고 있다면 공격이 더 쉬워 질까요?
공격자가 메시지 중 하나를 해독하거나 다른 방법으로 일반 텍스트를 얻는 경우 다른 개인 키를 손상시킬 수 있습니까?
이 시나리오에서 다른 것보다 더 잘 작동하는 비대칭 암호화 형태가 있습니까?
답변
분석 할 방법의 세부 사항을 지정하지 않았지만 일반적인 방법은 순수하게 공개 키 암호화를 사용한 암호화가 아니라 대칭 키가 공개 키 암호화와 함께 전송되고 키가 다음과 같은 하이브리드 암호화 시스템을 기반으로합니다. 대칭 키 암호화에 사용됩니다.
RSA 사용
메시지를 보내고 싶다고 가정 해 보겠습니다. $m$ ...에 $n$ 파티는 각각 $pub_i$ 과 $prv_i$ 키 (OAEP와 함께 RSA 사용).
이제 균일 한 임의의 AES256 키 생성 $k$ AES-GCM으로 메시지를 암호화합니다.
$$(c,tag) = \operatorname{AES-GCM-Enc}(k,IV,m)$$
이제 암호화 $k$ 각 사람을 위해 $$\bar k = \operatorname{RSA-OAEP-Enc}(pub_i,k)$$ 각 사용자에게 $(\bar k, c, IV, tag)$. 이제 각 사용자는 개별적으로 키를 얻을 수 있습니다.$k$ 메시지를 해독합니다.
약점은 관찰자가 모두에게 동일한 메시지를 보냈다는 것을 볼 수 있다는 것입니다. 이를 완화하려면 필요한 경우 사용자별로 다른 IV를 사용하십시오. 이렇게하면 암호화 시간이 늘어납니다.
기타 후보
RSA-KEM
위의 내용은 RSA를 직접 사용한 것입니다. 일반적으로 RSA-KEM을 사용할 수 있습니다 (아래에서 간략히 설명, 여기 에서 자세한 내용 참조 ).
- 무작위 생성 $r \in [1,n-1]$ HKDF를 사용하여 키를 파생합니다.
- 파생 키를 사용하여 AES-GCM으로 메시지 암호화
- 보내다 $r$ 교과서 -RSA와 함께 $(c,tag)$
NaCL
NaCl 에는이를위한 기존 솔루션이 있습니다. 인증 된 암호화
통합 암호화 체계 (IES)
IES (Integrated Encryption Scheme) 에는 곱셈 및 타원 곡선 버전도 있습니다.
Elliptic curve 버전 ECIES에서는 먼저
- 타원 곡선 매개 변수 $(q,n,b,G,n,h)$
- 키 유도 함수 (KDF)
- HMAC-SHA256과 같은 메시지 인증 코드 (또는 AES-GCM 또는 ChaCha20-Poly1305 직접 사용)
- 각 사용자는 $x_i$ 개인 키 및 공개 키로 $P_i = [x_i]G$
그런 다음 메시지를 다음과 같이 보낼 수 있습니다.
보낸 사람이 임의의 정수를 생성합니다. $r \in [1,n-1]$ 및 설정 $R = [r]G$
허락하다 $P=(x(P),y(P)) = [r]P_i$ 그리고 확인하십시오 $P \neq \mathcal{O}$
허락하다 $S = x(P)$
암호화 AES256 키 파생$$k = \operatorname{HKDF}(S)$$
AES-GCM 또는 ChaCha20Poly1305로 암호화합니다.
$$(c,tag) = \operatorname{AES-GCM-Enc}(k,IV,m)$$
보내다 $(R,c,IV,tag)$
복호화 측면에서
- 계산하다 $P = [x_i]R$ 때문에 $$P = [x_i]R=[x_i r]G =[r x_i] G = [r]P_i $$ 준비된대로
- 허락하다 $S = x(P)$
- 암호화 AES256 키 파생$$k = \operatorname{HKDF}(S)$$
- 해독 $$(m,\perp) = \operatorname{AES-GCM-Dec}(k,IV,c,tag)$$잘못된 태그를 받아들이지 마십시오. $(\perp)$?
WhatsApp은 비슷한 아이디어를 사용합니다 .
참고 : 가능하면 NaCL을 선택합니다.
이 시나리오에서 다른 것보다 더 잘 작동하는 비대칭 암호화 형태가 있습니까?
일반 구형 GPG는 이미이 기능을 지원합니다.
--recipient name 매개 변수를 원하는만큼 추가 할 수 있습니다 . kelalaka가 설명한 방법과 유사하게 작동하지만 이미 GPG에 내장되어 있습니다.
여러 수신자에게 보내려는 메시지가 있습니다.
좋아
수신자의 각 공개 키로 메시지를 개별적으로 암호화 할 수 있습니까?
실제로 공개 키를 사용하여 메시지를 암호화하는 것에 대해 이야기 할 때 이는 단순화이며 혼합 암호화를 사용합니다. 메시지는 그 다음 랜덤 키는 대칭 알고리즘 (AES와 같은)를 사용하여 암호화되고, 키가 엄격 공개 키로 암호화 한 것이다.
그런 다음 암호화 된 메시지를 각 수신자에게 보내시겠습니까?
예. 동일한 임의의 키를 사용하여 모든 수신자에게 암호화하거나 (이렇게하면 모든 사람에게 파일의 단일 복사본을 보낼 수 있음) 또는 완전히 다시 암호화 된 파일을 각각에게 암호화 할 수 있습니다.
공격자가 암호화 된 모든 메시지를 얻고 모든 메시지가 동일한 콘텐츠를 가지고 있지만 다른 키로 암호화되어 있음을 알고 있다면 공격이 더 쉬워 질까요?
아니요. (당연히 적절한 알고리즘을 가정합니다.)
공격자가 메시지 중 하나를 해독하거나 다른 방법으로 일반 텍스트를 얻는 경우 다른 개인 키를 손상시킬 수 있습니까?
그리고 아니. 공개 / 개인 키 암호화의 요점은 정확하게 공개 키에 대한 지식이 개인 일을 손상하지 않습니다. 공격자는 모든 사람들에게 자신의 암호화 된 메시지를 만들 수 있으므로 일반 텍스트가 알고있는 메시지는 무한합니다.
이 시나리오에서 다른 것보다 더 잘 작동하는 비대칭 암호화 형태가 있습니까?
별로. 실제로 하이브리드 암호화를 원하지만 정확한 알고리즘은 좋은 알고리즘이라면 그다지 중요하지 않습니다. 더 짧은 키와 메시지가 필요하기 때문에 Elliptic Cryptography를 사용하는 것이 좋지만 더 큰 것 외에는 RSA도 괜찮습니다.
CMS (Cryptographic Message Syntax)는이를 표준으로 지원합니다. 데이터는 임의의 대칭 키로 암호화되며이 키는 메시지를 보낼 수신자의 각 공개 키에 대해 한 번씩 암호화됩니다.
OpenSSL 유틸리티가이를 구현합니다. 메시지를받을 수 있도록하려는 각받는 사람에 대한 인증서가 필요합니다.
source.bin
세 명의 수신자에게 안전하게 보낼 파일이있는 경우 다음을 수행 할 수 있습니다.
openssl cms -encrypt -in source.bin -out encrypted.cms -recip friend1.cert -recip friend2.cert -recip friend3.cert
당신은 그들을 보냅니다 encrypted.cms
.
그러면 "친구 1"이 다음을 수행 할 수 있습니다.
openssl cms -decrypt -in encrypted.cms -recip friend1.cert -inkey friend1-private.pem -out source.bin
"Friend 2"와 "Friend 3"은 키로 동일한 작업을 수행 할 수 있으며 원본 데이터도 얻을 수 있습니다.
원하는 경우 데이터에 서명하여 자신이 보낸 것으로 인증 할 수도 있습니다.
보다: https://www.openssl.org/docs/man1.1.1/man1/cms.html
인터넷에는 OpenSSL 및 CMS에 대한 많은 예제와 지침이 있습니다 (일부는 Stack Exchange / Overflow에서도 마찬가지입니다! :-)).