Ví dụ Ecdsa Python

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]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f0
0 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]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f0
1

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]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f0
0] 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ố 8

Nế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]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f0
0

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]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f0
1

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]: 8b0073855c90db6e19f8e3bd135a4a319daedb094475a2968ac9f0efbe8f4fbdc695ef03f74f0d30d822a867abd692f0
2

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

ECDSA trong Python là gì?

Đây là một triển khai dễ sử dụng của mật mã ECDSA [ Thuật toán chữ ký số Elliptic Curve ], được triển khai hoàn toàn bằng Python, được phát hành dưới tên . Với thư viện này, bạn có thể nhanh chóng tạo cặp khóa [khóa ký và khóa xác minh], ký thư và xác minh chữ ký.

ECDSA được sử dụng như thế nào?

ECDSA được sử dụng trên nhiều hệ thống bảo mật, được sử dụng phổ biến trong các ứng dụng nhắn tin bảo mật và là nền tảng của bảo mật Bitcoin [với .

Bitcoin có còn sử dụng ECDSA không?

Hiện tại, Bitcoin sử dụng Thuật toán chữ ký số đường cong Elliptic [ECDSA] . Với bản nâng cấp Taproot, Bitcoin sẽ tích hợp Schnorr, một loại sơ đồ chữ ký thứ hai với một số ưu điểm.

ECDSA có nhanh hơn RSA không?

Sử dụng ECDSA cho chữ ký số mang lại một số lợi thế quan trọng, chẳng hạn như. mức độ bảo mật cao; 40% faster than RSA];

Chủ Đề