Điểm:1

Làm cách nào để sử dụng các vectơ kiểm tra ECDSA?

lá cờ gs

Tôi muốn xác minh hệ thống của mình bằng cách chạy các vectơ kiểm tra ECDSA NIST, nhưng tôi không nhận được đầu ra như mong đợi. Tôi có thể tính toán chữ ký, nhưng nó không đúng hoặc ít nhất là các thành phần "r" và "s" chứa các giá trị khác với các vectơ nist. Tôi đang làm gì sai?

vectơ kiểm tra: NIST: FIPS 186-4 ECDSA - 186-3ecdsasiggencomponenttestvectors.zip

#include <mbedtls/ecdsa.h>
#include <mbedtls/ecp.h>
#include <mbedtls/bignum.h>
#include <mbedtls/entropy.h>
#include <mbedtls/ctr_drbg.h>

// Tất cả kiểm tra lỗi đã bị xóa

// Cái đầu tiên của [P-256,SHA-256]-vector
uint8_t ecc_d_p256[] = "\x51\x9b\x42...";
uint8_t ecc_hash_p256[] = "\x44\xac\xf6...":

const char *pers = "kiểm tra";
mbedtls_mpi r, s, d;
mbedtls_ecp_group grp;
mbedtls_ctr_drbg_context ctr_drbg;
mbedtls_entropy_context mbedtls_entropy;

//Trong đó
mbedtls_mpi_init(&r);
mbedtls_mpi_init(&s);
mbedtls_mpi_init(&d);
mbedtls_ecp_group_init(&grp);
mbedtls_ctr_drbg_init(&ctr_drbg);
mbedtls_entropy_init(&mbedtls_entropy);

// Giá trị thiết lập
mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &mbedtls_entropy, pers, 4);
mbedtls_mpi_read_binary(&d, ecc_d_p256, (sizeof(ecc_d_p256)-1));
mbedtls_ecp_group_load(&grp, MBEDTLS_ECP_DP_SECP256R1); 

//Dấu hiệu
mbedtls_ecdsa_sign_det_ext(&grp, &r, &s, &d,
                           ecc_hash_p256, sizeof(ecc_hash_p256)-1,
                           MBEDTLS_MD_SHA256,
                           mbedtls_ctr_drbg_random,
                           &ot_mbedtls_ctr_drbg);

//Đầu ra
// "r" và "s" chứa đầu ra 32 byte, nhưng không phải đầu ra "chính xác"
Maarten Bodewes avatar
lá cờ in
Nếu bạn đang thử nghiệm triển khai nội bộ thì chắc chắn bạn sẽ có thể thử nghiệm nó bằng cách cung cấp các giá trị ngẫu nhiên làm đầu vào. Nếu bạn không thể làm điều đó từ API thì tôi muốn nói rằng thật không may, bạn không thể thực sự kiểm tra nó trực tiếp với các vectơ kiểm tra.
kelalaka avatar
lá cờ in
Gilles đã đúng, bạn đang sử dụng ECDSA xác định, có các vectơ kiểm tra trong [RFC 6979 appendix-A.2](https://datatracker.ietf.org/doc/html/rfc6979#appendix-A.2)
Kris Kwiatkowski avatar
lá cờ fr
Các vectơ thử nghiệm từ FIPS CAVP không hỗ trợ chế độ ECDSA xác định. ECDSA xác định hiện được hỗ trợ bởi các vectơ thử nghiệm do ACVP của NIST cung cấp. Tiêu chuẩn hóa chế độ xác định đang được soạn thảo trong FIPS 186-5 (https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5-draft.pdf, xem 6.3.2). Bạn sẽ cần kết nối triển khai của mình với máy chủ ACVP để kiểm tra. Mô tả chi tiết về cấu trúc vectơ thử nghiệm có thể được tìm thấy ở đây: https://pages.nist.gov/ACVP/draft-fussell-acvp-ecdsa.html
Kris Kwiatkowski avatar
lá cờ fr
Một cách để lấy các vectơ đó từ ACVP là sử dụng acvpproxy https://github.com/smuellerDD/acvpproxy
Điểm:2
lá cờ cn

Có hai biến thể của ECDSA: ngẫu nhiên hoặc xác định. Việc tính toán một chữ ký liên quan đến một số $k$ điều này không bao giờ được lặp lại đối với các thông báo riêng biệt có cùng khóa. Có hai cách để thực hiện điều đó: tạo $k$ ngẫu nhiên, hoặc tạo ra $k$ một cách xác định từ khóa và thông điệp. (Tôi đang bỏ qua chi tiết ở đây, chỉ tập trung vào những gì liên quan đến câu hỏi này.) Hai biến thể tạo ra các chữ ký tương thích: không thể biết biến thể nào được sử dụng để tạo ra một chữ ký nhất định. (Tất nhiên bạn có thể biết bằng cách yêu cầu một người triển khai ký hai lần vào cùng một thông điệp và so sánh các kết quả đầu ra.)

Định nghĩa ban đầu của ECDSA chỉ xem xét biến thể ngẫu nhiên và đây là biến thể duy nhất mà NIST cho phép, kể từ FIPS 186-4 (xem §6.3 và §6.4). RFC 6979 là một đặc điểm kỹ thuật cho biến thể xác định.

Các vectơ kiểm tra NIST đã được tạo bằng ECDSA ngẫu nhiên. Hệ quả của việc sử dụng thuật toán ngẫu nhiên là bạn không thể có các bài kiểm tra đã biết trước câu trả lời cho nó. Mỗi khi bạn chạy phép tính chữ ký, bạn sẽ nhận được một kết quả khác. Tất cả những gì bạn có thể làm để kiểm tra là kiểm tra xem đầu ra của phép tính chữ ký có phải là một chữ ký hợp lệ hay không, chứ không phải đó là một chuỗi byte cụ thể.

mbedtls_ecdsa_sign_det_ext thực hiện ECDSA xác định. Bạn có thể sử dụng các bài kiểm tra câu trả lời đã biết cho ECDSA xác định. Nhưng NIST không cung cấp các vectơ thử nghiệm cho nó vì NIST không chuẩn hóa ECDSA xác định.

Nếu bạn kéo dài điều này ra một chút, bạn có thể nói rằng có thể có các bài kiểm tra câu trả lời đã biết nếu bạn chỉ định đầy đủ cách thuật toán sử dụng đầu ra của trình tạo ngẫu nhiên. Nhưng sau đó, về mặt lý thuyết, bạn hiện đang thử nghiệm một thuật toán xác định đang sử dụng một số đầu vào mà trong thế giới thực được cho là đến từ một trình tạo ngẫu nhiên. Và như một vấn đề thực tế, trong quá trình triển khai thực tế, không phải lúc nào cũng có thể hoán đổi trình tạo ngẫu nhiên để thử nghiệm. Và trong bất kỳ trường hợp nào, FIPS 184-4 cho phép một số thay đổi trong cách tiêu thụ đầu ra của trình tạo ngẫu nhiên khi tạo $k$ cho một chữ ký ECDSA.

kelalaka avatar
lá cờ in
Tốt bắt về det. Tôi muốn nói thêm rằng NIST cung cấp các giá trị $k$ để một người có thể thay thế $k$ ngẫu nhiên bằng $k$ đã cho để họ có thể thấy thuật toán của mình đang hoạt động, sau đó thay thế mã này bằng $k$ được tạo ngẫu nhiên. Ngoài ra, trong RFC 6979, Thomas Pornin cũng cung cấp các vectơ thử nghiệm.
KaljaTolkki avatar
lá cờ gs
Cảm ơn bạn vì một câu trả lời tuyệt vời @Gilles 'SO- đừng trở nên xấu xa nữa'! Ngoài ra, tôi muốn nói lời cảm ơn đến những người khác trong chủ đề này để được giúp đỡ! Tôi không triển khai thuật toán cũng như không biết liệu mình có thể cung cấp giá trị "k" mà không có bất kỳ thay đổi triển khai nào hay không. Đối với tôi, các vectơ kiểm tra RFC 6979 là đủ. Tôi đã có thể xác minh đường ống của mình!

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.