![](/img/trans.png)
[英]Node.js `crypto.final` make the encrypted result is different to PHP `mcrypt_encrypt`
[英]Node.js Crypto lib returning different result from PHP opensll_encrypt lib
我的問題如下:
我有一個 PHP 腳本,負責使用 AES-256-CBC 加密對字符串進行加密。 此腳本使用 openssl 庫並返回 X 結果。
<?php
class AES
{
const PRIVATE_KEY = 'abcdefghijklmnnoabcdefghijklmnno';
const ENCRYPT_METHOD = 'aes-256-cbc';
const VECTOR = 'abcdefghijklmnno';
public function encryptData($data)
{
while(strlen($data) < 16) $data .= "\0";
return openssl_encrypt($data, self::ENCRYPT_METHOD, self::PRIVATE_KEY, OPENSSL_ZERO_PADDING, self::VECTOR);
}
public function encryptDataL($data)
{
return openssl_encrypt($data, self::ENCRYPT_METHOD, self::PRIVATE_KEY, 0, self::VECTOR);
}
public function decryptData($data)
{
return openssl_decrypt($data, self::ENCRYPT_METHOD, self::PRIVATE_KEY, OPENSSL_ZERO_PADDING, self::VECTOR);
}
}
$aes = new AES();
echo $aes->encryptData("abcdefghijkl");
echo "\n";
echo $aes->encryptDataL("{\"REQUEST\": [{\"MSISDN\": \"32156489721\",\"IDPRODUCT\": 123,\"IDOPERATOR\": 12345,\"OUTPUTFORMAT\": \"JSON\"}],\"OUTPUTFORMAT\": \"json\"}");
?>
當我運行一個 JS 腳本時,負責做同樣的事情,但是使用 Crypto lib,得到的結果與之前的 X 不同。
const crypto = require('crypto');
const cipher = crypto.createCipheriv('aes-256-cbc', 'abcdefghijklmnnoabcdefghijklmnno', 'abcdefghijklmnno');
let crypted = cipher.update(data, 'utf8', 'base64');
crypted += cipher.final('base64');
腳本的結果不同,盡管理論上加密應該是相同的。
返回示例如下:
對於 php 腳本:輸入 -> ^y3Hk3JKGGgA輸出 -> eTqD5Op389QS/TOoui5kAQ==
對於 js 腳本:輸入 -> ^y3Hk3JKGGgA輸出 -> HHfskOE1N+QxdGt9MTai5A==
想要的結果是 PHP 腳本,但我需要在 JS 中運行代碼,有人可以向我解釋我可能做錯了什么嗎?
我嘗試了不同的方式來執行createCipheriv方法,但是都返回相同的結果(和我需要的不同,是通過PHP腳本得到的結果)
先感謝您。
謝謝你們的幫助,確實我發布的問題缺少一些信息(實際上在提出問題時我沒有我需要的所有信息)。
但是在這里發布一些事實和我的案例遇到的解決方案。
上述情況中的不同結果僅發生在第一個 PHP 函數(“encryptData”),負責加密小文本。 第二個,負責加密大文本(超過 16 位),在 PHP 和 JS 腳本中都運行良好。
我遇到的解決方案是自己制作 AES-256 算法所需的填充。 Crypto lib 提供的填充功能不起作用,至少對我而言是這樣。
所以我在我的 cypher 類中禁用了填充,並確保發送要加密的數據被正確填充,直到長度是 16 的倍數。最后的代碼如下。
encryptWithAES256(data) {
// added padding until data length is multiple of 16
let paddedData = data;
while (paddedData.length % 16 !== 0) {
paddedData += '\0';
}
// ciphers data
const cipher = crypto.createCipheriv('aes-256-cbc', encodeKey, IV);
cipher.setAutoPadding(false);
let crypted = cipher.update(paddedData, 'utf8', 'base64');
crypted += cipher.final('base64');
return crypted;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.