簡體   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