나는 최근에 GPG와 씨름하고 있었는데, 이제 막 (드디어!) 작동하게 되었습니다. 이제 gpg.exe에 암호화된 blob을 입력할 수 있으며, 이는 물론 유효한 암호화 blob이라고 가정하여 일반 텍스트 버전을 출력합니다. 즉, 해당 암호 해독 키가 내 개인 키/"암호 식별" 목록에 있음을 의미합니다.
내 질문은: GPG는 이러한 키 중 어떤 키를 시도할지 정확히 어떻게 결정합니까? 해당 정보가 어떻게든 암호화 blob에 구워졌나요? 아니면 성공적으로 해독될 때까지 맹목적으로 하나씩 시도합니까?
오랫동안 궁금했던 이 질문에 대한 답을 드디어 얻게 된다면 좋을 것 같습니다. 그런 식으로 모든 것을 통과한다는 것은 너무 "조잡하고" "낮은 기술"처럼 느껴집니다. 특히 예를 들어, 새로 들어오는 메시지가 그 중 하나와 일치하는지 확인하기 위해 수천 명의 사람들의 개인 키를 거쳐야 하는 일종의 서비스를 호스팅하기 시작한다면 더욱 그렇습니다. 단지 "확장"되지 않는 것 같습니다.
GPG가 어떤 키를 시도할지 힌트를 주는 암호화된 텍스트에 대한 뭔가가 있기를 바랍니다! 그런가요?
답변1
결과 OpenPGP 패킷에는 실제로 다음이 포함됩니다.암호화 하위 키 ID그것을 해독할 수 있을 것으로 예상되는 수신자의 이름입니다. 예를 들어:
$ date | gpg --encrypt | pgpdump
Old: Public-Key Encrypted Session Key Packet(tag 1)(524 bytes)
New version(3)
Key ID - 0xCE7B0F19551034EF
Pub alg - RSA Encrypt or Sign(pub 1)
...
New: Symmetrically Encrypted and MDC Packet(tag 18)(83 bytes)
...
수신자가 여러 명인 경우 각 수신자마다 하나씩 여러 개의 "세션 키" 패킷이 있으며, 모두 동일한 대칭 키의 서로 다르게 암호화된 버전을 보유합니다.
(차기 버전인 v5에서는 대신 전체 하위 키 지문을 가질 계획이라고 생각합니다. 하지만 이 상황에서는 잘린 키 ID만으로도 충분합니다.)
즉, GnuPG에는 --throw-keyids
모든 세션 키 패킷이 동일한 키 ID 0x0000000000000000을 갖도록 하는 옵션이 있습니다. 그런 일이 발생하면 수신자는 실제로 자신이 가지고 있는 모든 비밀 암호화 가능 하위 키를 사용하여 무차별 대입으로 패킷의 암호를 해독하려고 시도합니다.
동일한 방식으로 개별 수신자를 숨길 수 있는 옵션 도 있으므로 --hidden-recipient
결과 메시지에 null 키 ID와 null이 아닌 키 ID를 혼합할 수 있습니다. 이는 Bcc:
이메일 클라이언트에서 카본 카피를 구현하는 데 유용할 수 있습니다.
공개 게시판/드롭 박스/하위 레딧 등을 통해 메시지를 교환해야 하고 의도한 수신자를 공개하고 싶지 않을 때 두 옵션 모두 사용할 수 있습니다.
$ date | gpg -e --recipient Alice --hidden-recipient Robert | gpg --list-packets
gpg: anonymous recipient; trying secret key CE7B0F19551034EF ...
gpg: anonymous recipient; trying secret key DCDBB36BD91759A3 ...
gpg: okay, we are the anonymous recipient.
gpg: encrypted with 4096-bit RSA key, ID CE7B0F19551034EF, created 2009-10-31
gpg: encrypted with RSA key, ID 0000000000000000
# off=0 ctb=85 tag=1 hlen=3 plen=524
:pubkey enc packet: version 3, algo 1, keyid 0000000000000000
data: [4095 bits]
# off=527 ctb=85 tag=1 hlen=3 plen=524
:pubkey enc packet: version 3, algo 1, keyid CE7B0F19551034EF
data: [4092 bits]
# off=1054 ctb=d2 tag=18 hlen=2 plen=80 new-ctb
:encrypted data packet:
...