pkcs8ToPkcs1 function

String pkcs8ToPkcs1(
  1. String pkcs8Pem
)

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;
}