在节点中读取 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。
我在 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。