pkcs8ToPkcs1 function
Convierte una clave privada en formato PKCS#8 (-----BEGIN PRIVATE KEY-----) a formato PKCS#1 (-----BEGIN RSA PRIVATE KEY-----).
Implementation
String pkcs8ToPkcs1(String pkcs8Pem) {
// Elimina cabeceras, pies y espacios
final cleaned = pkcs8Pem
.replaceAll('-----BEGIN PRIVATE KEY-----', '')
.replaceAll('-----END PRIVATE KEY-----', '')
.replaceAll('\n', '')
.replaceAll('\r', '')
.trim();
// Decodifica de Base64
final pkcs8Bytes = base64.decode(cleaned);
// Parsear la estructura ASN.1
final asn1Parser = ASN1Parser(pkcs8Bytes);
final topLevelSeq = asn1Parser.nextObject() as ASN1Sequence;
// La estructura PKCS#8 tiene:
// 0 -> version
// 1 -> algorithm identifier
// 2 -> OCTET STRING que contiene la clave en formato PKCS#1
if (topLevelSeq.elements.length < 3) {
throw Exception('Estructura PKCS#8 inesperada.');
}
final pkcs1OctetString = topLevelSeq.elements[2] as ASN1OctetString;
final pkcs1Bytes = pkcs1OctetString.valueBytes();
// Convierte los bytes PKCS#1 a Base64 y agrégales las cabeceras correspondientes.
final pkcs1Base64 = _chunkString(base64.encode(pkcs1Bytes), 64);
final pkcs1Pem =
'-----BEGIN RSA PRIVATE KEY-----\n$pkcs1Base64\n-----END RSA PRIVATE KEY-----';
return pkcs1Pem;
}