공개 / 개인 키가 어떻게 작동하는지 더 잘 파악하려고합니다. 발신자가 문서의 해시를 얻기 위해 개인 키를 사용하여 문서에 디지털 서명을 추가 할 수 있지만 이해하지 못하는 것은 공개 키를 사용하여 해당 서명을 확인하는 방법입니다.
내 이해는 공개 키가 암호화되고 개인 키가 해독된다는 것입니다.
공개 / 개인 키가 어떻게 작동하는지 더 잘 파악하려고합니다. 발신자가 문서의 해시를 얻기 위해 개인 키를 사용하여 문서에 디지털 서명을 추가 할 수 있지만 이해하지 못하는 것은 공개 키를 사용하여 해당 서명을 확인하는 방법입니다.
내 이해는 공개 키가 암호화되고 개인 키가 해독된다는 것입니다.
답변:
데이터 / 메시지 암호화에 대해서는 "공개 키 암호화, 개인 키 해독"에 대한 이해가 정확합니다. 디지털 서명의 경우에는 그 반대입니다. 디지털 서명을 사용하면 본인이 서명 한 문서가 본인에게서 온 것임을 증명하려고합니다. 그러기 위해서는 개인 키만 가지고 있어야합니다.
가장 간단한 설명의 디지털 서명은 서명자의 개인 키로 암호화 된 데이터 (파일, 메시지 등)의 해시 (SHA1, MD5 등)입니다. 그것이 서명자가 가지고 있거나 신뢰할 수있는 것이어야하는 것이기 때문입니다. 누구나 서명자의 공개 키에 액세스 할 수 있어야합니다.
따라서 디지털 서명을 확인하려면 수신자
일치하면 서명이 유효한 것으로 간주됩니다. 일치하지 않으면 다른 키를 사용하여 서명했거나 데이터가 의도적으로 또는 실수로 변경되었음을 의미합니다.
희망이 도움이됩니다!
키는 반대로 작동합니다.
공개 키 암호화, 개인 키 해독 (암호화) :
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
공개 키는 암호화되며 개인 키만 해독 할 수 있으며 그 반대도 마찬가지입니다. 둘 다 다른 해시로 암호화하지만 각 키는 다른 암호화를 해독 할 수 있습니다.
일부 발신자가 보낸 메시지를 확인하는 방법에는 몇 가지가 있습니다. 예를 들면 다음과 같습니다.
발신자는 다음을 보냅니다.
메시지
개인 키로 암호화 된 메시지의 해시
수신자:
그들이 동일하지 않다면 그것은 메시지가 변조되었거나 다른 키로 서명되었고 우리가 생각한 키가 아니라는 것을 의미합니다 ...
또 다른 예는 송신자가 수신자가 사용하는 것으로 알고있는 공통 해시를 사용하는 것입니다. 예를 들면 다음과 같습니다.
발신자는 다음을 보냅니다.
수신자:
이렇게하면 메시지가 변조되지 않았으며 예상 발신자에게서 온 것입니다.
내가 이해 한 방식으로 질문을 다시 바꿔야한다면 다음과 같은 질문을합니다.
공개 키 암호화가 공개 키 를 개인 키에서 파생 할 수 있지만 공개 키 에서 개인 키 를 파생 할 수없는 경우 공개 키를 사용하여 발신자가없이 개인 키로 서명 된 메시지를 어떻게 해독 할 수 있을지 궁금 할 수 있습니다 서명 된 메시지 내의 개인 키를 수신자에게 노출 시키는가? (이해 될 때까지 몇 번 다시 읽어보십시오)
다른 답변은 이미 방법을 설명했다 비대칭 암호화 방법을 당신이 할 수있는 중 :
var msg = 'secret message';
var encryptedMessage = encrypt(pub_key, msg);
var decryptedMessage = decrypt(priv_key, encryptedMessage);
print(msg == decryptedMessage == 'secret message'); // True
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은 어떻습니까?
여기에는 두 가지 선택이 있습니다.
결론적으로, 공개 / 개인 키 쌍은 타원 곡선 암호화를 사용하여 생성되는데, 이것은 본질적으로 수학적 으로 양방향으로 연결 되어 있지만 수학적 으로 양방향으로 도출 되지 않은 공개 및 개인 키를 생성합니다 . 이를 통해 다른 사람의 공개 키를 사용하여 개인 키를 노출시키지 않고 특정 메시지에 서명했는지 확인할 수 있습니다.
더 직관적으로 드러나는 것을 찾는 사람에게는 보충 설명을 제공 할 것이라고 생각했습니다.
이러한 혼동의 큰 부분은 '공개 키'와 '개인 키'의 이름을 지정함으로써 발생합니다. 이러한 것들이 실제로 어떻게 작동하는지는 '키'가 이해되는 방식과 직접적으로 상충되기 때문입니다.
예를 들어 암호화하십시오. 다음과 같이 작동한다고 생각할 수 있습니다.
이를 통해 당사자간에 비밀 메시지를 보낼 수 있지만 여기서 직관적 인 관점에서 '공개 잠금'은 '공개 키'보다 더 적합한 이름입니다.
그러나 디지털 서명을 보내면 역할이 다소 역전됩니다.
그런 다음 수신자가 메시지를 받으면 메시지를 읽은 다음 공개 키를 사용하여 잠긴 메시지를 잠금 해제하고 두 메시지를 비교할 수 있습니다. 메시지가 동일하면 다음을 알고 있습니다.
여행 중에 잠금 해제 된 메시지가 변경되지 않았으며,
메시지는 공개 키와 일치하는 잠금을 가진 사람이 보낸 것이어야합니다.
마지막으로,이 전체 시스템은 서명자의 서명을 확인하려는 사람이 서명자의 자물쇠에 일치하는 키를 가져갈 수있는 권위있는 장소가있는 경우에만 작동합니다. 그렇지 않으면 누구나 "이봐, 여기에 개인 잠금의 열쇠가 있습니다"라고 말하고, 척하는 메시지를 보내지 만 개인 잠금으로 잠그십시오. 위의 모든 단계를 수행하고 메시지가 실제로 당신이 생각한 사람으로부터, 그러나 당신은 공개 키의 진정한 소유자에 대해 오도 되었기 때문에 당신은 바보입니다.
서명자의 공개 키를 검색 할 신뢰할 수있는 출처가있는 한 공개 키의 정당한 소유자가 누구인지 알고 서명을 확인할 수 있습니다.
귀하의 질문에-나는 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
.
도움이 되었기를 바랍니다! :)