Wird ein RSA Private Key mit openssl erzeugt, so wird der Key im PKCS#1 Format abgelegt:
Erzeugung:
openssl genrsa -outform PEM -out key.pem -des3
erzeugt einen 512 Bit langen Key, der anschließend folgendes Format aufweist:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,DF4786233111EACD
eRCD1pon6bRDOeDFgHhtdcTtlWzSM1KI78UG/OARE5b1xKM+BOxby1gp0yIqxQIw
Ai7360VvaRruFY/yUVf58JqwCL7pR6q9oiJZGW8PIFv3ATqcbrVGRrM9CuW6hDtL
NiC/Nfrj7ZWv5kMig+N8gTqt87MDefwRQG+F7SZMOJIBGdCI4kkcHtRm53gAan/u
nJKmDgeI5XZpFxG+n/6J30oSxS2NXT/TjGtLuBGIt+JF+YoK01v9USmjbyFVjxjG
fZLPN66iQdOxP/O2F+01rzoRfeDiZ5NM/q8AIdfcr9CVfnH/wV/xg/dL+44xhiuS
nmGz359MOw4Fng6reEoxilRCWB5ryyklxZvmD6zrZb5EBs58NFNRQJvGl/PDn7x3
A7kSInNYGDhcJdrPGekXtEulkaMrnvSpwMCH/jG1DQQ=
-----END RSA PRIVATE KEY-----
openssl bietet nun die Möglichkeit mit dem Parameter pkcs8 den Key umzuformen:
openssl pkcs8 -topk8 -in key.pem -out p8key.pem
Dies ergibt folgende Ausgabe:
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIBgTAbBgkqhkiG9w0BBQMwDgQIhDFA40XfSycCAggABIIBYPjZuIFw8GxlCs9y
PEYRJPFNvLNlGglDWuY85deuxi+k/jTinjMyxRGmtnWlmly6xfjoptJDH+jmENxr
BwMEua4tthwUaJZOSU2UuN3q95kcE5YHyg9tLBvYMs3Jd/L6vOA73uiIflFgJ0yz
M3nEXqwNUKDlffVflhroRYAyWtQe9tLVaWnUZGFQeYoK7cjpnuzOPAa9QmeX3Ltf
4tkfzF8tfGM8+aoBGcO4eGmp32O0WVUE3HlcVY5Yv8XUzg7E/epB93c4bZDDGfkS
3fgr6rGb0ucL66jFqaSkJ6KVLoG1ui8ymXSmhZuzfgSWvtOnv2mM2FcpNA+dIwYp
k6cDkRWuKlZfN58axQVZ6wTWNgX/ts3aH3NmlTc50HOOGrvtqJ1jOJxzFgHmNWWS
nKCdcWAgaC43ivrbWxvgGarQuXe9lNWZt2fk4Lgukjix1Bqhakh9F5EfaiK1bXYq
ZQZotCg=
-----END ENCRYPTED PRIVATE KEY-----
Oberflächlich betrachtet ähnelt sich die Darstellung, jedoch handelt es sich bei der ASN.1 Repräsentation von PKCS#1 um eine Darstellung des Keys mittels dem CRT:
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
}
im PKCS#8 Format hingegen wird der Key in der Struktur PrivateKeyInfo dargestellt:
PrivateKeyInfo ::= SEQUENCE {
version Version,
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
privateKey PrivateKey,
attributes [0] IMPLICIT Attributes OPTIONAL
}
Version ::= INTEGER
PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
PrivateKey ::= OCTET STRING
Attributes ::= SET OF Attribute
Viele Applikationen oder Frameworks sind nicht in der Lage Schlüssel in der Form RSAPrivateKey zu verarbeiten, deshalb ist es ratsam, den Key in der Struktur PrivateKeyInfo abzuspeichern.