ความแตกต่างระหว่าง“ BEGIN RSA PRIVATE KEY” และ“ BEGIN PRIVATE KEY”


150

สวัสดีฉันกำลังเขียนโปรแกรมที่นำเข้าคีย์ส่วนตัวจาก.pemไฟล์และสร้างออบเจกต์คีย์ส่วนตัวเพื่อใช้ในภายหลัง .. ปัญหาที่ฉันเผชิญคือpemไฟล์ส่วนหัวบางไฟล์เริ่มต้นด้วย

-----BEGIN PRIVATE KEY-----

ในขณะที่คนอื่นเริ่มต้นด้วย

-----BEGIN RSA PRIVATE KEY-----

จากการค้นหาของฉันฉันรู้ว่าPKCS#8รูปแบบแรกถูกจัดรูปแบบ แต่ฉันไม่รู้ว่ารูปแบบอื่นเป็นของอะไร

คำตอบ:


183

ดูhttps://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (ค้นหาหน้าสำหรับ "BEGIN RSA PRIVATE KEY") ( ลิงก์ลิงก์สำหรับลูกหลานในกรณี)

BEGIN RSA PRIVATE KEYคือ PKCS # 1 และเป็นเพียงคีย์ RSA มันเป็นเพียงแค่วัตถุสำคัญจาก PKCS # 8 แต่ไม่มีตัวระบุรุ่นหรืออัลกอริทึมด้านหน้า BEGIN PRIVATE KEYคือ PKCS # 8 และระบุว่ามีการรวมประเภทคีย์ไว้ในข้อมูลคีย์เอง จากลิงค์:

ข้อมูลที่เข้ารหัสที่เข้ารหัส PKCS # 8 เริ่มต้นและสิ้นสุดด้วยแท็ก:

-----BEGIN PRIVATE KEY-----
BASE64 ENCODED DATA
-----END PRIVATE KEY-----

ภายในข้อมูลที่เข้ารหัส base64 โครงสร้าง DER ต่อไปนี้จะปรากฏขึ้น:

PrivateKeyInfo ::= SEQUENCE {
  version         Version,
  algorithm       AlgorithmIdentifier,
  PrivateKey      BIT STRING
}

AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}

ดังนั้นสำหรับคีย์ส่วนตัว RSA OID คือ 1.2.840.113549.1.1.1 และมี RSAPrivateKey เป็นบิตคีย์ข้อมูล PrivateKey

ตรงข้ามกับBEGIN RSA PRIVATE KEYซึ่งมักจะระบุคีย์ RSA และดังนั้นจึงไม่รวมประเภทของคีย์ OID BEGIN RSA PRIVATE KEYคือPKCS#1:

ไฟล์คีย์ส่วนตัว RSA (PKCS # 1)

ไฟล์ PEM ของคีย์ RSA เป็นข้อมูลเฉพาะสำหรับคีย์ RSA

มันเริ่มต้นและลงท้ายด้วยแท็ก:

-----BEGIN RSA PRIVATE KEY-----
BASE64 ENCODED DATA
-----END RSA PRIVATE KEY-----

ภายในข้อมูลที่เข้ารหัส base64 โครงสร้าง DER ต่อไปนี้จะปรากฏขึ้น:

RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}

มีรูปแบบใดบ้างที่ใช้ยกเว้นทั้งสองรูปแบบและหากฉันจะกำหนดได้จากส่วนหัวได้อย่างไร
monim

1
ฉันนึกภาพแท็กคีย์ส่วนตัวที่ให้ไว้ในคำตอบของโซนิคเป็นเกมที่ยุติธรรม
Jason C

สำหรับคีย์ RSA, PKCS # 1 มีพารามิเตอร์ CRT, PKCS # 8 ไม่ได้ คุณสามารถยืนยันได้โดยดูที่ขนาด PKCS # 8 นั้นเล็กกว่าแม้มีส่วนหัวเพิ่มขึ้น หากคุณใส่ใจเรื่องประสิทธิภาพให้ใช้ PKCS # 1 การทดสอบของฉันแสดงเร็วขึ้น 3 เท่า
ZZ Coder

5
@ZZCoder คุณช่วยบอกรายละเอียดเกี่ยวกับวิธีสร้างคีย์และทดสอบประสิทธิภาพได้อย่างไร openssl genpkey -algorithm RSA -out key.pemสร้างคีย์ PKCS # 8 ที่มีพารามิเตอร์ CRT
Vadim Kuznetsov

5
ในการสร้างคีย์PKCS # 1openssl genrsaสามารถใช้คำสั่งได้ การใช้openssl reqเพื่อสร้างทั้งคีย์ส่วนตัวและ crt จะจบลงด้วยคีย์PKCS # 8 รัฐคู่มือgenpkey The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.แต่ซอฟต์แวร์บางตัว ( mysql) สามารถใช้คีย์PKCS # 1เท่านั้น แปลงจากPKCS # 8เพื่อPKCS # 1openssl rsa -in key.pem -out key.pemสามารถทำได้ด้วย openssl pkey -in key.pem -out key.pemแปลงทางอื่นที่สามารถทำได้ด้วย
พอลโทเบียส

28

<openssl/pem.h>มีลักษณะที่ มันให้เครื่องหมาย BEGIN ที่เป็นไปได้

คัดลอกเนื้อหาจากลิงค์ด้านบนเพื่อการอ้างอิงอย่างรวดเร็ว:

#define PEM_STRING_X509_OLD "X509 CERTIFICATE"
#define PEM_STRING_X509     "CERTIFICATE"
#define PEM_STRING_X509_PAIR    "CERTIFICATE PAIR"
#define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE"
#define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST"
#define PEM_STRING_X509_REQ "CERTIFICATE REQUEST"
#define PEM_STRING_X509_CRL "X509 CRL"
#define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY"
#define PEM_STRING_PUBLIC   "PUBLIC KEY"
#define PEM_STRING_RSA      "RSA PRIVATE KEY"
#define PEM_STRING_RSA_PUBLIC   "RSA PUBLIC KEY"
#define PEM_STRING_DSA      "DSA PRIVATE KEY"
#define PEM_STRING_DSA_PUBLIC   "DSA PUBLIC KEY"
#define PEM_STRING_PKCS7    "PKCS7"
#define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA"
#define PEM_STRING_PKCS8    "ENCRYPTED PRIVATE KEY"
#define PEM_STRING_PKCS8INF "PRIVATE KEY"
#define PEM_STRING_DHPARAMS "DH PARAMETERS"
#define PEM_STRING_DHXPARAMS    "X9.42 DH PARAMETERS"
#define PEM_STRING_SSL_SESSION  "SSL SESSION PARAMETERS"
#define PEM_STRING_DSAPARAMS    "DSA PARAMETERS"
#define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY"
#define PEM_STRING_ECPARAMETERS "EC PARAMETERS"
#define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY"
#define PEM_STRING_PARAMETERS   "PARAMETERS"
#define PEM_STRING_CMS      "CMS"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.