【问题标题】:Node decrypt content with private key and padding节点使用私钥和填充解密内容
【发布时间】:2018-04-28 14:32:36
【问题描述】:

所以,我有一个内容需要用私钥和填充 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

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

【问题讨论】:

  • 密码测试 'ENCRYPTEDTEXT' 不是有效的密文,因此很可能抛出异常。你期待什么?
  • 采用 ECB 模式的 AES 要求加密数据是块大小的倍数,AES 为 16 字节。
  • 您在问题开始时提到了 PKCS5 填充,但正如 zaph 所提到的,您实际上并没有应用任何填充。我也很困惑为什么您要尝试使用 RSA 私钥的 SHA256 作为对称加密密钥。此外,您似乎使用的是空 IV,这意味着此代码容易受到密钥重用攻击。也没有应用真实性记录,因此由于使用带有填充的 CBC 模式,它很容易受到延展性攻击和填充预言问题。

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


【解决方案1】:

我们有类似的问题。

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

我们做了什么:

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

var aes = bytes.slice(offset, offset + AES_SIZE);切片字节数组得到aes

`var aesString = aes.toString('binary');` convert it to binary string
  1. 使用伪造库:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2017-07-07
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    相关资源
    最近更新 更多