我使用Java生成公钥的字节,如下所示:
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"));
但不幸的是我得到了
错误:错误:0906D06C:PEM例程:PEM_read_bio:无起始线
我无法控制公钥生成格式,不幸的是我必须使用我所获得的格式。 有没有办法在节点中使用此密钥以某种方式加密字符串?
答案 0 :(得分:3)
假设你的意思是https://nodejs.org/api/crypto.html#crypto_crypto_publicencrypt_key_buffer,它说它想要一个字符串
PEM编码的公钥或私钥。
要创建PEM编码,而不是将base64转换为二进制,请将其分成64个字符的块,除了最后一个后跟换行符,在行首添加一行-----BEGIN PUBLIC KEY-----
加上换行符和一行{ {1}}最后加上换行符。
我可以在Java端对此进行编码,但是你说你不能改变它,而且我不知道足够的js来编码nodejs,所以为其他人设置CW。