Làm thế nào để một khóa công khai xác minh một chữ ký?


173

Tôi đang cố gắng để có được một vật lộn tốt hơn về cách hoạt động của khóa công khai / riêng tư. Tôi hiểu rằng người gửi có thể thêm chữ ký điện tử 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à làm thế nào 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, khóa riêng giải mã ... ai đó có thể giúp tôi hiểu không?


3
Câu hỏi hay. :)
Suraj Jain

Tôi không muốn thêm câu này làm câu trả lời và mạo hiểm với ngọn lửa tiếp theo nhưng nếu bạn sử dụng từ "làm thế nào" thực sự có nghĩa là "làm cách nào để xác minh chữ ký" thì một khả năng là tải xuống gpg4win. Sau khi cài đặt, bạn có thể nhấp chuột phải vào một tệp và xác minh nó. Nó là một bộ sản phẩm tích hợp vào vỏ Windows. Một tiện ích như vậy là Kleopatra sẽ tra cứu chứng chỉ trực tuyến để thực hiện xác nhận.
Newclique

Câu trả lời:


210

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

Chữ ký số trong mô tả đơn giản nhất của nó là hàm băm (SHA1, MD5, v.v.) của dữ liệu (tệp, tin nhắn, v.v.) sau đó được mã hóa bằng khóa riêng của người ký. Vì đó là thứ mà chỉ người ký mới có (hoặc nên có) đó là nơi mà niềm tin bắt nguồn. MỌI NGƯỜI có (hoặc nên có) quyền truy cập vào khóa chung của người ký.

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

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

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

Mong rằng sẽ giúp!


13
Tôi hiểu rằng các khóa không đối xứng ... nghĩa là các đối tượng được mã hóa bằng khóa chung 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 lại ... cụ thể hơn, tôi không nghĩ 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 chung. 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

63
Các phím làm việc nghịch đảo 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 thứ gì đó bằng khóa riêng của mình, bạn sẽ giải mã nó với công khai của mình. Đó là bản chất của mật mã bất đối xứng.
Shadowman

20
Đố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 khóa mã hóa khác nhau (và điều ngược lại cũng đúng).
gtrig

8
@Jodimoro, Về mặt kỹ thuật, một tin nhắn KHÔNG phải là "Bí mật" nếu nó được mã hóa bằng khóa riêng. Nếu nó được mã hóa bằng khóa riêng, bất kỳ ai có khóa "công khai" đều có thể giải mã tin nhắn.
RayLovless

4
@Jodimoro Lý do duy nhất băm được mã hóa bằng khóa riêng thành chữ ký là để đảm bảo băm không bị thay đổi ... không đảm bảo đó là "bí mật".
RayLovless

72

Các phím làm việc ngược lại:

Mã hóa khóa công khai, giải mã khóa riêng (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

Mã hóa khóa riêng, mã hóa 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 kịch bản ví dụ để kiểm tra toàn bộ dòng chảy 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 xuất 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  _.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
Cảm ơn vì đã thêm kịch bản - chắc chắn đã giúp làm sáng tỏ mọi thứ.
Pat

Cảm ơn rất nhiều, tôi luôn dễ hiểu hơn với ecample
Simon

16

Khóa công khai mã hóa và chỉ khóa riêng mới có thể giải mã được, và điều ngược lại là đúng. Cả hai đều mã hóa thành các giá trị băm khác nhau nhưng mỗi khóa có thể giải mã mã hóa của nhau.

Có một vài cách khác nhau để xác minh rằng một tin nhắn đến từ một số người gửi dự kiến. Ví dụ:

Người gửi gửi:

  1. Thông điệp

  2. Hàm băm của tin nhắn được mã hóa bằng khóa riêng của họ

Người nhận:

  1. Giải mã chữ ký (2) bằng khóa chung để nhận tin nhắn, được cho là cùng một tin nhắn với (1) nhưng chúng ta chưa biết. Bây giờ chúng tôi có hai tin nhắn mà chúng tôi cần xác minh là giống hệt nhau. Vì vậy, để làm điều này, chúng tôi sẽ mã hóa cả hai bằng khóa chung của chúng tôi và so sánh hai giá trị băm. Vì vậy, chúng tôi sẽ ....
  2. Mã hóa tin nhắn gốc (1) bằng khóa chung để lấy băm
  3. Mã hóa tin nhắn được giải mã (3) để có được hàm băm thứ hai và so sánh với (4) để xác minh rằng chúng giống hệt nhau.

Nếu chúng không giống nhau, điều đó có nghĩa là tin nhắn đã bị giả mạo hoặc nó được ký với một số khóa khác và không phải là tin nhắn chúng tôi nghĩ ...

Một ví dụ khác là người gửi sẽ sử dụng hàm băm phổ biến mà người nhận có thể biết để sử dụng. Ví dụ:

Người gửi gửi:

  1. Một thông điệp
  2. Lấy một hàm băm đã biết của tin nhắn, sau đó mã hóa hàm băm bằng khóa riêng

Người nhận:

  1. Decrypts (2) và nhận giá trị băm
  2. Băm tin nhắn (1) với cùng hàm băm được người gửi sử dụng
  3. So sánh hai giá trị băm để đảm bảo chúng khớp

Điều này một lần nữa đảm bảo thư không bị giả mạo và đó là từ người gửi dự kiến.


6

Nếu tôi phải diễn đạt lại câu hỏi của bạn từ cách tôi hiểu nó, bạn sẽ hỏi như sau:

Nếu mật mã khóa công khai đảm bảo rằng khóa công khai có thể được lấy từ khóa riêng, nhưng khóa riêng có thể được lấy từ khóa chung, thì bạn có thể tự hỏi, làm thế nào khóa công khai có thể giải mã tin nhắn được ký bằng khóa riêng mà không cần người gửi để lộ khóa riêng trong tin nhắn đã ký cho người nhận? (đọc lại một vài lần cho đến khi nó có ý nghĩa)

Các câu trả lời khác đã giải thích cách mã hóa bất đối xứng có nghĩa là bạn có thể :

  1. Mã hóa bằng khóa chung, giải mã bằng khóa riêng phù hợp (mã giả bên dưới)
var msg = 'secret message';

var encryptedMessage = encrypt(pub_key, msg);

var decryptedMessage = decrypt(priv_key, encryptedMessage);

print(msg == decryptedMessage == 'secret message'); // True
  1. Mã hóa bằng khóa riêng, giải mã bằng khóa chung phù hợp (mã giả bên dưới)
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

Chúng tôi biết rằng cả ví dụ # 1 và # 2 đều hoạt động. Ví dụ # 1 có ý nghĩa trực quan, trong khi ví dụ # 2 đặt ra câu hỏi ban đầu .

Hóa ra, mật mã đường cong elliptic (còn được gọi là "nhân đường cong elliptic") là câu trả lời cho câu hỏi ban đầu. Mật mã đường cong elip là mối quan hệ toán học làm cho các điều kiện sau có thể xảy ra:

  1. Khóa công khai có thể được tạo toán học từ khóa riêng
  2. Khóa riêng không thể được tạo một cách toán học từ khóa chung (nghĩa là "hàm bẫy")
  3. Khóa riêng có thể được xác minh bằng khóa chung

Đối với hầu hết, các điều kiện # 1 và # 2 có ý nghĩa, nhưng còn # 3 thì sao?

Bạn có hai lựa chọn ở đây:

  1. Bạn có thể đi xuống một hố thỏ và dành hàng giờ đồng hồ để tìm hiểu cách mã hóa đường cong elip hoạt động ( đây là một điểm khởi đầu tuyệt vời ) ... HOẶC ...
  2. Bạn có thể chấp nhận các thuộc tính ở trên - giống như bạn chấp nhận 3 định luật chuyển động của Newton mà không cần phải tự mình lấy chúng.

Tóm lại, một cặp khóa công khai / riêng được tạo bằng cách sử dụng mật mã đường cong elliptic, về bản chất, tạo ra khóa công khai và khóa riêng được liên kết về mặt toán học theo cả hai hướng, nhưng không xuất phát theo toán học theo cả hai hướng . Đây là những gì giúp bạn có thể sử dụng khóa chung của ai đó để xác minh rằng họ đã ký một tin nhắn cụ thể mà không để lộ khóa riêng của họ cho bạn.


3 điều kiện của bạn giải thích tất cả. Tôi vừa đọc thuật ngữ này 'đường cong elip' và tôi giống như wtf
Simon

5

Nghĩ rằng tôi sẽ cung cấp một lời giải thích bổ sung cho bất cứ ai đang tìm kiếm một cái gì đó trực quan tiết lộ hơn.

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

Lấy mã hóa chẳng hạn. Nó có thể được coi là làm việc như vậy:

  • Các bên muốn có thể đọc các tin nhắn bí mật, mỗi bên sẽ giữ một khóa (ví dụ: khóa riêng)
  • Các bên muốn có thể gửi tin nhắn bí mật đều có khả năng bị khóa mở khóa (tức là khóa công khai)
  • Sau đó, gửi một tin nhắn bí mật cũng dễ như khóa nó bằng một khóa đã được mở khóa, nhưng việc mở khóa nó sau đó chỉ có thể được thực hiện bằng một trong các phím ẩn.

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

Tuy nhiên, để gửi chữ ký điện tử, các vai trò có phần bị đảo ngược:

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

    1. Tin nhắn đã mở khóa không bị giả mạo trong khi đi du lịch và,

    2. Tin nhắn phải được gửi từ người có khóa khớp với khóa chung của họ.

  • Và cuối cùng, toàn bộ hệ thống này chỉ hoạt động nếu bất kỳ ai muốn xác thực chữ ký của người ký có một nơi có thẩm quyền để đến lấy khóa khớp với khóa của người ký. Mặt khác, bất cứ 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 tin nhắn 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 tin nhắn phải thực sự là từ người bạn nghĩ, nhưng bạn bị lừa bởi vì bạn đã đánh lừa chủ sở hữu thực sự của khóa công khai.

Miễn là có một nguồn đáng tin cậy để lấy 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ọ.


4
Thay đổi 'khóa' thành 'khóa mở khóa' chỉ làm tăng thêm sự nhầm lẫn.
Hầu tước Lorne

@EJP Tôi không đổi khóa thành 'khóa đã mở khóa'. Nó được đổi thành 'khóa'. 'Khóa đã mở khóa' chỉ được sử dụng cho mục đích thể hiện việc sử dụng vật phẩm. Đối với vấn đề, đó là ý kiến ​​của bạn và nếu bạn có bất kỳ kinh nghiệm lâu dài nào trong cộng đồng tiền điện tử, có thể rất thiên vị vì các thuật ngữ 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 để những người mới bắt đầu xác định liệu sự tương tự có hữu ích hay không?
giày

1
Tôi nghĩ rằng sự tương tự với ổ khóa và chìa khóa là khá tốt để cung cấp sự hiểu biết đầu tiên về vấn đề này. Khi bạn hình dung các khóa và khóa, chúng có thể được trao đổi các số nguyên khác nhau được lắp ráp thành các khóa rsa (hoặc loại khác).
Andreas Lundgren

Cá nhân tôi nghĩ rằng cái nhìn sâu sắc này là tốt nhất, tôi đã đọc cho đến nay. Và chắc chắn xem cách thêm khóa thay vì khóa cho riêng tư / công cộng làm cho toàn bộ hệ thống tự giải thích bằng trực giác cho những người mới thường xuyên. Trong khi tại thời điểm này nó không phải là tất cả. Chúng tôi là những nhà phát triển dày dạn (chỉ không có liên lạc trực tiếp với tiền điện tử cho đến bây giờ) và chúng tôi đã tranh luận về mục đích công khai / riêng tư trong một thời gian. Tôi đã nói rằng private được sử dụng để mã hóa, trong khi anh ta nói rằng công khai được sử dụng để mã hóa: D
jayarjo

0

Đối với câu hỏi của bạn - tôi đã xem xét việc thực hiện RSA. Và hiểu rõ hơn về cách sử dụng khóa chung để xác minh chữ ký bằng khóa riêng. Không còn nghi ngờ gì nữa, khóa riêng không bị lộ. Đây là cách ...

Thủ thuật ở đây là để ẩn khóa riêng trong một hàm. Trong trường hợp này,(p-1)*(q-1).

Coi p là khóa riêng và e là khóa chung. 'P' được gói gọn trong một chức năng khác để làm cho nó bị ẩn.

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

Dữ liệu được gửi = [được mã hóa (hàm băm), tin nhắn] = [m ^ d, tin nhắn]; Trong đó m là thông báo Giả sử 'Dữ liệu được gửi' = y Để kiểm tra tính toàn vẹn, chúng tôi tìm y ^ e để lấy m. Kể từ đó m ^(d*e) = m ^1 = m.

Hi vọng điêu nay co ich! :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.