Encryption 从php加密时,文件解密在节点中不起作用

Encryption 从php加密时,文件解密在节点中不起作用,encryption,openssl,cryptography,aes,cryptojs,Encryption,Openssl,Cryptography,Aes,Cryptojs,问题终于解决了,你可以在下面看到我的答案 从php加密时,文件解密在节点中不起作用 要加密的PHP代码 <?php $key = "f9036c20bdb656106fd176d260878c63"; $iv = "7152201381f54b46"; exec('openssl enc -aes-256-cbc -K '.$key.' -iv '.$iv.' -in a.txt -out b.txt'); exec('openssl enc -d -aes-256-c

问题终于解决了,你可以在下面看到我的答案 从php加密时,文件解密在节点中不起作用 要加密的PHP代码

<?php

$key = "f9036c20bdb656106fd176d260878c63";
$iv = "7152201381f54b46";




exec('openssl enc -aes-256-cbc   -K '.$key.' -iv '.$iv.' -in a.txt -out b.txt');



exec('openssl enc -d -aes-256-cbc  -K '.$key.' -iv '.$iv.' -in b.txt -out outr.txt');
?>
也尝试过加密,但运气不好

    const crypto = require('crypto');
const fs = require('fs');

var secret = "f9036c20bdb656106fd176d260878c63";
const buf_secret = Buffer.from(secret);

var iv = "7152201381f54b46";
const buf_iv = Buffer.from(iv);


const decipher = crypto.createCipheriv('aes-256-cbc', buf_secret, buf_iv);
decipher.setAutoPadding(true);
fs.readFile('../b.txt', function (err, data) {
    if (err) {
        return console.log(err);
    }
    const buf_data = Buffer.from(data);
    console.log(buf_data);
    let decrypted = decipher.update(buf_data, 'utf8');
    decrypted += decipher.final('utf8');
    console.log(decrypted);

});

我肯定有一些填充问题,有人能指出它有什么错误吗?

问题解决了。问题是PHP openssl接受密钥和iv作为十六进制。对于openssl256,密钥长度应该是64,iv长度应该是32,但是在PHP中,密钥长度是32,iv长度是16,这对于openssl128来说,所以PHP添加了尾随的零。在JS中,添加尾随零并将其视为十六进制后,其工作状态良好

const crypto = require('crypto');
const fs = require('fs');
const key_size = 64;
const iv_size = 32;

var secret = "f9036c20bdb656106fd176d260878c63";
secret = pad(secret,key_size,"0"); //pad with trailing zeros

const buf_secret = Buffer.from(secret,'hex');

var iv = "7152201381f54b46";
iv = pad(iv,iv_size,"0");//pad with trailing zeros

const buf_iv = Buffer.from(iv,'hex');



const decipher = crypto.createDecipheriv('aes-256-cbc', buf_secret, buf_iv);
decipher.setAutoPadding(true);

const input = fs.createReadStream('../b.txt');
const output = fs.createWriteStream('../decrypted.txt');

input.pipe(decipher).pipe(output);

//content if you want instead of direct writing
//fs.readFile('../b.txt', function (err, data) {
//    if (err) {
//        return console.log(err);
//    }
//    const buf_data = Buffer.from(data);
//    console.log(buf_data);
//    let decrypted = decipher.update(buf_data, 'utf8');
//    decrypted += decipher.final('utf8');
//    console.log(decrypted);
//
//});

//for padding trailing zeros
function pad(value, width, padchar) {

    while (value.length < width) {
        value += padchar;
    }
    return value;
}
const crypto=require('crypto');
常数fs=要求('fs');
const key_size=64;
常数iv_大小=32;
var secret=“f9036c20bdb656106fd176d260878c63”;
机密=键盘(机密,按键大小,“0”)//带尾随零的pad
const buf_secret=Buffer.from(secret,'hex');
var iv=“7152201381f54b46”;
iv=衬垫(iv,iv_尺寸,“0”)//带尾随零的pad
const buf_iv=缓冲区,从(iv,'hex');
const decipher=crypto.createDecipheriv('aes-256-cbc',buf_secret,buf_iv);
解密。设置自动添加(true);
const input=fs.createReadStream('../b.txt');
const output=fs.createWriteStream('../decrypted.txt');
输入。管道(解密)。管道(输出);
//内容,如果你想,而不是直接写
//fs.readFile('../b.txt',函数(err,data){
//如果(错误){
//返回console.log(err);
//    }
//const buf_data=缓冲区from(数据);
//控制台日志(buf_数据);
//let decrypted=decipher.update(buf_数据,'utf8');
//解密+=最终解密('utf8');
//console.log(解密);
//
//});
//用于填充尾随零
功能板(值、宽度、padchar){
while(value.length
您的密钥只有128位,而您的IV是64位,这两个都是错误的<代码>openssl enc-K-iv带零的焊盘;我不知道两个JS都做什么。同样在第二个例子中,看起来你声称你的密文是base64,而实际上不是,尽管我认为这会引发一些错误,而且加密没有填充,这将导致你的输出包含添加的垃圾,这些垃圾可能不可见,这取决于你的外观。@dave_thompson_085我已经修复了它,问题是PHP openssl接受密钥和iv作为十六进制。对于openssl256,密钥长度应该是64,iv长度应该是32,但是在PHP中,密钥长度是32,iv长度是16,这对于openssl128来说,所以PHP添加了尾随的零。在JS中,在添加尾随零并将其视为十六进制之后,其工作状态良好。确切地说,PHP只需将(十六进制)字符串传递给
openssl
;正是
openssl
从十六进制转换而来,发现它们太短,并且填充。但同样的结果。
const crypto = require('crypto');
const fs = require('fs');
const key_size = 64;
const iv_size = 32;

var secret = "f9036c20bdb656106fd176d260878c63";
secret = pad(secret,key_size,"0"); //pad with trailing zeros

const buf_secret = Buffer.from(secret,'hex');

var iv = "7152201381f54b46";
iv = pad(iv,iv_size,"0");//pad with trailing zeros

const buf_iv = Buffer.from(iv,'hex');



const decipher = crypto.createDecipheriv('aes-256-cbc', buf_secret, buf_iv);
decipher.setAutoPadding(true);

const input = fs.createReadStream('../b.txt');
const output = fs.createWriteStream('../decrypted.txt');

input.pipe(decipher).pipe(output);

//content if you want instead of direct writing
//fs.readFile('../b.txt', function (err, data) {
//    if (err) {
//        return console.log(err);
//    }
//    const buf_data = Buffer.from(data);
//    console.log(buf_data);
//    let decrypted = decipher.update(buf_data, 'utf8');
//    decrypted += decipher.final('utf8');
//    console.log(decrypted);
//
//});

//for padding trailing zeros
function pad(value, width, padchar) {

    while (value.length < width) {
        value += padchar;
    }
    return value;
}