generateRSAKeys static method

Future<AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey>> generateRSAKeys({
  1. int bitLength = 2048,
})

Generiert ein RSA-Schlüsselpaar mit der Web Crypto API.

Diese statische Methode nutzt die native Web Crypto API des Browsers zur Generierung eines kryptographisch sicheren RSA-Schlüsselpaars. Die generierten Schlüssel werden automatisch in das PEM-Format exportiert und dann in pointycastle-kompatible Objekte konvertiert.

Parameter:

  • bitLength: Die Bit-Länge des zu generierenden Schlüssels (Standard: 2048)

Rückgabe: AsymmetricKeyPair mit RSA-öffentlichem und -privatem Schlüssel

Technische Details:

  • Verwendet RSA-OAEP-Algorithmus für sichere Schlüsselgenerierung
  • Hash-Algorithmus: SHA-256 für optimale Sicherheit
  • Öffentlicher Exponent: 65537 (0x010001) als Standard
  • Schlüssel sind für 'encrypt' und 'decrypt' Operationen konfiguriert

Performance: Die Web Crypto API nutzt Hardware-Beschleunigung wenn verfügbar, was zu deutlich besserer Performance führt als Software-basierte Implementierungen.

Wirft eine Exception, wenn die Web Crypto API nicht verfügbar ist oder die Schlüsselgenerierung fehlschlägt.

Implementation

static Future<AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey>> generateRSAKeys(
    {int bitLength = 2048}) async {
  final publicExponentArray = Uint8List.fromList([0x01, 0x00, 0x01]);

  final options = GenerateKeyOptions(
    name: 'RSA-OAEP',
    modulusLength: bitLength,
    publicExponent: publicExponentArray.toJS,
    hash: HashAlgorithm(name: 'SHA-256'),
  );

  final usages = ['encrypt', 'decrypt'].map((s) => s.toJS).toList().toJS;

  final keypairResult = await window.crypto.subtle
      .generateKey(
        options,
        true,
        usages,
      )
      .toDart;

  final keypair = keypairResult as CryptoKeyPair;
  final publicKey = keypair.publicKey;
  final privateKey = keypair.privateKey;

  final rsaPublicKeyPEM = await _exportPublicKey(publicKey);
  final rsaPrivateKeyPEM = await _exportPrivateKey(privateKey);

  RSAPublicKey rsaPublicKey = rsaPublicKeyPEM.parsePublicKeyFromPem();
  RSAPrivateKey rsaPrivateKey = rsaPrivateKeyPEM.parsePrivateKeyFromPem();

  return AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey>(
      rsaPublicKey, rsaPrivateKey);
}