Score:1

จะใช้เวกเตอร์ทดสอบ ECDSA ได้อย่างไร

ธง gs

ฉันต้องการยืนยันระบบของฉันด้วยการเรียกใช้เวกเตอร์ทดสอบ ECDSA NIST แต่ฉันไม่ได้รับผลลัพธ์ที่คาดหวัง ฉันสามารถคำนวณลายเซ็นได้ แต่ไม่ถูกต้องหรืออย่างน้อยส่วนประกอบ "r" และ "s" มีค่าที่แตกต่างจากในเวกเตอร์ nist ฉันทำอะไรผิด?

เวกเตอร์ทดสอบ: NIST: FIPS 186-4 ECDSA - 186-3ecdsasiggencomponenttestvectors.zip

#รวม <mbedtls/ecdsa.h>
#รวม <mbedtls/ecp.h>
#รวม <mbedtls/bignum.h>
#รวม <mbedtls/entropy.h>
#รวม <mbedtls/ctr_drbg.h>

// ลบการตรวจสอบข้อผิดพลาดทั้งหมด

//อันแรกของ [P-256,SHA-256]-เวกเตอร์
uint8_t ecc_d_p256[] = "\x51\x9b\x42...";
uint8_t ecc_hash_p256[] = "\x44\xac\xf6...":

ถ่าน const *pers = "ทดสอบ";
mbedtls_mpi r, s, d;
mbedtls_ecp_group grp;
mbedtls_ctr_drbg_context ctr_drbg;
mbedtls_entropy_context mbedtls_entropy;

//ในนั้น
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);

//ตั้งค่า
mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &mbedtls_entropy, pers, 4);
mbedtls_mpi_read_binary(&d, ecc_d_p256, (ขนาดของ(ecc_d_p256)-1));
mbedtls_ecp_group_load(&grp, MBEDTLS_ECP_DP_SECP256R1); 

//เข้าสู่ระบบ
mbedtls_ecdsa_sign_det_ext(&grp, &r, &s, &d,
                           ecc_hash_p256, ขนาดของ (ecc_hash_p256)-1,
                           MBEDTLS_MD_SHA256
                           mbedtls_ctr_drbg_random
                           &ot_mbedtls_ctr_drbg);

//เอาต์พุต
//"r" และ "s" มีเอาต์พุต 32 ไบต์ แต่ไม่ใช่เอาต์พุตที่ "ถูกต้อง"
Maarten Bodewes avatar
in flag
หากคุณกำลังทดสอบการใช้งานภายใน คุณจะสามารถทดสอบได้โดยป้อนค่าแบบสุ่มเป็นอินพุต หากคุณไม่สามารถทำสิ่งนั้นได้จาก API ฉันจะบอกว่าคุณไม่สามารถทดสอบโดยตรงกับเวกเตอร์ทดสอบได้
kelalaka avatar
in flag
Gilles พูดถูก คุณกำลังใช้ ECDSA ที่กำหนดขึ้น มีเวกเตอร์ทดสอบใน [RFC 6979 appendix-A.2](https://datatracker.ietf.org/doc/html/rfc6979#appendix-A.2)
Kris Kwiatkowski avatar
fr flag
เวกเตอร์ทดสอบจาก FIPS CAVP ไม่รองรับโหมด ECDSA เชิงกำหนด ขณะนี้ ECDSA แบบกำหนดค่าได้รับการสนับสนุนโดยเวกเตอร์ทดสอบที่จัดทำโดย ACVP ของ NIST การกำหนดมาตรฐานของโหมดเชิงกำหนดกำลังร่างอยู่ใน FIPS 186-5 (https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5-draft.pdf ดู 6.3.2) คุณจะต้องเชื่อมต่อการใช้งานกับเซิร์ฟเวอร์ ACVP เพื่อทดสอบ คำอธิบายโดยละเอียดของโครงสร้างเวกเตอร์ทดสอบสามารถพบได้ที่นี่: https://pages.nist.gov/ACVP/draft-fussell-acvp-ecdsa.html
Kris Kwiatkowski avatar
fr flag
วิธีหนึ่งในการรับเวกเตอร์เหล่านั้นจาก ACVP คือการใช้ acvpproxy https://github.com/smuellerDD/acvpproxy
Score:2

ECDSA มีสองรูปแบบ: สุ่มหรือกำหนด การคำนวณลายเซ็นเกี่ยวข้องกับตัวเลข $k$ ซึ่งจะต้องไม่ซ้ำกับข้อความที่แตกต่างกันด้วยคีย์เดียวกัน มีสองวิธีในการนำไปใช้: การสร้าง $k$ สุ่มหรือสร้าง $k$ ด้วยวิธีกำหนดจากคีย์และข้อความ (ฉันละเว้นรายละเอียดที่นี่ แต่เน้นเฉพาะสิ่งที่เกี่ยวข้องกับคำถามนี้) ตัวแปรทั้งสองสร้างลายเซ็นที่เข้ากันได้: เป็นไปไม่ได้ที่จะบอกว่าตัวแปรใดใช้เพื่อสร้างลายเซ็นที่กำหนด (แน่นอนว่าคุณสามารถบอกได้ด้วยการขอให้ผู้ดำเนินการลงนามข้อความเดียวกันสองครั้งและเปรียบเทียบผลลัพธ์)

คำจำกัดความเดิมของ ECDSA พิจารณาเฉพาะตัวแปรสุ่ม และนี่เป็นเพียงคำเดียวที่ NIST อนุญาต ณ วันที่ ม.ป.ป.186-4 (ดู §6.3 และ §6.4) อาร์เอฟซี 6979 เป็นข้อมูลจำเพาะสำหรับตัวแปรที่กำหนดขึ้น

เวกเตอร์ทดสอบ NIST ถูกสร้างขึ้นโดยใช้ ECDSA แบบสุ่ม ผลที่ตามมาของการใช้อัลกอริทึมแบบสุ่มคือคุณไม่สามารถทำการทดสอบที่ทราบคำตอบได้ ทุกครั้งที่คุณเรียกใช้การคำนวณลายเซ็น คุณจะได้ผลลัพธ์ที่แตกต่างกัน สิ่งที่คุณทำได้สำหรับการทดสอบคือทดสอบว่าผลลัพธ์ของการคำนวณลายเซ็นเป็นลายเซ็นที่ถูกต้อง ไม่ใช่ว่าเป็นลำดับของไบต์เฉพาะ

mbedtls_ecdsa_sign_det_ext ใช้ ECDSA เชิงกำหนด คุณสามารถใช้การทดสอบที่ทราบคำตอบสำหรับ ECDSA เชิงกำหนด แต่ NIST ไม่ได้ให้เวกเตอร์ทดสอบเนื่องจาก NIST ไม่ได้สร้างมาตรฐาน ECDSA เชิงกำหนด

หากคุณขยายความออกไปเล็กน้อย คุณอาจกล่าวได้ว่าเป็นไปได้ที่จะมีการทดสอบที่ทราบคำตอบ หากคุณระบุอย่างครบถ้วนว่าอัลกอริทึมใช้เอาต์พุตของเครื่องกำเนิดแบบสุ่มอย่างไร แต่ตามทฤษฎีแล้ว ตอนนี้คุณกำลังทดสอบอัลกอริทึมที่กำหนดขึ้นซึ่งรับอินพุตบางอย่าง ซึ่งในโลกแห่งความเป็นจริงควรจะมาจากตัวสร้างแบบสุ่ม และในทางปฏิบัติ ในการใช้งานจริง เป็นไปไม่ได้เสมอที่จะเปลี่ยนตัวสร้างแบบสุ่มสำหรับการทดสอบ และไม่ว่าในกรณีใดก็ตาม FIPS 184-4 อนุญาตให้มีการเปลี่ยนแปลงบางอย่างในการใช้เอาต์พุตของตัวสร้างแบบสุ่มเมื่อสร้าง $k$ สำหรับลายเซ็น ECDSA

kelalaka avatar
in flag
จับดีเกี่ยวกับ det ฉันต้องการเพิ่มเติมว่า NIST ให้ค่า $k$ เพื่อให้สามารถแทนที่ $k$ แบบสุ่มด้วย $k$ ที่กำหนด เพื่อให้พวกเขาเห็นว่าอัลกอริทึมทำงาน จากนั้นแทนที่โค้ดนี้ด้วย $k$s ที่สร้างขึ้นแบบสุ่ม นอกจากนี้ ใน RFC 6979 Thomas Pornin ยังมีเวกเตอร์ทดสอบอีกด้วย
KaljaTolkki avatar
gs flag
ขอบคุณสำหรับคำตอบที่ดี @Gilles 'หยุดทำชั่ว'! นอกจากนี้ฉันอยากจะกล่าวขอบคุณทุกคนในกระทู้นี้สำหรับความช่วยเหลือ! ฉันไม่ได้ใช้อัลกอริทึมและไม่ทราบว่าฉันสามารถให้ค่า "k" โดยไม่มีการเปลี่ยนแปลงการใช้งานหรือไม่ สำหรับฉันเวกเตอร์ทดสอบ RFC 6979 ก็เพียงพอแล้ว ฉันสามารถตรวจสอบท่อของฉันได้!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา