在节点中读取 Java 生成的 public 键

Read Java generated public key in node

我在 Java 中生成了 public 密钥的字节,内容如下:

package test;

import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.util.Base64;

public class Test {

    public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
         KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
         //generator.initialize(dsabits, sr);
         KeyPair keyPair = generator.generateKeyPair();
         PublicKey publicKey = keyPair.getPublic();

         byte[] encodedBytes = Base64.getEncoder().encode(publicKey.getEncoded());
         System.out.println("decodedBytes " + new String(encodedBytes));
    }

}

=> decodedBytes MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJQz9HgPKzGi+jT5uZ7CEU8mQyNZXm1IpPBIaMGZ2IW54iv+ptVAI8lG9mRNPTyZf07GZNnDSp5RcAn19lUh6eBxZ6R+Yg78rjw4UFfuGQPe8pKrAsy0ESOxLJrh2iQpa4H1DQ86Jq1kSUGFBMCpk68RyT+yQGwBCO8yomqp+7HQIDAQAB

现在我需要使用这个 publick 密钥在节点中加密一个字符串。 我试过

var crypto = require("crypto");
var pubKeyB64 = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJQz9HgPKzGi+jT5uZ7CEU8mQyNZXm1IpPBIaMGZ2IW54iv+ptVAI8lG9mRNPTyZf07GZNnDSp5RcAn19lUh6eBxZ6R+Yg78rjw4UFfuGQPe8pKrAsy0ESOxLJrh2iQpa4H1DQ86Jq1kSUGFBMCpk68RyT+yQGwBCO8yomqp+7HQIDAQAB';

var pubKey = Buffer.from(pubKeyB64, 'base64');

var toEncrypt = 'ciao';
var buffer = new Buffer(toEncrypt);
var encrypted = crypto.publicEncrypt(pubKey, buffer);
console.log(encrypted.toString("base64"));

但不幸的是我得到了

Error: error:0906D06C:PEM routines:PEM_read_bio:no start line

我无法控制 public 密钥生成格式,不幸的是我必须使用我得到的格式。 有没有办法在节点中使用这个密钥以某种方式加密字符串?

假设你的意思是 https://nodejs.org/api/crypto.html#crypto_crypto_publicencrypt_key_buffer 它说它想要一个字符串

A PEM encoded public or private key.

要创建 PEM 编码,不要将 base64 转换为二进制,而是将其分成 64 个字符的块,除了最后一个字符后跟一个换行符,在开头放一行 -----BEGIN PUBLIC KEY----- 加上换行符,然后行 -----END PUBLIC KEY----- 加上末尾的换行符。

我可以在 Java 端编码,但你说你不能改变它,而且我不知道足够的 js 来编码 nodejs 端,所以为其他人设置 CW。