61

Cố gắng để có được một vật lộn tốt hơn về cách thức các khóa công khai/riêng tư hoạt động. Tôi hiểu rằng người gửi có thể thêm chữ ký số vào tài liệu bằng khóa riêng của mình để lấy băm tài liệu, nhưng điều tôi không hiểu là cách khóa công khai có thể được sử dụng để xác minh chữ ký đó. Hiểu biết của tôi là mã hóa khóa công khai, giải mã khóa cá nhân ... có ai giúp tôi hiểu không?Khóa công khai xác minh chữ ký như thế nào?

+0

Câu hỏi hay. :) –

Trả lời

100

Hiểu biết của bạn về "mã hóa khóa công khai, giải mã khóa cá nhân" là chính xác ... cho dữ liệu/tin nhắn ENCRYPTION. Đối với chữ ký số, nó là ngược lại. Với chữ ký số, bạn đang cố gắng chứng minh rằng tài liệu do bạn ký gửi đến từ bạn. Để làm điều đó, bạn cần phải sử dụng một cái gì đó mà chỉ có bạn có: khóa riêng của bạn.

Chữ ký điện tử trong mô tả đơn giản nhất là băm (SHA1, MD5, vv) của dữ liệu (tệp, thư, v.v.) được mã hóa sau đó bằng khóa riêng của người ký. Vì đó là thứ chỉ có người ký tên (hoặc nên có) đó là nơi mà sự tin tưởng xuất phát từ đó. MỌI NGƯỜI có (hoặc nên có) truy cập vào khóa công khai của người ký.

Vì vậy, để xác nhận chữ ký số, người nhận

  1. Tính một hash của cùng một dữ liệu (tập tin, tin nhắn, vv),
  2. Giải mã chữ ký kỹ thuật số sử dụng khóa công khai của người gửi, và
  3. So sánh 2 giá trị băm.

Nếu chúng khớp nhau, chữ ký được coi là hợp lệ. Nếu chúng không khớp, nó có nghĩa là một khóa khác đã được sử dụng để ký tên, hoặc dữ liệu đã bị thay đổi (hoặc cố ý hoặc vô ý).

Hy vọng điều đó sẽ hữu ích!

+6

Hiểu biết của tôi là các khóa không đối xứng ... tức là, các đối tượng được mã hóa bằng khóa công khai có thể được giải mã bằng khóa riêng, nhưng mối quan hệ này không hoạt động ngược ... cụ thể hơn, tôi đã làm không nghĩ rằng các đối tượng được mã hóa bằng khóa riêng có thể được giải mã bằng khóa công khai. Nếu đó thực sự là trường hợp, hơn điều này chắc chắn trả lời câu hỏi của tôi. – jcampos8782

+28

Các phím hoạt động ngược chiều với nhau. Mã hóa một cái gì đó với khóa công khai của bạn? Giải mã nó bằng khóa riêng của bạn. Ngược lại, nếu bạn mã hóa một cái gì đó với khóa riêng của bạn, bạn giải mã nó với công chúng của bạn. Đó là bản chất của mật mã không đối xứng. – Shadowman

+11

Đối xứng chỉ có nghĩa là cùng một khóa được sử dụng để mã hóa/giải mã.Assymetric có nghĩa là một khóa mã hóa và một giải mã khóa khác (và ngược lại cũng đúng). – gtrig

27

Như đã nêu trong atn's answer, các phím hoạt động ngược.

encrypts Công chìa khóa, giải mã khóa bí mật (mã hóa):

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 

Private encrypts chìa khóa, giải mã khóa công khai (ký):

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

Dưới đây là một tập lệnh mẫu để kiểm tra toàn bộ luồng này với 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" 

Kịch bản này kết quả đầu ra như sau:

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 [email protected]<.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

Tuyệt vời! Cảm ơn rất nhiều!!! Tìm kiếm những dòng đơn giản sau 2 ngày! Đánh giá cao điều đó! –

+0

Cảm ơn bạn đã thêm tập lệnh - chắc chắn đã giúp mọi thứ rõ ràng. – Pat

-1

nghĩ rằng tôi muốn cung cấp một lời giải thích bổ sung cho bất cứ ai tìm kiếm một cái gì đó bằng trực giác hơn để lộ.

Một phần lớn sự nhầm lẫn này phát sinh từ việc đặt tên là 'khóa công khai' và 'khóa riêng' như vậy bởi vì những điều này thực sự hoạt động như thế nào là trực tiếp với tỷ lệ "chìa khoá".

Lấy mã hóa làm ví dụ.Nó có thể được coi là làm việc như vậy:

  • Các bên mà muốn để có thể đọc các thông điệp bí mật từng giữ một chìa khóa ẩn (tức là một private key)
  • Các bên mà muốn có thể để gửi tin nhắn bí mật, tất cả đều có khả năng khóa khóa (tức là khóa công khai)
  • Sau đó gửi tin nhắn bí mật dễ dàng như khóa nó bằng khóa mở khóa, nhưng mở khóa sau đó chỉ có thể thực hiện được với một trong các các phím ẩn.

Điều này cho phép gửi tin nhắn bí mật giữa các bên, nhưng từ quan điểm trực quan ở đây, 'khóa công khai' là tên phù hợp hơn 'khóa công khai'.

Tuy nhiên, để gửi chữ ký số các vai trò được phần nào đảo ngược:

  • Bên muốn ký hợp đồng thông điệp là người duy nhất có quyền truy cập vào các ổ khóa mở khóa (tức là một khóa riêng)
  • Các bên để xác minh chữ ký tất cả đều có khả năng lấy khóa (tức là khóa công khai)
  • Sau đó, người ký sẽ tạo hai thông báo giống hệt nhau: cái mà mọi người có thể đọc và một để đi kèm, nhưng chúng khóa với một trong những khóa riêng của họ.
  • Sau đó, khi người nhận nhận được tin nhắn, họ có thể đọc tin nhắn, và sau đó sử dụng khóa công cộng để mở khóa tin nhắn đã khóa và so sánh hai tin nhắn. Nếu các thông điệp đều giống nhau, sau đó họ biết rằng:

    1. Thông điệp mở khóa không được can thiệp vào trong đi lại và,

    2. Thông điệp phải có được từ người có khóa phù hợp để khóa công khai của họ.

  • Và cuối cùng, toàn bộ hệ thống này chỉ hoạt động nếu bất cứ ai muốn để xác nhận chữ ký của người ký có một nơi có thẩm quyền để đi đến để có được chìa khóa phù hợp để ổ khóa của người ký. Nếu không, bất kỳ ai cũng có thể nói "Này, đây là chìa khóa của khóa riêng tư", gửi cho bạn một thông báo giả vờ là họ nhưng khóa nó bằng khóa riêng của họ, bạn thực hiện tất cả các bước trên và tin rằng thông điệp thực sự phải là từ người bạn nghĩ, nhưng bạn bị lừa bởi vì bạn đã bị lừa dối với chủ sở hữu thực sự của một khóa công khai.

Miễn là có một nguồn đáng tin cậy để truy xuất khóa công khai của người ký, bạn sẽ biết ai là chủ sở hữu hợp pháp của khóa công khai và sẽ có thể xác thực chữ ký của họ.

+0

Thay đổi 'khóa' thành 'khóa mở khóa' chỉ thêm vào sự nhầm lẫn. – EJP

+0

@EJP Tôi không thay đổi khóa thành 'khóa mở khóa'. Nó được đổi thành 'khóa'. 'Khóa đã khóa' chỉ được sử dụng cho mục đích thể hiện mục đích sử dụng của mục. Điều quan trọng, đó là ý kiến ​​của bạn, và nếu bạn có kinh nghiệm lâu dài trong cộng đồng mật mã, nó có khả năng thiên vị vì các điều khoản hiện tại là cách bạn đã phát triển để hiểu công nghệ. Tại sao bạn không để cho những người mới bắt đầu xác định liệu sự tương tự có hữu ích không? – shoe