encrypt static method

String encrypt(
  1. String pemPublicKey,
  2. CardPaymentData cardData
)

Criptografa os dados do cartão usando chave pública RSA. Utiliza o padrão exigido para PCI: RSA/ECB/OAEPWithSHA-256AndMGF1Padding. Retorna o ciphertext em Base64.

Implementation

static String encrypt(String pemPublicKey, CardPaymentData cardData) {
  final normalizedPem = pemPublicKey.trim();
  if (normalizedPem.isEmpty) {
    throw const FormatException('A chave pública PEM não pode estar vazia.');
  }

  late final RSAPublicKey publicKey;

  try {
    final parser = RSAKeyParser();
    // O cast é necessário pois o parser pode retornar RSAPrivateKey dependendo do PEM
    publicKey = parser.parse(normalizedPem) as RSAPublicKey;
  } catch (e) {
    throw FormatException(
      'Falha ao fazer parse da chave pública PEM. Formato inválido. Detalhes: $e',
    );
  }

  // O padding OAEP com SHA-256 e MGF1 é configurado aqui:
  final encrypter = Encrypter(
    RSA(
      publicKey: publicKey,
      encoding: RSAEncoding.OAEP,
      digest: RSADigest.SHA256,
    ),
  );

  // Converte o objeto do cartão para JSON String
  // IMPORTANTE: Nunca logue esta string no console
  final plainTextJson = jsonEncode(cardData.toJson());

  // Criptografa
  final encrypted = encrypter.encrypt(plainTextJson);

  // Retorna em Base64
  return encrypted.base64;
}