web-dev-qa-db-fra.com

Flutter - Comment générer une paire de clés privée / publique pour crypter les messages

J'ai besoin de générer une paire de clés dans mon application Flutter, mais il semble qu'il n'y ait pas de bibliothèque pour le faire. Il existe une bibliothèque appelée RSA qui analyse une paire de clés publiques/privées et est capable de chiffrer et de déchiffrer des chaînes en les utilisant, mais elle n'a pas la possibilité de générer un nouveau KeyPair (de préférence à partir d'une chaîne donnée).

Comment puis-je générer les clés en premier lieu? Suis-je en train de manquer quelque chose?

7
Shamshun

Il existe une pré-version compatible Dart2 et Flutter de Pointycastle disponible.

Le fichier README.md par défaut pointe vers la première version non préliminaire et, par conséquent, la page d'accueil affiche "Dart 2 INCOMPATIBLE", mais cela ne s'applique qu'à la version < 0.11.1.

Ajoutez simplement à pubspec.yaml

dependencies: 
  pointycastle: ^1.0.0-rc4

Pour des exemples, consultez les tests unitaires https://github.com/PointyCastle/pointycastle/blob/master/test/key_generators/rsa_key_generator_test.Dart

2

J'ai commencé à utiliser un exemple de code pour générer une paire de clés publiques/clés privées à l'aide de châteaux pointus. Après une longue période de débogage et d'édition de code, je me suis retrouvé avec le code suivant:

  var keyParams = new RSAKeyGeneratorParameters(BigInt.from(65537), 2048, 5);

  var secureRandom = new FortunaRandom();
  var random = new Random.secure();

  List<int> seeds = [];
  for (int i = 0; i < 32; i++) {
    seeds.add(random.nextInt(255));
  }


  secureRandom.seed(new KeyParameter(new Uint8List.fromList(seeds)));

  var rngParams = new ParametersWithRandom(keyParams, secureRandom);
  var k = new RSAKeyGenerator();
  k.init(rngParams);

  var keyPair = k.generateKeyPair();

  print(new RsaKeyHelper().encodePublicKeyToPem(keyPair.publicKey) );
  print(new RsaKeyHelper().encodePrivateKeyToPem(keyPair.privateKey) );

  AsymmetricKeyParameter<RSAPublicKey> keyParametersPublic = new PublicKeyParameter(keyPair.publicKey);
  var cipher = new RSAEngine()..init(true, keyParametersPublic);

  var cipherText = cipher.process(new Uint8List.fromList("Hello World".codeUnits));

  print("Encrypted: ${new String.fromCharCodes(cipherText)}");

  AsymmetricKeyParameter<RSAPrivateKey> keyParametersPrivate = new PrivateKeyParameter(keyPair.privateKey);

  cipher.init( false, keyParametersPrivate )
  ;
  var decrypted = cipher.process(cipherText);
  print("Decrypted: ${new String.fromCharCodes(decrypted)}");

J'ai utilisé les modifications de ce type depuis cette page de problème git ( Regardez ici pour plus de fonctions telles que l'encodage/décodage à partir de PEM

2
Shamshun