Score:3

มีวิธีง่ายๆ ที่จะทำให้ตำราเรียน RSA ปลอดภัยพอที่จะนำไปใช้ในชีวิตจริงได้หรือไม่?

ธง cn

ฉันได้เขียนแบบดิบ (แบบเรียน) การนำ RSA ไปใช้ (เพื่อความสนุกสนาน) และฉันสงสัยว่ามีวิธีง่ายๆ ที่จะทำให้ปลอดภัยพอที่จะนำไปใช้ในชีวิตจริงได้ (โดยไม่ต้องใช้ OAEP+ และ RSASSA-PSS) หรือไม่ มีอัลกอริทึมง่ายๆ สำหรับการเติมและสร้างลายเซ็นดิจิทัลที่ปลอดภัยหรือไม่

kelalaka avatar
in flag
และ [PKCS1-v1_5 Signature Scheme](https://crypto.stackexchange.com/a/88101/18298) มีหลักฐาน _จาก มุมมองด้านความปลอดภัยที่พิสูจน์ได้ RSA PKCS#1 v1.5 สามารถใช้ได้อย่างปลอดภัย หากความยาวเอาต์พุตของแฮช มีการเลือกฟังก์ชั่นอย่างเหมาะสม_
Brongs Gaming avatar
cn flag
ขอบคุณสำหรับคำตอบ @kelalaka!
Score:7
ธง my

ที่จริงแล้ว การเติมลายเซ็น RSASSA-PKCS1-v1_5 นั้นค่อนข้างเรียบง่าย และไม่มีจุดอ่อนที่ทราบ (การเติม RSAES-PKCS1-v1_5 ที่มีชื่อคล้ายกันนี้ใช้ไม่ได้กับการเข้ารหัส เว้นแต่จะนำไปใช้อย่างระมัดระวังมาก อย่าใช้สิ่งนั้น)

รูปแบบการเติมคือ:

00 01 FF FF FF ... FF FF 00 <DER ของประเภทแฮช> <แฮช>

ที่ไหน DER ของประเภทแฮช เป็นสตริงไบต์ที่ขึ้นอยู่กับประเภทของแฮชที่คุณใช้ และ กัญชา เป็นเอาต์พุตของฟังก์ชันแฮช สำหรับ SHA-256 DER คือสตริงไบต์:

30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20

ดังนั้น คุณใช้แฮชของคุณ ต่อท้ายด้วยสตริงคงที่ เท่านี้ก็เสร็จแล้ว

หากคุณต้องการทำให้สิ่งต่าง ๆ ง่ายขึ้น คุณสามารถละเว้น DER ของประเภทแฮช (ซึ่งหมายความว่าคุณไม่ใช่ PKCS #1.5 อย่างแน่นอน อย่างไรก็ตาม มันไม่ได้แนะนำจุดอ่อนใด ๆ ที่ทราบ

Brongs Gaming avatar
cn flag
ขอบคุณสำหรับคำตอบ! ฉันเข้าใจถูกต้องหรือไม่ว่า RSASSA-PKCS1-v1_5 สามารถใช้สำหรับการสร้างลายเซ็นดิจิทัลเท่านั้น
SAI Peregrinus avatar
si flag
ใช่นั่นสำหรับลายเซ็นเท่านั้น การเข้ารหัส RSA ส่วนใหญ่มีประโยชน์ในฐานะบล็อกการสร้างสำหรับโครงสร้างอื่นๆ (เช่น การเข้ารหัสแบบโฮโมมอร์ฟิค) ทางเลือกง่ายๆ คือ RSA-KEM ซึ่งไม่ใช่การเข้ารหัสทั้งหมด (จะแลกเปลี่ยนหมายเลขสุ่มซึ่งใช้เพื่อรับคีย์การเข้ารหัสสำหรับใช้กับ AEAD แบบสมมาตร) แต่ง่ายและปลอดภัย
poncho avatar
my flag
@BrongsGaming: อืม ใช่ แต่คำถามที่ถามว่า 'มีอัลกอริธึมง่ายๆ สำหรับการเติมและสร้างลายเซ็นดิจิทัลที่ปลอดภัยหรือไม่' - คุณไม่ได้ขออัลกอริธึมง่ายๆ สำหรับการเข้ารหัส สำหรับสิ่งนั้น วิธีที่ง่ายที่สุดคือ "อย่าเติมช่องว่างเลย ให้ตัวเข้ารหัสเลือกค่าสุ่มระหว่าง 2 ถึง $n-2$ และตำราเรียน RSA เข้ารหัสแทน ใช้ตัวเลขสุ่มดั้งเดิมที่คุณเลือกเพื่อสร้าง คีย์สมมาตรและใช้คีย์สมมาตรนั้นเพื่อเข้ารหัสข้อความที่คุณต้องการส่ง
SAI Peregrinus avatar
si flag
โปรดทราบว่าโดยพื้นฐานแล้ว RSA-KEM เป็นเวอร์ชันที่เป็นทางการมากกว่า (ระบุวิธีใช้ตัวเลขสุ่มเพื่อสร้างคีย์สมมาตรและบิตอื่นๆ เกี่ยวกับรูปแบบ)
Brongs Gaming avatar
cn flag
ขอบคุณ @SAI Peregrinus และ @poncho! ขอโทษที่คำถามของฉันไม่ชัดเจน ฉันเป็นมือใหม่ในเรื่องนี้และภาษาอังกฤษไม่ใช่ภาษาแม่ของฉัน :)
Brongs Gaming avatar
cn flag
@poncho แต่ฉันจะโอนหมายเลขสุ่มนั้นอย่างปลอดภัยได้อย่างไรหากตำราเรียน RSA ถือว่าไม่ปลอดภัย
poncho avatar
my flag
@BrongsGaming: เหตุผลที่หนังสือเรียน RSA ถือว่าไม่ปลอดภัยคือ a) เพราะมันเป็น determenistic; ผู้โจมตีสามารถเดาข้อความธรรมดาและเข้ารหัสได้ - หากพวกเขาเดาถูกต้อง เขารู้ข้อความธรรมดา และ b) คุณสมบัติโฮโมมอร์ฟิคของ RSA; หากค่าที่เข้ารหัสเป็นตัวเลขที่ราบรื่น นั่นคือผลคูณของจำนวนเฉพาะขนาดเล็ก ผู้โจมตีสามารถกู้คืนข้อความธรรมดานั้นได้อย่างรวดเร็วอย่างน่าประหลาดใจ ทั้งสองอย่างนี้ใช้ไม่ได้กับ RSA-KEM (ซึ่งคุณเลือกหมายเลข n-บิตแบบสุ่ม)
poncho avatar
my flag
@Gilles: จริง ๆ แล้ว RSASSA-PKCS1-v1_5 เป็นรูปแบบการเติมลายเซ็น (และไม่สามารถใช้สำหรับการเข้ารหัสได้เนื่องจากถูกกำหนดไว้แล้ว) คุณกำลังคิดเกี่ยวกับ RSAES-PKCS1-v1_5; ที่อ่อนแอ แต่ฉันอธิบายรูปแบบการเติม RSASSA ในรายละเอียดเพียงพอที่ไม่ควรมีความสับสน
Gilles 'SO- stop being evil' avatar
อ่า ขออภัย ฉันเรียบเรียงประโยคมากเกินไป ฉันคิดว่ามันสำคัญที่จะต้องยืนยันว่าเป็นเพียงลายเซ็น PKCS1v1.5 เท่านั้นที่ใช้ได้ ไม่ใช่การเข้ารหัส PKCS1v1.5
Score:6
ธง in

นอกจากนี้ยังมีโครงร่างลายเซ็นที่เรียบง่าย แต่ไม่เป็นที่รู้จักสำหรับ RSA;

มีอยู่จริงที่ไม่สามารถปลอมแปลงได้ภายใต้การโจมตีข้อความที่เลือกแบบปรับเปลี่ยนได้ในรูปแบบสุ่มของออราเคิล

วันนี้ RSA-FDH นั้นเรียบง่ายมาก

  • เข้าสู่ระบบ: $\sigma = เครื่องหมาย(H, m) = (H(m))^d \bmod n$
  • ตรวจสอบ: $\{0,1\} = ตรวจสอบ(H, m, \sigma) = [\sigma^e \bmod n \overset{?}= H(m) \bmod n]$

มันไม่ง่ายเลยที่จะลงนามในตอนนั้นเนื่องจากข้อกำหนดด้านขนาด กัญชา $H$ ต้องมีขนาดเอาต์พุตเท่ากับขนาดโมดูลัส RSA ตอนนี้ ตัวเลือกที่ชัดเจนคือ eเอ็กซ์มีแนวโน้ม เอาต์พุต unctions (XOF) เช่น SHAKE128/SHAKE256 ของ SHA-3

ขอขนาดเอาต์พุตจาก SHAKE128 (หรือ SHAKE256) เท่ากับขนาดโมดูลัส RSA แฮชแล้วเซ็น แค่นั้น!


นำเข้าแฮชลิบ
อาร์เอสนำเข้า

(pubkey, privkey) = rsa.newkeys(2048)


FHD = hashlib.shake_128()
FHD.update (b'ข้อความเพื่อลงชื่อ')
digestFDH = int.from_bytes(FHD.digest(255),byteorder='little')

#แค่m^d mod n    
ลงชื่อ = rsa.core.decrypt_int (digestFDH,privkey.d,pubkey.n)

#แค่ม^e mod n
ถ้าdigestFDH == rsa.core.encrypt_int (เซ็นชื่อ ,pubkey.e,pubkey.n):
    พิมพ์ ("ตรวจสอบแล้ว")
อื่น:
    พิมพ์("!!!การยืนยันล้มเหลว หยุด!!!")

คำจำกัดความที่แน่นอนเหมือนในบทความปี 1998 (ไม่ได้อยู่ในเครื่องหมายคำพูด)

อัลกอริทึมการลงนามและการตรวจสอบมีการเข้าถึงของ oracle ให้กับฟังก์ชันแฮช $H_{FDH} : \{0, 1\}^â \to \mathbb{Z}^*_N$. การสร้างและการตรวจสอบลายเซ็นมีดังนี้:

$\operatorname{SignFDH}_{N,d}(M) $
$\quad y \leftarrow H_{FDH}(M)$
$\quad \text{return }y^d \bmod N$

$\operatorname{VerifyFDH}_{N,e}(M, x)$
$\quad y \leftarrow x^e \bmod N;$ $\quad y' \leftarrow H_{FDH}(M)$
$\quad\text{if }y = y' \text{ จากนั้น return }1 \text{ มิฉะนั้น return } 0$

และโปรดทราบว่าอย่างน้อยบางส่วนขององค์ประกอบของ $\mathbb{Z}_N^*$ ไม่สามารถส่งออกโดย XOF มาตรฐาน โมดูลัสไม่ใช่กำลัง 2 ที่แน่นอน ดังนั้นเราจำเป็นต้องให้เอาต์พุตน้อยกว่าโมดูลัสหนึ่งบิต ไลบรารีที่ฉันใช้สำหรับการนำไปใช้งานตัวอย่างใช้ไบต์สำหรับขนาดเอาต์พุต ดังนั้นจึงไม่สามารถครอบคลุมได้ถึง 8 บิต

นอกจากนี้ยังไม่รวมเอาต์พุตที่เป็นศูนย์ทั้งหมด!.

Brongs Gaming avatar
cn flag
ขอบคุณสำหรับคำตอบ! ความคิดที่น่าสนใจ แต่คุณขอขนาดเอาต์พุตจาก Shake128 ให้เท่ากับขนาดโมดูลัส RSA ในข้อมูลโค้ดนี้ได้จากที่ใด
kelalaka avatar
in flag
`digest(255)` และโปรดทราบว่าฉันไม่ได้อ้างว่านี่เป็นการใช้งานที่ปลอดภัยโดยเฉพาะกับช่องทางด้านข้าง [ข้อมูลเล็กน้อย](https://crypto.stackexchange.com/q/75408/18298) คุณอาจต้องใช้ที่ปลอดภัย ดู[คำเตือนของห้องสมุด](https://pypi.org/project/rsa/)
Maarten Bodewes avatar
in flag
ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้เกี่ยวกับข้อเท็จจริงที่ว่าลายเซ็น **เกือบ FDH** ด้านบนได้รับการ [ย้ายไปที่แชท](https://chat.stackexchange.com/rooms/131177/discussion-on-answer-by-kelalaka-is- มีวิธีง่ายๆในการสร้างตำรา-rsa-secur)
Ruggero avatar
kr flag
ไม่ใช่ขอบเขตที่ดีที่สุดจาก "การพิสูจน์ความปลอดภัยที่เหมาะสมที่สุดสำหรับแฮชโดเมนแบบเต็ม มาเยือนอีกครั้ง" โดย Kakvi และ Kiltz ?
kelalaka avatar
in flag
@Ruggero ดูเหมือนว่าฉันจะพลาดไป ขอบคุณ ฉันจะปรับปรุงหลังจากอ่านเพิ่มเติม...
Score:2
ธง vu

คำตอบอื่น ๆ ให้ภาพรวมที่ดีของโครงร่างลายเซ็น RSA ที่มีช่องว่างภายในอย่างง่ายที่สามารถใช้ได้อย่างปลอดภัย

ฉันต้องการนำความสนใจของผู้อ่านไปที่รูปแบบการเข้ารหัส "RSA-KEM" (เนื่องจากคำถามนี้ติดแท็ก OAEP ด้วย) ที่ระบุใน RFC แทร็กมาตรฐาน (ซึ่งระบุการใช้งานใน CMS สภาพแวดล้อมไวยากรณ์ข้อความเข้ารหัสลับ)

https://datatracker.ietf.org/doc/html/rfc5990#appendix-A

โดยพื้นฐานแล้ว มันเหมือนกับส่วนเข้ารหัสการเข้ารหัสของ "โดเมนเต็มแฮช" โดยที่เนื้อหาหลักที่เข้ารหัสโดยอัลกอริทึม RSA คือ "โดเมนเต็ม" นั่นคือ เป็นค่าที่เลือก สุ่มแบบสม่ำเสมอ ภายในช่วงของ $[0,น)$ ที่ไหน $N$ เป็นโมดูลัสสาธารณะ

จากนั้นจะใช้ฟังก์ชันการรับคีย์เพื่อรับคีย์ ซึ่งจะใช้ในการเข้ารหัสแบบตัดคีย์

Brongs Gaming avatar
cn flag
ขอบคุณสำหรับคำตอบ!

โพสต์คำตอบ

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