节点使用私钥和填充来解密内容

时间:2017-11-15 11:25:28

标签: node.js encryption aes rsa node-crypto

所以,我有一个内容需要使用私钥和填充AES/ECB/PKCS5Padding进行解密。

我尝试了很多库和许多示例,但没有一个可行。现在,这是我设法完成最后一步的那个,但我不确定是否有另一个库可以为我做这个。

var absolutePath = path.resolve('./private.txt');
    var privateKey = fs.readFileSync(absolutePath, "utf8");
    var buffer = new Buffer(toDecrypt, "base64");
    var decrypted = crypto.privateDecrypt(privateKey, buffer);
    return decrypted.toString("utf8");

这个引发了我的错误:

0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 

第二个例子,与第一个例子不同,但是使用填充(这就是我需要的东西,我只想在没有它的情况下尝试看它是否有效):

var stringKey = 'BEGIN RSA PRIVATE KEY-----....';
    var cipherText = 'ENCRYPTEDTEXT';

    // we compute the sha256 of the key
    var hash = crypto.createHash("sha256");
    hash.update(stringKey, "utf8");
    var sha256key = hash.digest();
    var keyBuffer = new Buffer(sha256key);

    var cipherBuffer = new Buffer(cipherText, 'hex');
    var aesDec = crypto.createDecipheriv("aes-256-ecb", keyBuffer, ''); // always use createDecipheriv when the key is passed as raw bytes
    var output = aesDec.update(cipherBuffer, 'binary', 'binary');
    var final = aesDec.final();
    return output + final;

它在var final = aesDec.final()行崩溃并抛出错误:

digital envelope routines:EVP_DecryptFinal_ex:wrong final block length

有没有人知道如何做到这一点?

1 个答案:

答案 0 :(得分:2)

我们有类似的问题。

我们从api收到加密的base 64字符串,需要解密aes密钥,然后,使用解密的aes密钥,我们需要解密有效负载。

我们做了什么:

  1. var bytes = new Buffer(input, 'base64');这是来自服务器的加密数据

  2. var aes = bytes.slice(offset, offset + AES_SIZE);切片字节数组获取aes

    var aesString = aes.toString('binary');将其转换为二进制字符串

  3. 使用伪造库:

  4. var forge = require('node-forge');

    var pki = require('node-forge').pki;
    
    
    
    
     // Grab private key from file
                                        var absolutePath = path.resolve('../private-key.txt');
                                        var privateKey = fs.readFileSync(absolutePath, "utf8");
    
         // Generate private key object
                                        var private_key = pki.privateKeyFromPem(privateKey);
                                        var result;
    
                                        // Decrypt aes key with private key
                                        try {
                                            result = private_key.decrypt(api.apiSecret, 'RSA-OAEP', {
                                                md: forge.md.sha1.create(),
                                                mgf1: {
                                                    md: forge.md.sha1.create()
                                                }
                                            });
                                        } catch (err) {
                                            console.error(err.message);
                                            return;
                                        }
    
    
    // Build byte array from aes key
                                    var base = new Buffer(result, 'binary');
    
                                    // Generate initialization vector
                                    var iv = forge.random.getBytesSync(api.content.length);
    
                                    // Create decipher object with AES/ECB/PKCS5 padding
                                    var decipher = forge.cipher.createDecipher('AES-ECB', forge.util.createBuffer(base));
                                    decipher.start({ iv: iv });
                                    // Add content for decrypting
                                    decipher.update(forge.util.createBuffer(api.content));
                                    var result = decipher.finish();
                                    // Get json data from decipher object
                                    var data = decipher.output.data;