在节点

时间:2017-11-08 14:03:22

标签: java node.js cryptography rsa

我使用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:无起始线

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

1 个答案:

答案 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。