“BAŞLANGIÇ RSA ÖZEL ANAHTARI” ile “ÖZEL ANAHTARI BAŞLAT” arasındaki farklar


152

Merhaba ben bir .pemdosyadan özel anahtarları ithal ve daha sonra kullanmak için özel bir anahtar nesne oluşturmak bir program yazıyordum .. Karşılaştığım sorun bazı pemdosya başlığı ile başlar

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

diğerleri ile başlarken

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

Aramalarımla PKCS#8ilklerin biçimlendirildiğini biliyordum ama diğerinin hangi biçime ait olduğunu bilmiyordum.

Yanıtlar:


184

Bkz. Https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem ("Her durumda, BEGIN RSA PRIVATE KEY" için arama bağlantısı ).

BEGIN RSA PRIVATE KEYPKCS # 1'dir ve sadece bir RSA anahtarıdır. Temelde sadece PKCS # 8'in anahtar nesnesidir, ancak önde sürüm veya algoritma tanımlayıcısı yoktur. BEGIN PRIVATE KEYPKCS # 8'dir ve anahtar türünün anahtar verilere dahil edildiğini gösterir. Bağlantıdan:

Şifrelenmemiş PKCS # 8 kodlanmış veriler, etiketlerle başlar ve biter:

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

Base64 kodlu verilerde aşağıdaki DER yapısı bulunur:

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

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

RSA özel anahtarı için, OID 1.2.840.113549.1.1.1'dir ve PrivateKey anahtar veri bit dizisi olarak bir RSAPrivateKey vardır.

Bunun aksine BEGIN RSA PRIVATE KEY, her zaman bir RSA anahtarı belirtir ve bu nedenle bir anahtar türü OID içermez. BEGIN RSA PRIVATE KEYolduğu PKCS#1:

RSA Özel Anahtar dosyası (PKCS # 1)

RSA özel anahtar PEM dosyası RSA anahtarlarına özgüdür.

Etiketleri ile başlar ve biter:

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

Base64 kodlu verilerde aşağıdaki DER yapısı bulunur:

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
}

yani, bu ikisi dışında kullanılan herhangi bir format var mı ve varsa başlıktan nasıl belirleyebilirim?
monim

1
Sonic'in cevabında verilen özel anahtar etiketlerinden herhangi birinin adil oyun olduğunu hayal ediyorum.
Jason C

RSA anahtarları için PKCS # 1 CRT parametreleri içerir, PKCS # 8 içermez. Boyutlara bakarak bunu onaylayabilirsiniz. PKCS # 8, daha fazla başlık eklenmiş olsa bile daha küçüktür. Performansı önemsiyorsanız PKCS # 1 kullanın. Testim 3 kat daha hızlı gösteriyor.
ZZ Coder

5
@ZZCoder, anahtarları nasıl oluşturduğunuz ve performansı test ettiğiniz konusunda lütfen biraz ayrıntı verebilir misiniz? openssl genpkey -algorithm RSA -out key.pemCRT parametrelerini içeren PKCS # 8 anahtarını üretir.
Vadim Kuznetsov

5
Bir PKCS # 1 anahtarı oluşturmak için openssl genrsakomut kullanılabilir. Kullanımı openssl reqözel anahtarı ve bir ile sona erecek crt hem üretmek için PKCS # 8 tuşunun. genpkeyManuel devletler The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.. Ancak bazı yazılımlar ( mysql) yalnızca PKCS # 1 anahtarlarını kullanabilir. Dönüştürme PKCS # 8 için PKCS # 1 ile yapılabilir openssl rsa -in key.pem -out key.pem. Diğer yolla dönüştürme yapılabilir openssl pkey -in key.pem -out key.pem.
Paul Tobias

28

Bir bak <openssl/pem.h>. Olası BEGIN işaretlerini verir.

Hızlı başvuru için yukarıdaki bağlantıdan içerik kopyalama:

#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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.