Nodejs求助,用node.js对公钥进行"RSA/ECB/PKCS1Padding"算法加密,我该用哪个模块。

Nodejs求助,用node.js对公钥进行"RSA/ECB/PKCS1Padding"算法加密,我该用哪个模块。

本人新手,现遇到个项目,需要进行"RSA/ECB/PKCS1Padding"算法加密. java代码如下: public static String encrypt(String source, String publicKey) throws Exception { Key key = getPublicKey(publicKey); /** 得到Cipher对象来实现对源数据的RSA加密 / Cipher cipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] b = source.getBytes(); /* 执行加密操作 */ byte[] b1 = cipher.doFinal(b); return new String(Base64.encodeBase64(b1), UTF-8); } public static PublicKey getPublicKey(String key) throws Exception { X509EncodedKeySpec keySpec = new X509EncodedKeySpec( Base64.decodeBase64(key.getBytes())); KeyFactory keyFactory = KeyFactory.getInstance(“RSA”); PublicKey publicKey = keyFactory.generatePublic(keySpec); return publicKey; } 我该如何将java代码转为为node.js,运用Cipher加密,应该调哪个模块,求告知。


7 回复

要在Node.js中使用RSA/ECB/PKCS1Padding算法加密,可以使用crypto模块。此模块提供了加密、解密、哈希和HMAC等功能。下面是如何将你的Java代码转换为Node.js代码的示例:

首先,确保你已经安装了Node.js环境。

示例代码

const crypto = require('crypto');

function encrypt(source, publicKey) {
    try {
        // 创建公钥对象
        const key = crypto.createPublicKey({
            key: publicKey,
            format: 'pem',
            type: 'spki'
        });

        // 创建Cipher实例
        const cipher = crypto.createCipheriv('RSA/ECB/PKCS1Padding', null, null);

        // 初始化Cipher
        cipher.setPublicKey(key);

        // 加密数据
        let encrypted = cipher.update(source, 'utf8', 'base64');
        encrypted += cipher.final('base64');

        return encrypted;
    } catch (error) {
        console.error("Encryption error:", error);
        throw error;
    }
}

function getPublicKey(encodedKey) {
    try {
        return crypto.createPublicKey({
            key: encodedKey,
            format: 'pem',
            type: 'spki'
        });
    } catch (error) {
        console.error("Failed to create public key:", error);
        throw error;
    }
}

// 使用示例
const source = "Hello World!";
const publicKey = "-----BEGIN PUBLIC KEY-----\n" +
    "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n" + // 替换为实际的公钥
    "-----END PUBLIC KEY-----";

try {
    const encryptedData = encrypt(source, publicKey);
    console.log("Encrypted data:", encryptedData);
} catch (error) {
    console.error("Error during encryption:", error);
}

解释

  1. 创建公钥对象

    • crypto.createPublicKey方法用于从公钥字符串创建一个公钥对象。你需要提供公钥字符串,并指定其格式(如PEM)和类型(如SPKI)。
  2. 创建Cipher实例

    • crypto.createCipheriv方法用于创建一个Cipher实例。这里我们使用'RSA/ECB/PKCS1Padding'作为加密模式。
  3. 初始化Cipher

    • cipher.setPublicKey(key)方法设置公钥对象,以便进行加密操作。
  4. 执行加密操作

    • cipher.update方法用于处理输入数据并返回加密后的部分结果。
    • cipher.final方法用于完成加密过程并返回最终的加密数据。

通过这种方式,你可以将Java中的RSA加密逻辑转换为Node.js代码,实现相同的功能。


nodejs的标准加密模块是crytpo,支持的算法列表只包括aes/des等对称算法,不支持非对称算法rsa,具体可运行下面代码查看。

var crypto=require('crypto');
console.log(crypto.getCiphers());

由已知私密钥匙生成公开钥匙这第一步crypto模块就被判了死刑,因此需要寻找第三方的nodejs模块,例如ursa

你好,现在遇到了与你一样的问题,请问你是解决了吗,是怎么解决的?

这个还是解决不了我的问题啊。那个RSA/ECB/PKCS1Padding对应的java里面的是什么样子的,有没有对照表一类的。

我这边现在那个公钥(key)是一个纯的字符串,然后加密的java代码如下: /** * 用公钥加密 * [@param](/user/param) data 加密数据 * [@param](/user/param) key 公钥 * [@return](/user/return) 加密后的字节数组 * [@throws](/user/throws) Exception 异常 */ public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception { byte[] encryptedData = null;

    //对公钥解密
    byte[] keyBytes = decryptBASE64(key);
    //取公钥
    X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);
    Key publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
//对数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

// 加密时超过maxEncryptBlockSize字节就报错。为此采用分段加密的办法来加密
int maxEncryptBlockSize = getMaxEncryptBlockSize(keyFactory, publicKey);

ByteArrayOutputStream bout = new ByteArrayOutputStream();
try {
    int dataLength = data.length;
    for (int i = 0; i < data.length; i += maxEncryptBlockSize) {
        int encryptLength = dataLength - i < maxEncryptBlockSize ? dataLength - i
            : maxEncryptBlockSize;
        byte[] doFinal = cipher.doFinal(data, i, encryptLength);
        bout.write(doFinal);
    }
    encryptedData = bout.toByteArray();
} finally {
    if (bout != null) {
        bout.close();
    }
}
return encryptedData;

} 我想要用node实现同样的加密方式,要怎么做呢,对加密这个不太熟悉,尝试了很多种写法,都不行,请大家指导一下

在Node.js中,可以使用crypto模块来进行RSA加密。针对你的需求(即使用RSA/ECB/PKCS1Padding算法),你可以使用该模块中的createCipheriv方法。以下是一个示例代码,展示如何从Java代码转换到Node.js。

示例代码

首先,你需要安装一个处理Base64编码的库,例如@supercharge/b64(用于编码和解码):

npm install @supercharge/b64

然后,你可以使用以下Node.js代码:

const crypto = require('crypto');
const { encode, decode } = require('@supercharge/b64');

function encrypt(source, publicKey) {
    const key = crypto.createPublicKey(publicKey);

    // 创建一个RSA/ECB/PKCS1Padding的Cipher实例
    const cipher = crypto.createCipheriv('RSA/ECB/PKCS1PADDING', key, '');
    
    let encrypted = cipher.update(source, 'utf8', 'base64');
    encrypted += cipher.final('base64');
    
    return encrypted;
}

function getPublicKey(base64EncodedKey) {
    return Buffer.from(base64EncodedKey, 'base64');
}

// 使用示例
const source = "Hello, World!";
const base64EncodedPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."; // 请替换为实际的公钥

const publicKey = getPublicKey(base64EncodedPublicKey);
const encrypted = encrypt(source, publicKey);

console.log("Encrypted data:", encrypted);

解释

  • 创建公钥getPublicKey 函数用于解析Base64编码的公钥字符串,并将其转换为Node.js能识别的格式。
  • 加密过程encrypt 函数使用crypto.createCipheriv 创建了一个Cipher实例,指定了加密算法'RSA/ECB/PKCS1PADDING'
  • 更新与最终化cipher.update 方法用于逐步添加明文数据并立即返回部分加密的结果。cipher.final 方法用于完成加密过程并返回剩余的加密结果。

确保你已经安装了必要的依赖包,并且公钥是有效的。

回到顶部