Hôm nay, ngày 14 tháng 12 năm 2022, Ukraine vẫn đang dũng cảm đấu tranh cho các giá trị dân chủ, nhân quyền và hòa bình trên toàn thế giới. Người Nga tàn nhẫn giết tất cả thường dân ở Ukraine kể cả trẻ em và phá hủy các thành phố của họ. Chúng tôi đang đoàn kết chống lại cuộc xâm lược và bạo lực của Putin, ủng hộ người dân ở Ukraine. Bạn có thể giúp đỡ bằng cách quyên góp cho quân đội Ukraine
Trước hết, hãy tưởng tượng Bob tạo cặp khóa riêng và khóa chung
from ecdsa import SigningKey, VerifyingKey, NIST192p sk = SigningKey.generate[curve=NIST192p] verifying_key_hex_string = sk.verifying_key.to_string[].hex[] print['Signing Key [private]:', sk.to_string[].hex[]] print['Verification Key [public]:', verifying_key_hex_string]
đầu ra ví dụ
Signing Key [private]: 78a4dbe1972dc979b97962d0fcb2f18cfad0b09c69079031 Verification Key [public]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f0
Như chúng ta có thể thấy khóa riêng là chuỗi hex có độ dài 48 ký tự, do đó, nó là 24 Byte [192 bit]. Độ dài khóa công khai ios 48 byte
Đây là cách chúng ta có thể sử dụng các phím này
- Bob sẽ sử dụng khóa riêng của mình để ký một số dữ liệu. Anh ấy sẽ không bao giờ chia sẻ khóa riêng này với bất kỳ ai. Anh ấy sẽ chỉ lưu trữ nó trên thiết bị của mình. Anh ta có thể sử dụng nó một lần để ký một phần dữ liệu hoặc sử dụng nó nhiều lần nếu cần để ký các phần dữ liệu mới và mới
- Bob sẽ chia sẻ khóa công khai của mình với cả thế giới và nói "Này, nhìn này, đây là khóa của tôi, bất kỳ ai cũng có thể sử dụng nó để xác minh rằng một số tin nhắn được tạo bởi tôi"
Để ký một số dữ liệu Bob có thể chạy
sk = SigningKey.from_string[bytearray.fromhex[signing_key_hex_string]] text = "msg1" signature = sk.sign[text.encode['utf-8']] signature_hex_string = signature.hex[] print['Signature:', signature_hex_string]
đầu ra ví dụ
Signature: 4c0db71ccfda191999f50049b8c450bd45c9ecd4b643e11c296c6a40a8e051e7e45955611608578ab8f20ad8f94ad748
Độ dài cũng là 48 byte [giống như khóa chung]
Vì vậy, anh ấy đã chia sẻ
Signing Key [private]: 78a4dbe1972dc979b97962d0fcb2f18cfad0b09c69079031 Verification Key [public]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f00 của mình với mọi người và bây giờ anh ấy có thể chia sẻ dữ liệu chính "msg1" và
Signing Key [private]: 78a4dbe1972dc979b97962d0fcb2f18cfad0b09c69079031 Verification Key [public]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f01
Alice hoặc bất kỳ ai chắc chắn rằng khóa công khai [
Signing Key [private]: 78a4dbe1972dc979b97962d0fcb2f18cfad0b09c69079031 Verification Key [public]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f00] thuộc về Bob có thể xác minh rằng chính xác Bob đã đưa ra thông điệp1
verifyingkey = VerifyingKey.from_string[bytearray.fromhex[verifying_key_hex_string]] signature = bytearray.fromhex[signature_hex_string] print['Verify transmited data', verifyingkey.verify[signature, "msg1".encode['utf-8']]]
đầu ra ví dụ
________số 8Nếu dữ liệu sẽ được thay đổi, thì cuộc gọi này
print['Verify modified data', verifyingkey.verify[signature, "msg2".encode['utf-8']]]
Sẽ đưa ra một ngoại lệ
Signing Key [private]: 78a4dbe1972dc979b97962d0fcb2f18cfad0b09c69079031 Verification Key [public]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f00
kết luận
- Khi Bob đưa ra một số tin nhắn, anh ấy cung cấp chữ ký cho các tin nhắn này và đề nghị bất kỳ ai xác minh rằng dữ liệu được tạo chính xác bởi anh ấy chứ không phải bởi người khác
- người khác e. g. Lora, người có quyền truy cập vào khóa chung của Bob [vì khóa công khai] có thể nói "đó là khóa chung của tôi", vì vậy khi Bob đưa ra một thông báo và ký vào đó, Lora có thể nói "chính tôi, vì đó là khóa của tôi". Nhưng nếu không có xung đột lợi ích, Lora sẽ không có lý do gì để lạm dụng nó
Sử dụng hàm băm
Nếu thông báo khá dài, thì thay vì tự ký dữ liệu, Bob có thể chỉ cần ký HASH của dữ liệu, ví dụ:. g. sha-256, hàm băm ngắn hơn [cố định 32 byte cho bất kỳ lượng văn bản nào] nên việc ký sẽ nhanh hơn, khi độ tin cậy của ý tưởng là như nhau
Để băm dữ liệu trong python, bạn có thể sử dụng
Signing Key [private]: 78a4dbe1972dc979b97962d0fcb2f18cfad0b09c69079031 Verification Key [public]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f01
Sau đó, để xác minh dữ liệu, hãy thực hiện băm giống nhau
Signing Key [private]: 78a4dbe1972dc979b97962d0fcb2f18cfad0b09c69079031 Verification Key [public]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f02
Thủ thuật là bạn không thể thay đổi dữ liệu mà không thay đổi hàm băm, vì vậy nó đảm bảo tương tự nếu chúng tôi ký vào văn bản gốc