여러 수신자에게 공개 키 암호화 사용

Nov 26 2020

여러 수신자에게 보내려는 메시지가 있습니다.

각 수신자의 공개 키로 메시지를 개별적으로 암호화 한 다음 암호화 된 메시지를 각 수신자에게 보낼 수 있습니까?

공격자가 암호화 된 모든 메시지를 얻고 모든 메시지가 동일한 콘텐츠를 가지고 있지만 다른 키로 암호화되어 있음을 알고 있다면 공격이 더 쉬워 질까요?

공격자가 메시지 중 하나를 해독하거나 다른 방법으로 일반 텍스트를 얻는 경우 다른 개인 키를 손상시킬 수 있습니까?

이 시나리오에서 다른 것보다 더 잘 작동하는 비대칭 암호화 형태가 있습니까?

답변

10 kelalaka Nov 26 2020 at 14:30

분석 할 방법의 세부 사항을 지정하지 않았지만 일반적인 방법은 순수하게 공개 키 암호화를 사용한 암호화가 아니라 대칭 키가 공개 키 암호화와 함께 전송되고 키가 다음과 같은 하이브리드 암호화 시스템을 기반으로합니다. 대칭 키 암호화에 사용됩니다.

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$

그런 다음 메시지를 다음과 같이 보낼 수 있습니다.

  1. 보낸 사람이 임의의 정수를 생성합니다. $r \in [1,n-1]$ 및 설정 $R = [r]G$

  2. 허락하다 $P=(x(P),y(P)) = [r]P_i$ 그리고 확인하십시오 $P \neq \mathcal{O}$

  3. 허락하다 $S = x(P)$

  4. 암호화 AES256 키 파생$$k = \operatorname{HKDF}(S)$$

  5. AES-GCM 또는 ChaCha20Poly1305로 암호화합니다.

    $$(c,tag) = \operatorname{AES-GCM-Enc}(k,IV,m)$$

  6. 보내다 $(R,c,IV,tag)$

복호화 측면에서

  1. 계산하다 $P = [x_i]R$ 때문에 $$P = [x_i]R=[x_i r]G =[r x_i] G = [r]P_i $$ 준비된대로
  2. 허락하다 $S = x(P)$
  3. 암호화 AES256 키 파생$$k = \operatorname{HKDF}(S)$$
  4. 해독 $$(m,\perp) = \operatorname{AES-GCM-Dec}(k,IV,c,tag)$$잘못된 태그를 받아들이지 마십시오. $(\perp)$?

WhatsApp

WhatsApp은 비슷한 아이디어를 사용합니다 .


참고 : 가능하면 NaCL을 선택합니다.

3 user10216038 Nov 26 2020 at 16:30

이 시나리오에서 다른 것보다 더 잘 작동하는 비대칭 암호화 형태가 있습니까?

일반 구형 GPG는 이미이 기능을 지원합니다.

--recipient name 매개 변수를 원하는만큼 추가 할 수 있습니다 . kelalaka가 설명한 방법과 유사하게 작동하지만 이미 GPG에 내장되어 있습니다.

2 Ángel Nov 27 2020 at 01:54

여러 수신자에게 보내려는 메시지가 있습니다.

좋아

수신자의 각 공개 키로 메시지를 개별적으로 암호화 할 수 있습니까?

실제로 공개 키를 사용하여 메시지를 암호화하는 것에 대해 이야기 할 때 이는 단순화이며 혼합 암호화를 사용합니다. 메시지는 그 다음 랜덤 키는 대칭 알고리즘 (AES와 같은)를 사용하여 암호화되고, 키가 엄격 공개 키로 암호화 한 것이다.

그런 다음 암호화 된 메시지를 각 수신자에게 보내시겠습니까?

예. 동일한 임의의 키를 사용하여 모든 수신자에게 암호화하거나 (이렇게하면 모든 사람에게 파일의 단일 복사본을 보낼 수 있음) 또는 완전히 다시 암호화 된 파일을 각각에게 암호화 할 수 있습니다.

공격자가 암호화 된 모든 메시지를 얻고 모든 메시지가 동일한 콘텐츠를 가지고 있지만 다른 키로 암호화되어 있음을 알고 있다면 공격이 더 쉬워 질까요?

아니요. (당연히 적절한 알고리즘을 가정합니다.)

공격자가 메시지 중 하나를 해독하거나 다른 방법으로 일반 텍스트를 얻는 경우 다른 개인 키를 손상시킬 수 있습니까?

그리고 아니. 공개 / 개인 키 암호화의 요점은 정확하게 공개 키에 대한 지식이 개인 일을 손상하지 않습니다. 공격자는 모든 사람들에게 자신의 암호화 된 메시지를 만들 수 있으므로 일반 텍스트가 알고있는 메시지는 무한합니다.

이 시나리오에서 다른 것보다 더 잘 작동하는 비대칭 암호화 형태가 있습니까?

별로. 실제로 하이브리드 암호화를 원하지만 정확한 알고리즘은 좋은 알고리즘이라면 그다지 중요하지 않습니다. 더 짧은 키와 메시지가 필요하기 때문에 Elliptic Cryptography를 사용하는 것이 좋지만 더 큰 것 외에는 RSA도 괜찮습니다.

2 RogerLucas Nov 27 2020 at 22:18

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에서도 마찬가지입니다! :-)).