簡體   English   中英

Node.js 加密庫從 PHP opensll_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM