คำตอบของฉันด้านล่างยาวเล็กน้อย แต่หวังว่าจะให้รายละเอียดบางอย่างที่ขาดหายไปในคำตอบก่อนหน้า ฉันจะเริ่มต้นด้วยข้อความที่เกี่ยวข้องและสุดท้ายตอบคำถามเริ่มต้น
ในการเข้ารหัสบางสิ่งโดยใช้อัลกอริทึม RSA คุณต้องใช้โมดูลัสและการเข้ารหัส (สาธารณะ) คู่เลขชี้กำลัง (n, e) นั่นคือกุญแจสาธารณะของคุณ ในการถอดรหัสบางอย่างโดยใช้อัลกอริทึม RSA คุณต้องใช้โมดูลัสและการถอดรหัส (ส่วนตัว) เลขชี้กำลังคู่ (n, d) นั่นคือกุญแจส่วนตัวของคุณ
ในการเข้ารหัสบางสิ่งโดยใช้กุญแจสาธารณะ RSA คุณจะใช้ข้อความธรรมดาเป็นตัวเลขและยกให้เป็นโมดูลัสของ e:
ciphertext = ( plaintext^e ) mod n
ในการถอดรหัสบางอย่างโดยใช้คีย์ส่วนตัวของ RSA คุณจะต้องคำนวณตัวเลขของคุณเป็นตัวเลขและยกให้เป็นพลังของ d modulus n:
plaintext = ( ciphertext^d ) mod n
ในการสร้างคีย์ส่วนตัว (d, n) โดยใช้ openssl คุณสามารถใช้คำสั่งต่อไปนี้:
openssl genrsa -out private.pem 1024
ในการสร้างคีย์สาธารณะ (e, n) จากคีย์ส่วนตัวโดยใช้ openssl คุณสามารถใช้คำสั่งต่อไปนี้:
openssl rsa -in private.pem -out public.pem -pubout
หากต้องการตัดเนื้อหาของคีย์ private.pem ไพรเวตคีย์ RSA ที่สร้างโดยคำสั่ง openssl ด้านบนให้รันดังต่อไปนี้ (เอาต์พุตถูกตัดทอนเป็นเลเบลที่นี่):
openssl rsa -in private.pem -text -noout | less
modulus - n
privateExponent - d
publicExponent - e
prime1 - p
prime2 - q
exponent1 - d mod (p-1)
exponent2 - d mod (q-1)
coefficient - (q^-1) mod p
คีย์ส่วนตัวไม่ควรประกอบด้วยคู่ (n, d) เท่านั้น? ทำไมถึงมีส่วนประกอบเพิ่ม 6 ตัว มันมี e (เลขชี้กำลังสาธารณะ) เพื่อให้คีย์ RSA สาธารณะสามารถสร้าง / แยก / มาจากคีย์ส่วนตัว RS. private.pem ส่วนประกอบที่เหลืออีก 5 รายการจะช่วยให้กระบวนการถอดรหัสเร็วขึ้น ปรากฎว่าด้วยการคำนวณล่วงหน้าและเก็บค่า 5 ค่าเหล่านี้คุณสามารถเพิ่มความเร็วในการถอดรหัส RSA ได้ด้วยปัจจัยที่ 4 การถอดรหัสจะทำงานได้โดยไม่ต้องใช้ส่วนประกอบทั้ง 5 แต่จะสามารถทำได้เร็วขึ้นหากคุณสะดวก อัลกอริธึมการเร่งความเร็วขึ้นอยู่กับทฤษฎีส่วนที่เหลือของจีนทฤษฏีจีนที่เหลือ
ใช่ private.pem คีย์ส่วนตัวของ RSA นั้นมีค่าทั้งหมด 8 ค่าจริง ๆ ไม่มีสิ่งใดถูกสร้างขึ้นทันทีเมื่อคุณเรียกใช้คำสั่งก่อนหน้า ลองรันคำสั่งต่อไปนี้และเปรียบเทียบผลลัพธ์:
# Convert the key from PEM to DER (binary) format
openssl rsa -in private.pem -outform der -out private.der
# Print private.der private key contents as binary stream
xxd -p private.der
# Now compare the output of the above command with output
# of the earlier openssl command that outputs private key
# components. If you stare at both outputs long enough
# you should be able to confirm that all components are
# indeed lurking somewhere in the binary stream
openssl rsa -in private.pem -text -noout | less
โครงสร้างนี้ของคีย์ส่วนตัว RSA แนะนำโดยPKCS # 1 v1.5เพื่อเป็นทางเลือก ( ที่สอง ) ทางเลือก PKCS # 1 v2.0มาตรฐานไม่รวมค่า e และ d exponents จากการเป็นตัวแทนทางเลือกโดยสิ้นเชิง PKCS # 1 v2.1และv2.2เสนอการเปลี่ยนแปลงเพิ่มเติมเพื่อเป็นตัวแทนทางเลือกโดยเลือกรวมส่วนประกอบที่เกี่ยวข้องกับ CRT เพิ่มเติม
ในการดูเนื้อหาของ public.pem คีย์สาธารณะ RSA ให้เรียกใช้สิ่งต่อไปนี้ (ผลลัพธ์ถูกตัดทอนเป็นป้ายกำกับที่นี่):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
ไม่แปลกใจที่นี่ เป็นเพียงคู่ (n, e) ตามที่สัญญาไว้
ตอนนี้ในที่สุดก็ตอบคำถามเริ่มต้น: ตามที่ปรากฏข้างต้นคีย์ RSA ส่วนตัวที่สร้างขึ้นโดยใช้ openssl มีส่วนประกอบของทั้งกุญแจสาธารณะและกุญแจส่วนตัวและอีกมากมาย เมื่อคุณสร้าง / แยก / รับพับลิกคีย์จากไพรเวตคีย์ openssl จะคัดลอกสองคอมโพเนนต์เหล่านั้น (e, n) ลงในไฟล์แยกต่างหากซึ่งกลายเป็นพับลิกคีย์ของคุณ