Hướng dẫn ecdsa secp256k1 python - trăn ecdsa secp256k1
x = 0x887387E452B8EACC4ACFDE10D9AAF7F6D9A0F975AABB10D006E4DA568744D06C,=0x887387E452B8EACC4ACFDE10D9AAF7F6D9A0F975AABB10D006E4DA568744D06C, Show y = 0x61DE6D95231CD89026E286DF3B6AE4A894A3378E393E93A0F45B666329A0AE34,=0x61DE6D95231CD89026E286DF3B6AE4A894A3378E393E93A0F45B666329A0AE34, # Trường hợp kiểm tra 1: Xác minh tính xác thực Z = 0xEC208BAA0FC1C19F708A9CA96FDEF3AC3F230BB4A7BA4AEDE4942AD003C0F60=0xEC208BAA0FC1C19F708A9CA96FDEFF3AC3F230BB4A7BA4AEDE4942AD003C0F60 r = 0xAC8D1C87E51D0D441BE8B3DD5B05C8795B48875DFFE00B7FFCFAC23010D3A395=0xAC8D1C87E51D0D441BE8B3DD5B05C8795B48875DFFE00B7FFCFAC23010D3A395 S = 0x68342ceff8935EdDD102DD876FFD6BA72D6A427A3EDB13D26EB0781CB423C4=0x68342CEFF8935EDEDD102DD876FFD6BA72D6A427A3EDB13D26EB0781CB423C4 khẳng định chữ ký (R, S) .verify (Z, Pub) Signature(r, s).verify(z, pub) # Trường hợp kiểm tra 2: Xác minh tính xác thực cho chữ ký khác nhau w/ cùng một p Z = 0x7C076FF316692A3D7EB3C3BB0F8B1488CF72E1AFCD929E29307032997A838A3D=0x7C076FF316692A3D7EB3C3BB0F8B1488CF72E1AFCD929E29307032997A838A3D r = 0xeff69ef2b1bd93a66ed5219add4fb51e11a840f404876325a1e8ffe0529a2c=0xEFF69EF2B1BD93A66ED5219ADD4FB51E11A840F404876325A1E8FFE0529A2C S = 0xC7207FEE197D27C618AEA621406F6BF5EF6FCA38681D82B2F06FDDDBDCE6FEAB6= 0xC7207FEE197D27C618AEA621406F6BF5EF6FCA38681D82B2F06FDDBDCE6FEAB6 khẳng định chữ ký (R, S) .verify (Z, Pub) Signature(r, s).verify(z, pub) # Trường hợp kiểm tra 2: Xác minh tính xác thực cho chữ ký khác nhau w/ cùng một p Z = 0x7C076FF316692A3D7EB3C3BB0F8B1488CF72E1AFCD929E29307032997A838A3D= PrivateKey(randint(0, N)) # generate a private key r = 0xeff69ef2b1bd93a66ed5219add4fb51e11a840f404876325a1e8ffe0529a2c= e.secret * G # public point corresponding to e S = 0xC7207FEE197D27C618AEA621406F6BF5EF6FCA38681D82B2F06FDDDBDCE6FEAB6= randint(0, 2** 256)# generate a random message for testing # Trường hợp kiểm tra 3: ký và xác minh: Signature = e.sign(z) e = privateKey (randint (0, n))# tạo khóa riêng signature.verify(z, pub) 2 Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.Learn more. Nếu tôi tạo khóa công khai trực tiếp từ việc ký khóa với 9Nó hoạt động tốt và xác minh nó, nhưng nếu tôi cố gắng tạo khóa công khai theo cách thủ công với 0 vì một số lý do, nó không xác minh nó và trả về sai.Sao chép Dán mã sau và Chạy Bạn sẽ quan sát sự khác biệt kỳ lạ
Những gì tôi mong đợi là đầu ra thực sự từ cả hai bài kiểm tra. Khi được hỏi ngày 6 tháng 5 năm 2019 lúc 23:30May 6, 2019 at 23:30May 6, 2019 at 23:30 lastpeony4lastpeony4lastpeony4lastpeony4 5137 Huy hiệu bạc22 Huy hiệu Đồng7 silver badges22 bronze badges7 silver badges22 bronze badges Bạn đã thiếu 1 trong 2, mặc định là 3.Thử
Kết quả:
Đã trả lời ngày 6 tháng 5 năm 2019 lúc 23:41May 6, 2019 at 23:41May 6, 2019 at 23:41 XarvalusxarvalusXarvalusXarvalus 2.5571 Huy hiệu vàng19 Huy hiệu bạc29 Huy hiệu đồng1 gold badge19 silver badges29 bronze badges1 gold badge19 silver badges29 bronze badges Pure-Python ECDSA và ECDH
Đây là một triển khai dễ sử dụng của ECC (mật mã đường cong hình elip) với sự hỗ trợ cho ECDSA (Thuật toán chữ ký kỹ thuật số đường cong hình elip), EDDSA (thuật toán chữ ký kỹ thuật số Edwards-Curve) và ECDH (đường cong hình elip khác nhau) Python, được phát hành theo giấy phép MIT. Với thư viện này, bạn có thể nhanh chóng tạo các cặp khóa (Key Key và Xác minh khóa), ký tin nhắn và xác minh chữ ký. Bạn cũng có thể đồng ý về khóa bí mật chung dựa trên các khóa công khai được trao đổi. Các phím và chữ ký rất ngắn, giúp chúng dễ dàng xử lý và kết hợp vào các giao thức khác. Lưu ý: Thư viện này không nên được sử dụng trong cài đặt sản xuất, xem bảo mật để biết thêm chi tiết. Đặc trưngThư viện này cung cấp tạo ra, việc ký kết, xác minh và chia sẻ nguồn gốc bí mật cho năm đường cong "Suite B" GF (P) (P) phổ biến của NIST, với độ dài chính là 192, 224, 256, 384 và 521 bit. "Tên ngắn" cho các đường cong này, như được biết đến bởi Công cụ OpenSSL ( 4), là: 5, 6, 7, 8 và 9. Nó bao gồm đường cong 256 bit 40 được sử dụng bởi Bitcoin. Ngoài ra còn có sự hỗ trợ cho các biến thể thường xuyên (không twist) của các đường cong Brainpool từ 160 đến 512 bit. "Tên ngắn" của các đường cong đó là: 41, 42, 43, 44, 45, 46, 47. Một vài trong số các đường cong nhỏ từ tiêu chuẩn SEC cũng được bao gồm (chủ yếu là thử nghiệm tăng tốc của thư viện), đó là: 48, 49, 40 và 41. Tạo chính, Siging và Xác minh cũng được hỗ trợ cho các đường cong ED25519 và ED448. Không có đường cong nào khác được bao gồm, nhưng không quá khó để thêm hỗ trợ cho nhiều đường cong hơn các trường chính.Phụ thuộcThư viện này chỉ sử dụng Python và gói 'sáu'. Nó tương thích với Python 2.6, 2.7 và 3.3+. Nó cũng hỗ trợ thực hiện trên các triển khai thay thế như Pypy và Pypy3. Nếu 42 hoặc 43 được cài đặt, chúng sẽ được sử dụng để số học nhanh hơn. Một trong số chúng có thể được cài đặt sau khi thư viện này được cài đặt, 44 sẽ phát hiện sự hiện diện của chúng khi khởi động và sử dụng chúng tự động. Bạn nên thích 42 trên Python3 để có hiệu suất tối ưu.Để chạy các thử nghiệm tương thích OpenSSL, công cụ 'openSSL' phải có trong 46 của bạn. Bản phát hành này đã được thử nghiệm thành công so với OpenSSL 0.9.8o, 1.0.0a, 1.0.2f, 1.1.1D và 3.0.1 (trong số những người khác).Cài đặtThư viện này có sẵn trên PYPI, nên cài đặt nó bằng cách sử dụng 47:
Trong trường hợp có hiệu suất cao hơn và sử dụng mã gốc không phải là vấn đề, có thể chỉ định cài đặt cùng với 42: 4hoặc (tùy chọn chậm hơn, kế thừa): 4Tốc độ, vận tốcBảng sau đây cho thấy thư viện này mất bao lâu để tạo các cặp khóa ( 49), để ký dữ liệu ( 70), để xác minh các chữ ký đó ( 71), để lấy bí mật chia sẻ ( 72) và để xác minh chữ ký không có khóa- Tiền định cụ thể ( 73). Tất cả những giá trị đó là trong giây. Để thuận tiện, nghịch đảo của các giá trị đó cũng được cung cấp: có thể tạo bao nhiêu phím mỗi giây ( 74), có thể thực hiện bao nhiêu chữ ký mỗi giây ( 75), có bao nhiêu chữ ký có thể được xác minh mỗi giây ( 76) Bí mật được chia sẻ có thể được lấy từ mỗi giây ( 77) và có bao nhiêu chữ ký không có tính toán cụ thể quan trọng có thể được xác minh mỗi giây ( 78). Kích thước của chữ ký thô (nói chung là nhỏ nhất cách một chữ ký có thể được mã hóa) cũng được cung cấp trong cột 79. Sử dụng 70 để tạo bảng này trên máy tính của riêng bạn. Trên Intel Core i7 4790K @ 4.0GHz Tôi đang nhận được hiệu suất sau: 7Để kiểm tra hiệu suất với 42 được tải, hãy sử dụng 72. Trên cùng một máy, tôi nhận được hiệu suất sau với 42: 7(Ngoài ra còn có phiên bản 43, thực hiện nó bằng 75)Để so sánh, một triển khai tối ưu hóa cao (bao gồm cả lắp ráp đặc trưng cho đường cong cho một số đường cong), như trong OpenSSL 1.1.1D, cung cấp các số hiệu suất sau trên cùng một máy. Chạy 76 và 77 để tái tạo nó: 7Chìa khóa và chữ ký có thể được tuần tự hóa theo những cách khác nhau (xem cách sử dụng, bên dưới). Đối với khóa NIST192P, ba biểu diễn cơ bản yêu cầu các chuỗi có độ dài sau (tính bằng byte): 8Lịch sửNăm 2006, Peter Pearson đã công bố triển khai ECDSA thuần túy của mình trong một thông điệp tới Sci.crypt, có sẵn từ trang web tải xuống của mình. Vào năm 2010, Brian Warner đã viết một trình bao bọc xung quanh mã này, để làm cho việc sử dụng dễ dàng và an toàn hơn một chút. Vào năm 2020, Hubert Kario đã bao gồm việc triển khai mật mã đường cong elip sử dụng tọa độ Jacobian trong nội bộ, cải thiện hiệu suất khoảng 20 lần. Bạn đang nhìn vào readme cho trình bao bọc này. Kiểm traĐể chạy bộ thử nghiệm đầy đủ, hãy làm điều này: 0Trên Intel Core i7 4790K @ 4.0GHz, các thử nghiệm mất khoảng 18 giây để thực hiện. Bộ thử nghiệm sử dụng 78 vì vậy có một số biến đổi vốn có trong thời gian thực hiện bộ thử nghiệm.Một phần của 79 và 70 kiểm tra khả năng tương thích với OpenSSL, bằng cách chạy công cụ CLI "openSSL", hãy đảm bảo rằng nó có trong 46 của bạn nếu bạn muốn kiểm tra khả năng tương thích với nó (nếu OpenSSL bị thiếu, hoặc không hỗ trợ tất cả Các đường cong được hỗ trợ trong các bản phát hành ngược dòng, bạn sẽ thấy các bài kiểm tra bị bỏ qua trong lần chạy 72 trên).Bảo vệThư viện này không được thiết kế với bảo mật trong tâm trí. Nếu bạn đang xử lý dữ liệu cần được bảo vệ, chúng tôi khuyên bạn nên sử dụng trình bao bọc chất lượng xung quanh OpenSSL. PYCA/Cryptography là một ví dụ về một trình bao bọc như vậy. Trường hợp sử dụng chính của thư viện này là một thư viện di động để kiểm tra khả năng tương tác và là một công cụ giảng dạy. Thư viện này không bảo vệ chống lại các cuộc tấn công kênh phụ. Không cho phép kẻ tấn công đo thời gian bạn mất bao lâu để tạo một cặp khóa hoặc ký một tin nhắn. Không cho phép những kẻ tấn công chạy mã trên cùng một máy vật lý khi việc tạo hoặc ký cặp khóa đang diễn ra (điều này bao gồm các máy ảo). Không cho phép kẻ tấn công đo lường mức độ năng lượng mà máy tính của bạn sử dụng trong khi tạo cặp khóa hoặc ký tin nhắn. Không cho phép kẻ tấn công đo nhiễu RF đến từ máy tính của bạn trong khi tạo một cặp khóa hoặc ký tin nhắn. LƯU Ý: Chỉ cần tải khóa riêng sẽ gây ra việc tạo cặp khóa. Các hoạt động hoặc vectơ tấn công khác cũng có thể dễ bị tấn công. Đối với một kẻ tấn công tinh vi quan sát chỉ một hoạt động với khóa riêng sẽ đủ để xây dựng lại hoàn toàn khóa riêng.For a sophisticated attacker observing just one operation with a private key will be sufficient to completely reconstruct the private key.For a sophisticated attacker observing just one operation with a private key will be sufficient to completely reconstruct the private key. Cũng xin lưu ý rằng bất kỳ thư viện mật mã Pure-Python nào cũng dễ bị tổn thương trước các cuộc tấn công kênh phụ. Điều này là do Python không cung cấp các nguyên thủy an toàn kênh bên (ngoại trừ 73), làm cho lập trình bảo mật kênh bên không thể.Thư viện này phụ thuộc vào một nguồn số ngẫu nhiên mạnh mẽ. Không sử dụng nó trên một hệ thống trong đó 74 không cung cấp các số ngẫu nhiên an toàn về mặt mật mã.Cách sử dụngBạn bắt đầu bằng cách tạo 75. Bạn có thể sử dụng điều này để ký dữ liệu, bằng cách truyền dữ liệu dưới dạng chuỗi byte và lấy lại chữ ký (cũng là chuỗi byte). Bạn cũng có thể yêu cầu 75 cung cấp cho bạn 77 tương ứng. 77 có thể được sử dụng để xác minh chữ ký, bằng cách truyền cả chuỗi dữ liệu và chuỗi byte chữ ký: nó trả về true hoặc tăng 79. 1Mỗi ________ 85/________ 87 được liên kết với một đường cong cụ thể, như NIST192P (cái mặc định). Các đường cong dài hơn an toàn hơn, nhưng mất nhiều thời gian hơn để sử dụng, và dẫn đến các phím và chữ ký dài hơn. 2 75 có thể được tuần tự hóa thành một số định dạng khác nhau: ngắn nhất là gọi 83, sau đó tạo lại nó với 84. Hình thức ngắn này không ghi lại đường cong, vì vậy bạn phải chắc chắn chuyển sang 85 cùng một đường cong bạn đã sử dụng cho khóa ban đầu. Hình thức ngắn của khóa ký dựa trên NIST192P chỉ dài 24 byte. Nếu mã hóa điểm không hợp lệ hoặc nó không nằm trên đường cong được chỉ định, 85 sẽ tăng 87. 03Lưu ý: Mặc dù các phương thức được gọi là 88, loại chúng trả về thực sự là 89, phần "chuỗi" còn sót lại từ Python 2. 00 và 01 sẽ tuần tự hóa khóa ký vào cùng các định dạng mà OpenSSL sử dụng. Tệp PEM trông giống như định dạng được mã hóa 02 được mã hóa ____102 và định dạng DER là một dạng nhị phân ngắn hơn của cùng một dữ liệu. 03 sẽ hoàn tác tuần tự hóa này. Các định dạng này bao gồm tên đường cong, vì vậy bạn không cần phải chuyển trong một mã định danh đường cong cho máy khử trùng. Trong trường hợp tệp bị dị tật 04 và 05 sẽ tăng 06 hoặc ____107. 4Tương tự như vậy, 77 có thể được tuần tự hóa theo cùng một cách: 09, 10 và 11. Đối số 12 tương tự là cần thiết cho 13. 5Có một vài cách khác nhau để tính toán một chữ ký. Về cơ bản, ECDSA lấy một số đại diện cho dữ liệu được ký và trả về một cặp số đại diện cho chữ ký. Đối số 14 đối với 15 và 16 được sử dụng để biến một chuỗi tùy ý thành một tiêu hóa có độ dài cố định, sau đó được biến thành một số mà ECDSA có thể ký, và cả dấu và xác minh phải sử dụng cùng một cách tiếp cận. Giá trị mặc định là 17, nhưng nếu bạn sử dụng NIST256P hoặc đường cong dài hơn, bạn có thể sử dụng 18 thay thế.Ngoài ra còn có nhiều cách để đại diện cho một chữ ký. Các phương thức 15 và 16 mặc định trình bày nó như một chuỗi ngắn, cho tính đơn giản và chi phí tối thiểu. Để sử dụng một sơ đồ khác, hãy sử dụng các đối số 21 và 22. Có các chức năng trợ giúp trong mô -đun 23 có thể hữu ích ở đây.Cũng có thể tạo ra một 75 từ một "hạt giống", có tính xác định. Điều này có thể được sử dụng trong các giao thức nơi bạn muốn lấy các khóa ký hợp nhất từ một số bí mật khác, ví dụ khi bạn muốn có ba khóa riêng biệt và chỉ muốn lưu trữ một bí mật chính. Bạn nên bắt đầu với một hạt giống không đáng kể được phân phối đồng đều với khoảng 25 byte entropy, sau đó sử dụng một trong các chức năng của người trợ giúp trong 23 để chuyển đổi nó thành một số nguyên trong phạm vi chính xác, và cuối cùng chuyển nó thành 27, như thế này: như thế này: 6Trong trường hợp ứng dụng sẽ xác minh rất nhiều chữ ký được tạo bằng một khóa duy nhất, có thể tính toán trước một số giá trị bên trong để xác minh chữ ký nhanh hơn đáng kể. Điểm hòa vốn xảy ra ở khoảng 100 chữ ký được xác minh. Để thực hiện điều chỉnh, bạn có thể gọi phương thức 28 theo phiên bản 77: 7Khi 28 được gọi, tất cả các xác minh chữ ký với khóa này sẽ nhanh hơn để thực hiện.Khả năng tương thích OpenSSLĐể tạo ra các chữ ký có thể được xác minh bằng các công cụ OpenSSL hoặc để xác minh các chữ ký được tạo ra bởi các công cụ đó, sử dụng: 8LƯU Ý: Nếu khả năng tương thích với OpenSSL 1.0.0 hoặc sớm hơn là cần thiết, có thể sử dụng 31 và 32 từ 23 để viết và đọc chữ ký tương ứng.Các khóa cũng có thể được viết theo định dạng mà OpenSSL có thể xử lý: 9Sự hỗn loạnTạo khóa ký với 34 yêu cầu một số hình thức entropy (trái ngược với ____ 135/________ 136/________ 137/________ 138, có tính xác định và không yêu cầu nguồn entropy). Nguồn mặc định là 74, nhưng bạn có thể vượt qua bất kỳ chức năng nào khác hoạt động như 40 dưới dạng đối số 41 để làm điều gì đó khác biệt. Điều này có thể hữu ích trong các bài kiểm tra đơn vị, nơi bạn muốn đạt được kết quả lặp lại. Tiện ích 42 rất tiện dụng ở đây: nó lấy hạt giống và tạo ra một luồng giả ngẫu nhiên mạnh mẽ từ nó: 0Tương tự như vậy, việc tạo chữ ký ECDSA yêu cầu một số ngẫu nhiên và mỗi chữ ký phải sử dụng một số khác nhau (sử dụng cùng một số hai lần sẽ ngay lập tức tiết lộ khóa ký riêng). Phương pháp 15 có một đối số 41 hoạt động giống như 45.Chữ ký xác địnhNếu bạn gọi 46 thay vì 47, mã sẽ tạo ra một chữ ký xác định thay vì ngẫu nhiên. Điều này sử dụng thuật toán từ RFC6979 để tạo ra giá trị 48 duy nhất, xuất phát từ khóa riêng và thông báo được ký. Mỗi lần bạn ký cùng một tin nhắn với cùng một khóa, bạn sẽ nhận được cùng một chữ ký (sử dụng cùng một 48).Điều này có thể trở thành mặc định trong một phiên bản trong tương lai, vì nó không dễ bị lỗi của nguồn entropy. Ví dụTạo một cặp khóa NIST192P và ngay lập tức lưu cả hai vào đĩa: 1Tải khóa ký từ đĩa, sử dụng nó để ký tin nhắn (sử dụng SHA-1) và viết chữ ký vào đĩa: 2Tải khóa xác minh, tin nhắn và chữ ký từ đĩa và xác minh chữ ký (giả sử băm SHA-1): 3Tạo một cặp khóa NIST521P: 4Tạo ba khóa ký độc lập từ hạt giống chính: 5Tải một khóa xác minh từ đĩa và in nó bằng mã hóa HEX ở định dạng không nén và nén (được xác định trong các tiêu chuẩn x9.62 và Sec1): 6Tải một khóa xác minh từ chuỗi hex từ định dạng nén, đầu ra không nén: 7Trao đổi khóa ECDH với bên từ xa: 8 |