클라이언트 A는 일반적으로 공개 키를 사용하여 파일을 암호화한 후 해당 개인 키를 가지고 있는 클라이언트 B에게 파일을 전송하여 파일의 암호를 해독합니다.
우리 팀은 고객 A의 책임을 맡을 것이며 공개 키(이메일을 통해 보호되지 않은 파일 전송 PUB_KEY.asc
)를 제공받았습니다. 이를 성공적으로 가져왔고 내 키링에서 확인할 수 있습니다.
gpg --list-keys
pub 1024R/21FG3F01 2008-11-05
uid PUB_KEY
sub 1024R/3287SBN9 2008-11-05
다음 명령을 사용하여 파일을 암호화했습니다.클라이언트 A와 정확히 동일한 명령클라이언트 B에게 보내지만 암호 해독에 실패합니다.
gpg --output file.txt.gpg -e -r PUB_KEY file.txt
클라이언트 B는 다음과 같은 암호 해독 오류를 수신합니다.1080: 암호 해독을 위한 개인 키를 찾을 수 없습니다.(비록 개인 키가 있지만).
키 서명이 가능하다고 해서 서명 공개 키를 사용해 보았 gpg --sign-key PUB_KEY
으나 다음과 같은 오류가 발생했습니다.
pub 1024R/21FG3F01 created: 2008-11-05 expires: never usage: SC
trust: unknown validity: unknown
sub 1024R/3287SBN9 created: 2008-11-05 expires: never usage: E
[ unknown] (1). PUB_KEY
gpg: no default secret key: No secret key
공개 키에 서명하려면 비밀 키가 필요한 이유는 무엇입니까? 올바른 공개 키를 사용할 때 클라이언트 B가 파일을 해독할 수 없게 만드는 원인은 무엇입니까?
답변1
첫 번째 질문("공개 키에 서명하려면 왜 비밀 키가 필요한가요?")은 간단합니다. 이것이 공개 키 암호화가 작동하는 방식입니다. 무언가(키, 문서 등)에 서명하려면 개인 키가 필요하며 공개 키를 사용하여 확인할 수 있습니다. 암호화는 공개 키를 사용하며 개인 키를 사용하여 해독할 수 있습니다.
두 번째 질문은 더 복잡합니다. 키에 서명하는지 여부는 중요하지 않습니다. 서명하면 해당 키가 PGP/GPG에서 설정한 신뢰 네트워크의 중요한 부분이라는 경고만 방지할 수 있습니다. 그러나 신뢰 네트워크 외부에서 키의 정확성을 확인한 경우(예: 수신자로부터 직접 키를 수신하여) 신뢰 네트워크를 무시할 수 있습니다. 따라서 서명이 필요하지 않습니다.
-r
전체 키 지문이 아닌 매개변수를 사용하고 있으며 실수로 잘못된 수신자를 암호화하고 있는 것 같습니다 . 전체 지문을 사용해야 합니다(예를 들어 067E3C456BAE240ACEE88F6FEF0F382A1A7B6500
짧은 지문 EF0F382A1A7B6500
이나 매우 짧은 지문은 안 됨 1A7B6500
).
내가 생각할 수 있는 유일한 다른 점은 당신이 해독 측에서 지원하지 않는 일부 알고리즘을 (아마도 당신에게 알려지지 않은) 사용하고 있다는 것입니다. 예를 들어, 수신자보다 훨씬 최신 버전의 gnupg를 사용하는 경우입니다. 아니면 수신자가 다른 프로그램을 사용하고 있는 경우입니다. 수신자의 키가 프로그램이 지원하는 것을 지정하는 것은 정상이지만 해당 특정 키는 지원되지 않거나 잘못되었을 수 있습니다. GPG에는 재정의 옵션이 있습니다(맨페이지의 "상호 운용성" 참조 ). 시도해 볼 가치가 있습니다 --pgp8
.--pgp7
--pgp6
답변2
gnupg는 암호화된 메시지의 헤더에 파일이 포함되어 있으므로 실패하기 전에 파일을 해독하는 데 필요한 키를 보고합니다. 예를 들어:
‰ gpg -d test
gpg: encrypted with 4096-bit RSA key, ID 0xF38153E276D54749, created 2011-09-23
"Greg Kroah-Hartman (Linux kernel stable release signing key) <[email protected]>"
gpg: decryption failed: No secret key
gpg --list-secret-keys
메시지에 제공된 키가 클라이언트 B의 출력에 있는 키 중 하나와 일치합니까? 잘못된 공개 키를 받았거나 클라이언트 B가 관련 비밀 {sub,} 키를 삭제한 것 같습니다.