繁体   English   中英

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

[英]PHP - Decrypt Encrypted String From Node.js

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

我找到了完善的Nodejs加密/解密库: Cryptr 我已经在JavaScript文件中创建了连接,并向其中的服务器发送了带有加密字符串的请求。

现在基本上我想解密该字符串。

看一下Cryptr源 ,似乎他们使用aes-256-ctr作为算法方法,并使用sha256作为加密方法。

我的Node.js: https ://runkit.com/embed/keu82yjhwyxj

加密的字符串: 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是在Cryptr中随机生成的,我将如何在PHP中生成它?

如何使用PHP解密Cryptr加密的字符串,因此返回“我爱披萨!”?


编辑:

相反,pack('H *',$ encrypted)仅尝试$ encrypted。 另外,您只需要数据,方法和密钥即可解密。

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

$decrypted_data = openssl_decrypt($encrypted, $algorithm, $secret_key);
echo $decrypted_data;

请勿使用CRYPTR。 这是不安全的。 尽管我不确定在不完全重写模块的情况下如何解决该问题 ,但我已经向开发人员提出了一个问题

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

const cryptr = new Cryptr('myTotalySecretKey');

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

console.log(encryptedString); // "bcb23b81c4839d06644792878e569de4f251f08007"

(请注意,加密的字符串的长度甚至与模块用法中显示的长度不同。这是他们文档中的明显错误。)

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

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"

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

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

在传递消息和安全密钥时,您需要传递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会警告您。

我刚刚在GitHub页面上找到了Cryptr。 它说:

iv是随机生成的,并放在结果的前面

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM