[digital-signature] 공개 키는 서명을 어떻게 확인합니까?

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

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



답변

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

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

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

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

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

희망이 도움이됩니다!


답변

키는 반대로 작동합니다.

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

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


답변

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

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

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

  1. 메시지

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

수신자:

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

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

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

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

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

수신자:

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

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


답변

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

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

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

  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 가지 모션 법칙을 그대로 적용 할 필요없이 위의 속성을 수락 할 있습니다.

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


답변

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

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

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

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

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

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

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

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

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

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

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


답변

귀하의 질문에-나는 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 .

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


답변