英文:
RSA Public Key to Node-Forge Public Key
问题
我需要帮助关于Node.js代码。我将为下面的JAVA代码编写Node.js代码。
const rsaPublicKey = "...";
const data = "...";
const keySpec = new NodeRSA.X509Certificate();
keySpec.publicKey = rsaPublicKey;
const key = new NodeRSA({b: 512}); // You can adjust the key size
key.importKey(keySpec.exportPublicKey(), 'pkcs1-public-pem');
const encryptedData = key.encrypt(data, 'base64');
我尝试使用"Forge"库,但不知道如何将给定的RSA公钥转换为Forge公钥。
有人能帮我解决这个问题吗?
英文:
I need help with NodeJS Code. I am going to write nodejs code for below JAVA code.
String rsaPublicKey = "...";
String data = "...";
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(rsaPublicKey.getBytes()));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
publicKey = keyFactory.generatePublic(keySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
I tried using "Forge" but don't know how to convert given RSA Public key to Forge Public Key.
Can anyone help me with this ?
答案1
得分: 1
按照您的要求,我将为您提供翻译好的代码部分:
import java.security.*;
import java.security.interfaces.RSAPublicKey;
import java.util.Base64;
public class Main {
private static final String X509_PEM_HEADER = "-----BEGIN PUBLIC KEY-----";
private static final String X509_PEM_FOOTER = "-----END PUBLIC KEY-----";
public final static String LINE_SEPARATOR = System.getProperty("line.separator");
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println("RSA公钥转换为Node.js Forge公钥");
// 生成RSA密钥对
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");
kpGen.initialize(2048, new SecureRandom());
KeyPair keyPair = kpGen.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
String publicKeyBase64 = Base64.getEncoder().encodeToString(publicKey.getEncoded());
System.out.println("publicKeyBase64:\n" + publicKeyBase64);
// 将公钥编码为PEM格式
String publicKeyInPemFormat = formatPublicKey(Base64.getDecoder().decode(publicKeyBase64));
System.out.println("\npublicKeyInPemFormat:\n" + publicKeyInPemFormat);
// 转换为RSAPublicKey以获取密钥的模数和指数
RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
System.out.println("\nmodulus: " + rsaPublicKey.getModulus() + " \nexponent: " + rsaPublicKey.getPublicExponent());
}
public static String formatPublicKey(byte[] encodedKey) {
final Base64.Encoder encoder = Base64.getMimeEncoder(64, LINE_SEPARATOR.getBytes());
final String encodedText = new String(encoder.encode(encodedKey));
final String prettified_key = X509_PEM_HEADER + LINE_SEPARATOR + encodedText + LINE_SEPARATOR + X509_PEM_FOOTER;
return prettified_key;
}
}
请注意,我仅提供了代码的翻译,不包括其他额外内容。如果您需要进一步的帮助,请随时提问。
英文:
As I mentioned in my comment I do not mean to use a regular string-conversion but a conversion from encoded publicKey to PEM-format.
As you did not publish a sample public key I'm generating a new RSA keypair in my sample code below and convert it into PEM-format with a very simple method. The casting to RSAPublicKey is only good to show the modulus and exponent of the
generated key.
Please keep in mind that the code does not have any exception handling and is for educational purpose only.
You can use the public key as source for node.js key importing with
var publicKey = pki.publicKeyFromPem(pem);
Here are the results:
publicKeyBase64:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApDkozwJFhmpDCW8yIlZMoDLHG0zS+o0hHHQHDNmLgn8AWWSHNsO5LJqhJWAxccc1FbE6LKBgLXDvpSIOyHtvzpmlFdQxK32hj7Bl49BuXhypHX2TShDD44Kgfn6WUM/jr31UagalcZkdhe3KjJqf8mMbhZnUNef+twu+MecfO9ruh3dY8LtrqLz2wS6RGwZHlCEO+bFE8sZseLBtnTWhrqgndtw1GkvwyzGzDWFYSgv90cAYWSxWeRsGawBuKSwryDkMYY/h9EvEK50uKP3UVFUXbnZnyGclF1Fv9X5RkggmhO7Vf3bYA04sEJjZherZhA/xvHEX0xnbLfu0S/8w1QIDAQAB
publicKeyInPemFormat:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApDkozwJFhmpDCW8yIlZM
oDLHG0zS+o0hHHQHDNmLgn8AWWSHNsO5LJqhJWAxccc1FbE6LKBgLXDvpSIOyHtv
zpmlFdQxK32hj7Bl49BuXhypHX2TShDD44Kgfn6WUM/jr31UagalcZkdhe3KjJqf
8mMbhZnUNef+twu+MecfO9ruh3dY8LtrqLz2wS6RGwZHlCEO+bFE8sZseLBtnTWh
rqgndtw1GkvwyzGzDWFYSgv90cAYWSxWeRsGawBuKSwryDkMYY/h9EvEK50uKP3U
VFUXbnZnyGclF1Fv9X5RkggmhO7Vf3bYA04sEJjZherZhA/xvHEX0xnbLfu0S/8w
1QIDAQAB
-----END PUBLIC KEY-----
modulus: 20731268369385753286263425327135051982140722030090056263956156187995595756162638067632049766572173871222899673059402693752671732595103415705071364110163930779801384635600704353948134714995032771402672253081803951568749471153442310395557466672145372102367812045909635515067251201801481045420809949678999367006984696717741160391651530870395354801871215718392636783213332400044611988145616424335265196351536718900512088911138715764629635492725732261535350636958727512114194585140879639939102048063723080960259912864453126601881542413439087477332229964312815604341576075763616064453908632786205270096882928322048256061653
exponent: 65537
code:
import java.security.*;
import java.security.interfaces.RSAPublicKey;
import java.util.Base64;
public class Main {
private static final String X509_PEM_HEADER = "-----BEGIN PUBLIC KEY-----";
private static final String X509_PEM_FOOTER = "-----END PUBLIC KEY-----";
public final static String LINE_SEPARATOR = System.getProperty("line.separator");
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println("RSA Public Key to Node-Forge Public Key");
// rsa key generation
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");
kpGen.initialize(2048, new SecureRandom());
KeyPair keyPair = kpGen.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
String publicKeyBase64 = Base64.getEncoder().encodeToString(publicKey.getEncoded());
System.out.println("publicKeyBase64:\n" + publicKeyBase64);
// encode public key to PEM format
String publicKeyInPemFormat = formatPublicKey(Base64.getDecoder().decode(publicKeyBase64));
System.out.println("\npublicKeyInPemFormat:\n" + publicKeyInPemFormat);
// casting to RSAPublicKey to get the modulus & exponent of the key
RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
System.out.println("\nmodulus: " + rsaPublicKey.getModulus() + " \nexponent: " + rsaPublicKey.getPublicExponent());
}
public static String formatPublicKey(byte[] encodedKey) {
final Base64.Encoder encoder = Base64.getMimeEncoder(64, LINE_SEPARATOR.getBytes());
final String encodedText = new String(encoder.encode(encodedKey));
final String prettified_key = X509_PEM_HEADER + LINE_SEPARATOR + encodedText + LINE_SEPARATOR + X509_PEM_FOOTER;
return prettified_key;
}
}
答案2
得分: 1
const forge = require('node-forge');
const fs = require('fs');
const dataToEncrypt = 'FFAA1A2308991DAE...'; // 十六进制字符串
async function encrypt(dataToEncrypt){
try{
const data = await fs.readFile('x509/certifictate/path/certificate.cer', 'utf8');
const certPem = forge.pki.certificateFromPem(data);
// console.log('public key-----', certPem.publicKey.n.toString(16));
const encryptedData = certPem.publicKey.encrypt(forge.util.hexToBytes(dataToEncrypt), 'RSAES-PKCS1-V1_5');
return forge.util.createBuffer(encryptedData).toHex();
} catch(error){
console.log(error);
}
}
英文:
const forge = require('node-forge');
const fs = require('fs');
const dataToEncrypt = 'FFAA1A2308991DAE...' // Hex string
async function encrypt(dataToEncrypt){
try{
const data = await fs.readFile('x509/certifictate/path/certificate.cer', 'utf8');
const certPem = forge.pki.certificateFromPem(data);
// console.log('public key-----', certPem.publicKey.n.toString(16));
const encryptedData = certPem.publicKey.encrypt(forge.util.hexToBytes(dataToEncrypt), 'RSAES-PKCS1-V1_5');
return forge.util.createBuffer(encryptedData).toHex();
} catch(error){
console.log(error);
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论