求助,用node.js对公钥进行"RSA/ECB/PKCS1Padding"算法加密,我该用哪个模块。
发布于 10 年前 作者 7725916 20707 次浏览 最后一次编辑是 8 年前

本人新手,现遇到个项目,需要进行"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加密,应该调哪个模块,求告知。

8 回复

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

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

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

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

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

@weizhigang 都已经知道是pcks1,对应的就是pcks1啊, 如果无法互通,肯定是你哪里写错了

我这边现在那个公钥(key)是一个纯的字符串,然后加密的java代码如下: /** * 用公钥加密 * @param data 加密数据 * @param key 公钥 * @return 加密后的字节数组 * @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实现同样的加密方式,要怎么做呢,对加密这个不太熟悉,尝试了很多种写法,都不行,请大家指导一下

@weizhigang rsa非对称加密nodejs的crypto模块不支持的,需要用第三方的模块

@weizhigang node-rsa就行,最近刚弄过

回到顶部