Открытый ключ RSA к узлу-подделать открытый ключ

#java #node.js #node-modules #public-key-encryption #forge

#ява #node.js #узлы-модули #шифрование с открытым ключом #подделать #java #модули узла

Вопрос:

Мне нужна помощь с кодом NodeJS. Я собираюсь написать код nodejs для приведенного ниже JAVA-кода.

 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"));
  

Я пытался использовать «Forge», но не знаю, как преобразовать данный открытый ключ RSA в открытый ключ Forge.
Кто-нибудь может мне помочь с этим?

Комментарии:

1. Добро пожаловать в Stackoverflow. Я бы написал открытый ключ на стороне Java в PEM-форме («—— НАЧАТЬ ОТКРЫТЫЙ КЛЮЧ — …»), отправил эту строку в node.js и с помощью forge перестроить общедоступный ключ с помощью «var publicKey = pki.publicKeyFromPem (pem);».

2. Спасибо @MichaelFehr. Я уже пробовал это. Но модуль получения не такой, как в Java. System.out.println(publicKey); В NodeJS я попробовал var publicKeyFromPem = pki.publicKeyFromPem(pemPublicKey); console.log(publicKeyFromPem.n.toString(16)); Получая разные результаты,

Ответ №1:

Как я упоминал в своем комментарии, я имею в виду не обычное преобразование строк, а преобразование из закодированного publicKey в PEM-формат.

Поскольку вы не опубликовали образец открытого ключа, я создаю новую пару ключей RSA в моем примере кода ниже и конвертирую его в PEM-формат с помощью очень простого метода. Приведение к RSAPublicKey полезно только для отображения модуля и показателя сгенерированного ключа.

Пожалуйста, имейте в виду, что код не имеет никакой обработки исключений и предназначен только для образовательных целей.

Вы можете использовать открытый ключ в качестве источника для node.js импорт ключа с помощью

 var publicKey = pki.publicKeyFromPem(pem);
  

Вот результаты:

 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
  

код:

 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 amp; 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;
    }
}
  

Комментарии:

1. Извините, я хочу реализовать это в NodeJS. Java-код, который я опубликовал, работает нормально. Мне нужен аналогичный код в NodeJS / Angular

2. @Bhargav Gollamudi: я не понимаю вашей проблемы «преобразовать данный открытый ключ RSA в открытый ключ Forge». В моем ответе есть данный открытый ключ RSA в формате PEM и с «var publicKey = pki.publicKeyFromPem (pem);» вы получаете открытый ключ вашего узла. Итак, какой код вам нужен и что вы уже написали и с чем боретесь?

Ответ №2:

     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);
      }
    }