Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-解密Node.js中的加密字符串_Php_Node.js_Encryption - Fatal编程技术网

PHP-解密Node.js中的加密字符串

PHP-解密Node.js中的加密字符串,php,node.js,encryption,Php,Node.js,Encryption,我想使用传递给服务器的PHP解密加密字符串(在Nodejs中加密) 我找到了完美的Nodejs加密/解密库:。我在JavaScript文件中创建了一个连接,向服务器发送一个包含加密字符串的请求 现在我想解密这个字符串 看一下,他们似乎使用了aes-256-ctr作为算法方法,而sha256作为加密方法 我的点头: 加密字符串:1d510024ad0a5da624b76a2be72022bff3aaadfe8ac5e0b6c178b00333 然后我在PHP中执行此操作: <?php $en

我想使用传递给服务器的PHP解密加密字符串(在Nodejs中加密)

我找到了完美的Nodejs加密/解密库:。我在JavaScript文件中创建了一个连接,向服务器发送一个包含加密字符串的请求

现在我想解密这个字符串

看一下,他们似乎使用了
aes-256-ctr
作为算法方法,而
sha256
作为加密方法

我的点头:

加密字符串:
1d510024ad0a5da624b76a2be72022bff3aaadfe8ac5e0b6c178b00333

然后我在PHP中执行此操作:

<?php
$encrypted = "1d510024ad0a5da624b76a2be72022bff3aaadfe8ac5e0b6c178b00333";
$algorithm = "aes-256-ctr";
$secret_key = "myTotalySecretKey"; 
$iv = "";

$decrypted_data = openssl_decrypt(pack('H*', $encrypted), $algorithm, $secret_key, OPENSSL_RAW_DATA, $iv);
echo $decrypted_data;

传递消息和安全密钥时需要传递IV

所以我没做什么测试

$encrypted = openssl_encrypt("test", "aes-256-ctr", "123", 0, "aaaaaaaaaaaaaaaa");
$algorithm = "aes-256-ctr";
$secret_key = "123"; 
$iv = "";

$decrypted_data = openssl_decrypt($encrypted, $algorithm, $secret_key, 0, "aaaaaaaaaaaaaaaa");
echo $decrypted_data;
它是有效的。 是的,它是随机生成的,但是您可以并且必须将它(作为加密消息)传递给服务器

我不确定IV参数的用途是什么,但如果IV参数为空,PHP会向您发出警告

我刚刚在Cryptor的GitHub页面上找到了这个。它说:

iv是随机生成的,并在结果前加上前缀


不要使用cryptor。它不安全。对于开发人员,虽然我不确定如何在不完全重写模块的情况下修复它

Cryptor使用CTR加密模式。此模式是为特定用例设计的,不能抵抗延展性攻击。如果已知任何加密消息的内容,则可以将该消息转换为任何其他消息。例如,给定使用示例中的加密字符串:

const cryptr = new Cryptr('myTotalySecretKey');

const encryptedString = cryptr.encrypt('bacon');
const decryptedString = cryptr.decrypt(encryptedString);

console.log(encryptedString); // "bcb23b81c4839d06644792878e569de4f251f08007"
(请注意,加密字符串的长度甚至与模块用法中显示的长度不一样。这在他们的文档中是一个明显的错误。)

在不知道密钥的情况下,可以修改此字符串使其解密为“hello”:

从密码学的角度来看,这真是一件大事。攻击者刚刚修改了传输中的加密邮件,而您无法检测到它


不要使用此模块。如果您需要便携式加密,请使用;Node和PHP都有可用的绑定。

您的代码是否正常工作,或者有什么问题?不是clear@SilvioCro它不起作用。问题:我不确定如何在PHP中解密Nodejs的Cryptor依赖项生成的字符串。我取消了删除答案。我编辑了我的问题,并根据这个答案添加了编辑过的PHP代码。它似乎没有解密字符串。谢谢您的示例。由于某些原因,我仍然无法真正让它与我问题中的示例一起工作。你能用问题中的代码试试吗?从客户端向服务器发送加密消息和密钥的代码在哪里?在不知道生成加密消息时,你无法解密它。这基本上回答了我的问题。看来我的代码和这个加密库不适合我想要实现的。我明白了,谢谢你提醒我。加密数据基本上是API中所需的用户名,因此无法利用API。我一直在寻找一个好的解决方案,但找不到。您提到的库,我可以从Nodejs传递加密的信息并用PHP解密吗?如果您正在实现一个通过HTTP运行的API,您应该使用HTTPS(并且只有HTTPS)来保护通信。没有理由在上面使用其他任何东西。因此,发送GET请求
api.php?username=Test&removePoints=100
(这会删除用户余额)比HTTPS安全100%?不,POST requestGot。但是如果其他人有API url,他们可能会发送一个虚假的POST请求,并让API从其他用户处删除点,对吗?
const cryptr = new Cryptr('myTotalySecretKey');

const encryptedString = cryptr.encrypt('bacon');
const decryptedString = cryptr.decrypt(encryptedString);

console.log(encryptedString); // "bcb23b81c4839d06644792878e569de4f251f08007"
var tmp = Buffer.from(encryptedString, "hex");
var b1 = Buffer.from("bacon"), b2 = Buffer.from("hello");
for (var i = 0; i < b1.length; i++) {
    tmp[i + 16] ^= b1[i] ^ b2[i];
}
var ep = tmp.toString("hex");
console.log(ep); // "bcb23b81c4839d06644792878e569de4f855ff8306"
var dp = cryptr.decrypt(ep);
console.log(dp); // "hello"