如何从字符串中导入随机生成的 4096 位 Java RSA public 密钥

How to import randomly generated 4096bit Java RSA public key from String

我有一个网络应用程序,我正尝试将其与 Java 以及 Flutter 和加密一起使用。我在 Java 中使用 4096 位 RSA 随机生成的密钥对,我用它来加密随机生成的 AES 256 位密钥

我只需要 Dart 代码,因为 Java 代码已经可以使用了。

在 Java 我正在使用这个 class

    /**
     * Create a key pair
     * @return The pair
     */
    public static KeyPair generateKeyPairs() {
        KeyPairGenerator keyGen;
        try {
            keyGen = KeyPairGenerator.getInstance("RSA");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
        keyGen.initialize(4096);
        return keyGen.generateKeyPair();
    }

    public static String toBase64(Key publicKey) {
        byte[] encodedPublicKey = publicKey.getEncoded();
        return Base64.getEncoder().encodeToString(encodedPublicKey);
    }

    public static PublicKey toPublicKey(String base64PublicKey){
        PublicKey publicKey;
        try{
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(base64PublicKey.getBytes()));
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            publicKey = keyFactory.generatePublic(keySpec);
            return publicKey;
        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return null;
    }

在 Dart 中我使用了 PointyCastle 和这个方法;然而它不起作用

  static RSAAsymmetricKey rsaPublicKeyFromString(String key) {
    String keyWithHeader = "-----BEGIN RSA PUBLIC KEY-----\n" + utf8.decode(base64Decode(key)) + "\n-----END RSA PUBLIC KEY-----";
    return RSAKeyParser().parse(keyWithHeader);
  }

使用优秀的 basic_utils 包。

飞镖

import 'package:pointycastle/export.dart';
import 'package:basic_utils/basic_utils.dart';

void main() {
  var javaEncoded =
      'MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnitmaCHY8T171EiimoIN8MUg6IMi2JXbZBFioFJK9fiXnX/bo/6+1fuNgk+T/r6fbtk0iCogBCL30j/K7L+3J9p06rhvpM0/XAxi7YhMrIU5zetToZPBStzWt/qS1vOF2WFK6OfloFwFNAJltNljeVl7M7KbAkYcLxhfwyaPZTvmumAsCkkVhQevaVNBD2i6BWbMWb+3aki20FE2+nwzSa0ZgtwA9FJ4AV023eA1sw1ON9KS9eqdz78d/ve4aJJ/pv2Tvvc3iY2HhlvJmzS81tcocO660QediiI3K7rXus1QmGpHNEBvv818ai+RS4sehvyAhZl6dr+HH9zpdV0QESHqsyi7zJaal2GYeILdNGZtyYEsaqEq8K8MiynCvk7HSXHGZsx7zNFtVztc8T6ubN9sBDx4myFj/a1pdDltQ8OJGvomLX6wBwC0ywiroDeMAdbpfU1xNBYUqj8S0dTkrlul+ucbOySTpTpQJOnj9X98kptGnL2ESqi71vQh+qcMALjF/OqbGVOnPzzEqPlUWsR9jykmjBHkgeC9vSoMeGMdx+pUV7D1AXrXGs3ALOuBoUcBR00JPwIQ69wSZ/WFL9C9+gPfIvO802NEuckEYQB1eHVQFnhxdNF+slii+RBZ7UqnH3Fzvai4rPq5Yd/+Enxa8Gd3dqkO0QmkP5OSPzECAwEAAQ==';

  var pem =
      '-----BEGIN RSA PUBLIC KEY-----\n$javaEncoded\n-----END RSA PUBLIC KEY-----';

  RSAPublicKey public = CryptoUtils.rsaPublicKeyFromPem(pem);
  print(public.modulus);
}

长字符串由此 Java 生成 - 显示完整。

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(4096);
KeyPair pair = keyGen.generateKeyPair();

byte[] encodedPublicKey = pair.getPublic().getEncoded();
System.out.println(Base64.getEncoder().encodeToString(encodedPublicKey));