นอกจากนี้ยังมีโครงร่างลายเซ็นที่เรียบง่าย แต่ไม่เป็นที่รู้จักสำหรับ 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 บิต
นอกจากนี้ยังไม่รวมเอาต์พุตที่เป็นศูนย์ทั้งหมด!.