공개 키는 서명을 어떻게 확인합니까?


172

공개 / 개인 키가 어떻게 작동하는지 더 잘 파악하려고합니다. 발신자가 문서의 해시를 얻기 위해 개인 키를 사용하여 문서에 디지털 서명을 추가 할 수 있지만 이해하지 못하는 것은 공개 키를 사용하여 해당 서명을 확인하는 방법입니다.

내 이해는 공개 키가 암호화되고 개인 키가 해독된다는 것입니다.


3
좋은 질문. :)
Suraj Jain

나는 이것을 대답으로 추가하고 싶지 않고 그로 인한 화염 위험을 감수하고 싶지만 "어떻게"라는 단어를 실제로 사용한다면 "서명을 어떻게 확인합니까"를 의미한다면 gpg4win을 다운로드하는 것이 하나의 가능성입니다. 설치되면 파일을 마우스 오른쪽 버튼으로 클릭하고 확인할 수 있습니다. Windows 셸에 통합되는 제품군입니다. 이러한 유틸리티 중 하나는 Kleopatra이며, 유효성 검사를 위해 온라인으로 인증서를 검색합니다.
Newclique

답변:


210

데이터 / 메시지 암호화에 대해서는 "공개 키 암호화, 개인 키 해독"에 대한 이해가 정확합니다. 디지털 서명의 경우에는 그 반대입니다. 디지털 서명을 사용하면 본인이 서명 한 문서가 본인에게서 온 것임을 증명하려고합니다. 그러기 위해서는 개인 키만 가지고 있어야합니다.

가장 간단한 설명의 디지털 서명은 서명자의 개인 키로 암호화 된 데이터 (파일, 메시지 등)의 해시 (SHA1, MD5 등)입니다. 그것이 서명자가 가지고 있거나 신뢰할 수있는 것이어야하는 것이기 때문입니다. 누구나 서명자의 공개 키에 액세스 할 수 있어야합니다.

따라서 디지털 서명을 확인하려면 수신자

  1. 동일한 데이터 (파일, 메시지 등)의 해시를 계산합니다.
  2. 발신자의 PUBLIC 키를 사용하여 디지털 서명을 해독하고
  3. 2 개의 해시 값을 비교합니다.

일치하면 서명이 유효한 것으로 간주됩니다. 일치하지 않으면 다른 키를 사용하여 서명했거나 데이터가 의도적으로 또는 실수로 변경되었음을 의미합니다.

희망이 도움이됩니다!


13
내 이해는 키가 대칭이 아니었다는 것, 즉 공개 키로 암호화 된 객체는 개인 키로 해독 할 수 있지만이 관계는 역으로 작동하지 않는다는 것입니다 ... 더 구체적으로, 나는 객체를 생각하지 않았습니다 개인 키로 암호화 된 암호는 공개 키로 해독 할 수 있습니다. 그것이 사실이라면, 이것은 분명히 내 질문에 대답합니다.
jcampos8782

63
키는 서로 반대로 작동합니다. 공개 키로 무언가를 암호화 했습니까? 개인 키로 암호를 해독하십시오. 반대로 개인 키로 무언가를 암호화 한 경우 공개 키로 암호를 해독합니다. 이는 비대칭 암호화의 특성입니다.
Shadowman

20
대칭은 동일한 키가 암호화 / 암호 해독에 사용됨을 의미합니다. Assymetric은 하나의 키가 암호화되고 다른 키가 해독됨을 의미합니다 (그리고 그 반대도 마찬가지 임).
gtrig

8
@Jodimoro, 기술적으로 개인 키로 암호화 된 메시지는 "비밀"이 아닙니다. 개인 키로 암호화 된 경우 공개적으로 사용 가능한 "공개"키를 가진 사람은 누구나 메시지를 해독 할 수 있습니다.
RayLoveless

4
@Jodimoro 해시가 개인 키를 사용하여 서명으로 암호화 된 유일한 이유는 해시가 변경되지 않도록하는 것입니다. "비밀"이 아니어야합니다.
RayLoveless

71

키는 반대로 작동합니다.

공개 키 암호화, 개인 키 해독 (암호화) :

openssl rsautl -encrypt -inkey public.pem -pubin -in message.txt -out message.ssl
openssl rsautl -decrypt -inkey private.pem       -in message.ssl -out message.txt

개인 키 암호화, 공개 키 해독 (서명) :

openssl rsautl -sign -inkey private.pem       -in message.txt -out message.ssl
openssl rsautl       -inkey public.pem -pubin -in message.ssl -out message.txt

다음은이 전체 흐름을 테스트하는 예제 스크립트입니다 openssl.

#!/bin/sh
# Create message to be encrypted
echo "Creating message file"
echo "---------------------"
echo "My secret message" > message.txt
echo "done\n"

# Create asymmetric keypair
echo "Creating asymmetric key pair"
echo "----------------------------"
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -pubout
echo "done\n"

# Encrypt with public & decrypt with private
echo "Public key encrypts and private key decrypts"
echo "--------------------------------------------"
openssl rsautl -encrypt -inkey public.pem -pubin -in message.txt         -out message_enc_pub.ssl
openssl rsautl -decrypt -inkey private.pem       -in message_enc_pub.ssl -out message_pub.txt
xxd message_enc_pub.ssl # Print the binary contents of the encrypted message
cat message_pub.txt # Print the decrypted message
echo "done\n"

# Encrypt with private & decrypt with public
echo "Private key encrypts and public key decrypts"
echo "--------------------------------------------"
openssl rsautl -sign    -inkey private.pem -in message.txt          -out message_enc_priv.ssl
openssl rsautl -inkey public.pem -pubin    -in message_enc_priv.ssl -out message_priv.txt
xxd message_enc_priv.ssl
cat message_priv.txt
echo "done\n"

이 스크립트는 다음을 출력합니다.

Creating message file
---------------------
done

Creating asymmetric key pair
----------------------------
Generating RSA private key, 1024 bit long modulus
...........++++++
....++++++
e is 65537 (0x10001)
writing RSA key
done

Public key encrypts and private key decrypts
--------------------------------------------
00000000: 31c0 f70d 7ed2 088d 9675 801c fb9b 4f95  1...~....u....O.
00000010: c936 8cd0 0cc4 9159 33c4 9625 d752 5b77  .6.....Y3..%.R[w
00000020: 5bfc 988d 19fe d790 b633 191f 50cf 1bf7  [........3..P...
00000030: 34c0 7788 efa2 4967 848f 99e2 a442 91b9  4.w...Ig.....B..
00000040: 5fc7 6c79 40ea d0bc 6cd4 3c9a 488e 9913  _.ly@...l.<.H...
00000050: 387f f7d6 b8e6 5eba 0771 371c c4f0 8c7f  8.....^..q7.....
00000060: 8c87 39a9 0c4c 22ab 13ed c117 c718 92e6  ..9..L".........
00000070: 3d5b 8534 7187 cc2d 2f94 0743 1fcb d890  =[.4q..-/..C....
My secret message
done

Private key encrypts and public key decrypts
--------------------------------------------
00000000: 6955 cdd0 66e4 3696 76e1 a328 ac67 4ca3  iU..f.6.v..(.gL.
00000010: d6bb 5896 b6fe 68f1 55f1 437a 831c fee9  ..X...h.U.Cz....
00000020: 133a a7e9 005b 3fc5 88f7 5210 cdbb 2cba  .:...[?...R...,.
00000030: 29f1 d52d 3131 a88b 78e5 333e 90cf 3531  )..-11..x.3>..51
00000040: 08c3 3df8 b76e 41f2 a84a c7fb 0c5b c3b2  ..=..nA..J...[..
00000050: 9d3b ed4a b6ad 89bc 9ebc 9154 da48 6f2d  .;.J.......T.Ho-
00000060: 5d8e b686 635f b6a4 8774 a621 5558 7172  ]...c_...t.!UXqr
00000070: fbd3 0c35 df0f 6a16 aa84 f5da 5d5e 5336  ...5..j.....]^S6
My secret message
done

2
스크립트를 추가해 주셔서 감사합니다. 명확하게 정리하는 데 도움이되었습니다.
Pat

감사합니다. 제가 ecample을 이해하는 것이 항상 더 쉽습니다
Simon

16

공개 키는 암호화되며 개인 키만 해독 할 수 있으며 그 반대도 마찬가지입니다. 둘 다 다른 해시로 암호화하지만 각 키는 다른 암호화를 해독 할 수 있습니다.

일부 발신자가 보낸 메시지를 확인하는 방법에는 몇 가지가 있습니다. 예를 들면 다음과 같습니다.

발신자는 다음을 보냅니다.

  1. 메시지

  2. 개인 키로 암호화 된 메시지의 해시

수신자:

  1. 메시지를 얻기 위해 공개 키로 서명 (2)을 해독합니다. 아마도 (1)과 같은 메시지 일 것입니다. 그러나 우리는 아직 모릅니다. 이제 확인해야 할 두 가지 메시지가 동일합니다. 이를 위해 공개 키로 암호화하고 두 해시를 비교합니다. 그래서 우리는 ....
  2. 공개 키로 원본 메시지 (1)를 암호화하여 해시를 얻습니다.
  3. 해독 된 메시지 (3)를 암호화하여 두 번째 해시를 얻고 (4)와 비교하여 동일한 지 확인하십시오.

그들이 동일하지 않다면 그것은 메시지가 변조되었거나 다른 키로 서명되었고 우리가 생각한 키가 아니라는 것을 의미합니다 ...

또 다른 예는 송신자가 수신자가 사용하는 것으로 알고있는 공통 해시를 사용하는 것입니다. 예를 들면 다음과 같습니다.

발신자는 다음을 보냅니다.

  1. 메세지
  2. 알려진 메시지 해시를 얻은 다음 개인 키로 해시를 암호화합니다.

수신자:

  1. 해독 (2)하고 해시 값을 얻습니다.
  2. 발신자가 사용한 것과 동일한 해시로 메시지를 해시합니다 (1).
  3. 두 해시를 비교하여 일치하는지 확인

이렇게하면 메시지가 변조되지 않았으며 예상 발신자에게서 온 것입니다.


6

내가 이해 한 방식으로 질문을 다시 바꿔야한다면 다음과 같은 질문을합니다.

공개 키 암호화가 공개 키 개인 키에서 파생 할 수 있지만 공개 키 에서 개인 키 파생 할 수없는 경우 공개 키를 사용하여 발신자가없이 개인 키로 서명 된 메시지를 어떻게 해독 할 수 있을지 궁금 할 수 있습니다 서명 된 메시지 내의 개인 키를 수신자에게 노출 시키는가? (이해 될 때까지 몇 번 다시 읽어보십시오)

다른 답변은 이미 방법을 설명했다 비대칭 암호화 방법을 당신이 할 수있는 :

  1. 공개 키로 암호화, 일치하는 개인 키로 해독 (아래 의사 코드)
var msg = 'secret message';

var encryptedMessage = encrypt(pub_key, msg);

var decryptedMessage = decrypt(priv_key, encryptedMessage);

print(msg == decryptedMessage == 'secret message'); // True
  1. 개인 키로 암호화, 일치하는 공개 키로 암호 해독 (아래 의사 코드)
var msg = 'secret message';

var encryptedMessage = encrypt(priv_key, msg);

var decryptedMessage = decrypt(pub_key, encryptedMessage); // HOW DOES THIS WORK???

print(msg == decryptedMessage == 'secret message'); // True

우리는 예제 # 1과 # 2가 모두 작동한다는 것을 알고 있습니다. 예제 # 1은 직관적으로 이해되는 반면 예제 # 2는 원래 질문을 구걸합니다. 합니다.

타원 곡선 암호화 ( "타원 곡선 곱셈"이라고도 함)는 원래 질문에 대한 답입니다. 타원 곡선 암호화는 다음 조건을 가능하게하는 수학적 관계입니다.

  1. 공개 키 개인 키에서 수학적으로 생성 할 수 있습니다
  2. 개인 키 공개 키에서 수학적으로 생성 할 수 없습니다 (예 : "트랩 도어 기능")
  3. 개인 키 공개 키로 확인할 있습니다

대부분의 경우 조건 # 1과 # 2는 의미가 있지만 # 3은 어떻습니까?

여기에는 두 가지 선택이 있습니다.

  1. 토끼 구멍을 내려 가서 타원 곡선 암호화가 어떻게 작동하는지 배우는 데 시간을 할애 할 수 있습니다 ( 여기에는 훌륭한 출발점이 있습니다 ) ... 또는 ...
  2. 뉴턴의 3 가지 모션 법칙을 그대로 적용 할 필요없이 위의 속성을 수락 할 있습니다.

결론적으로, 공개 / 개인 키 쌍은 타원 곡선 암호화를 사용하여 생성되는데, 이것은 본질적으로 수학적 으로 양방향으로 연결 되어 있지만 수학적 으로 양방향으로 도출 되지 않은 공개 및 개인 키를 생성합니다 . 이를 통해 다른 사람의 공개 키를 사용하여 개인 키를 노출시키지 않고 특정 메시지에 서명했는지 확인할 수 있습니다.


당신의 3 가지 조건이 모든 것을 설명합니다. 저는이 용어 '타원 곡선'ans를 읽었습니다. 나는 wtf와 같았습니다
Simon

5

더 직관적으로 드러나는 것을 찾는 사람에게는 보충 설명을 제공 할 것이라고 생각했습니다.

이러한 혼동의 큰 부분은 '공개 키'와 '개인 키'의 이름을 지정함으로써 발생합니다. 이러한 것들이 실제로 어떻게 작동하는지는 '키'가 이해되는 방식과 직접적으로 상충되기 때문입니다.

예를 들어 암호화하십시오. 다음과 같이 작동한다고 생각할 수 있습니다.

  • 비밀 메시지를 읽을 수있는 당사자는 각각 키를 숨 깁니다 (예 : 개인 키).
  • 비밀 메시지를 보내려는 당사자는 모두 잠금 해제 잠금 (공개 잠금)을 얻을 수 있습니다.
  • 그런 다음 비밀 메시지를 보내는 것은 잠금 해제 잠금으로 잠그는 것만 큼 쉽지만 나중에 잠금 해제는 숨겨진 키 중 하나를 사용하여 수행 할 수 있습니다.

이를 통해 당사자간에 비밀 메시지를 보낼 수 있지만 여기서 직관적 인 관점에서 '공개 잠금'은 '공개 키'보다 더 적합한 이름입니다.

그러나 디지털 서명을 보내면 역할이 다소 역전됩니다.

  • 메시지에 서명하려는 당사자는 잠금 해제 된 잠금 (예 : 개인 잠금)에 액세스 할 수있는 유일한 사람입니다.
  • 서명을 확인하려는 당사자는 모두 키 (예 : 공개 키)를 얻을 수 있습니다.
  • 그런 다음 서명자가하는 일은 두 개의 동일한 메시지를 작성하는 것입니다. 하나는 누구나 읽을 수 있고 다른 하나는 그 메시지를 개인 잠금으로 잠급니다.
  • 그런 다음 수신자가 메시지를 받으면 메시지를 읽은 다음 공개 키를 사용하여 잠긴 메시지를 잠금 해제하고 두 메시지를 비교할 수 있습니다. 메시지가 동일하면 다음을 알고 있습니다.

    1. 여행 중에 잠금 해제 된 메시지가 변경되지 않았으며,

    2. 메시지는 공개 키와 일치하는 잠금을 가진 사람이 보낸 것이어야합니다.

  • 마지막으로,이 전체 시스템은 서명자의 서명을 확인하려는 사람이 서명자의 자물쇠에 일치하는 키를 가져갈 수있는 권위있는 장소가있는 경우에만 작동합니다. 그렇지 않으면 누구나 "이봐, 여기에 개인 잠금의 열쇠가 있습니다"라고 말하고, 척하는 메시지를 보내지 만 개인 잠금으로 잠그십시오. 위의 모든 단계를 수행하고 메시지가 실제로 당신이 생각한 사람으로부터, 그러나 당신은 공개 키의 진정한 소유자에 대해 오도 되었기 때문에 당신은 바보입니다.

서명자의 공개 키를 검색 할 신뢰할 수있는 출처가있는 한 공개 키의 정당한 소유자가 누구인지 알고 서명을 확인할 수 있습니다.


4
'키'를 '잠금 해제 잠금'으로 변경하면 혼란이 추가됩니다.
Lorne의 후작

@ EJP 키를 '잠금 해제'로 변경하지 않습니다. '잠금'으로 변경되었습니다. '잠금 ​​해제'는 항목의 사용을 표현할 목적으로 만 사용됩니다. 그에 반해서, 그것은 당신의 의견이며, 암호화 커뮤니티에서 장기간 경험이 있다면, 기존 용어가 기술을 이해하기 위해 성장한 방식이기 때문에 극도로 편향 될 수 있습니다. 방금 시작한 사람들이 유추가 유용한 지 여부를 결정하도록 허용하지 않는 이유는 무엇입니까?
신발

1
자물쇠와 열쇠가있는 유추는이 문제에 대한 첫 번째 이해를 제공하는 데 매우 좋습니다. 잠금 및 키를 시각화하면 rsa (또는 다른 유형의) 키로 조립 된 다른 정수를 교환 할 수 있습니다.
Andreas Lundgren

저는 개인적으로이 통찰력이 최고라고 생각합니다. 지금까지 읽었습니다. 그리고 개인 / 공공에게 열쇠 대신 자물쇠를 추가하는 것이 정기적 인 신규 이민자들에게 어떻게 전체 시스템을 직관적으로 설명 할 수 있는지 확실히보십시오. 지금은 전혀 그렇지 않습니다. 우리는 노련한 개발자이며 (지금까지 암호에 직접 손을 대지 않고) 공개 / 개인의 목적에 대해 한동안 논쟁했습니다. 개인은 암호화하는 데 사용되고 공개는 암호화하는 데 사용된다고 말하고있었습니다 : D
jayarjo

0

귀하의 질문에-나는 RSA 구현을보고있었습니다. 개인 키를 사용하여 공개 키를 사용하여 서명을 확인하는 방법에 대해 더 명확 해졌습니다. 의심의 여지없이 개인 키는 노출되지 않습니다. 방법은 다음과 같습니다.

트릭은 함수 내에서 개인 키를 숨기는 것입니다. 이 경우(p-1)*(q-1).

p를 개인 키로, e를 공개 키로 간주하십시오. 'p'는 다른 함수 내에 캡슐화되어 숨겨져 있습니다.

E.g., `d = (p-1)(q-1); d * e = 1` (d is the inverse of e - public key)

전송 된 데이터 = [암호화 (해시), 메시지] = [m ^ d, 메시지]; 여기서 m은 'Data sent'= y라고 가정합니다. 무결성을 확인하기 위해 y ^ e가 m을 얻습니다. 이후m ^(d*e) = m ^1 = m .

도움이 되었기를 바랍니다! :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.