如何在 React js 中解密 Laravel Open SSL 加密的文本?

问题描述 投票:0回答:1

我想解密由 laravel 使用 open ssl 加密的文本,这是 laravel 代码

class Encryption
{
    private string $encryptMethod = 'AES-256-CBC';
    private string $key;
    private string $iv;

    public function __construct()
    {
        $mykey = env('MY_ENCRYPTION_KEY');
        $myiv = env('MY_ENCRYPTION_IV');
        $this->key = substr(hash('sha256', $mykey), 0, 32);
        $this->iv = substr(hash('sha256', $myiv), 0, 16);
    }

    public function encrypt(string $value): string
    {
        return openssl_encrypt($value, $this->encryptMethod, $this->key, 0, $this->iv);
    }

    public function decrypt(string $base64Value): string
    {
        return openssl_decrypt($base64Value, $this->encryptMethod, $this->key, 0, $this->iv);
    }
}

我尝试了很多 React 方法,包括使用加密 JS 库,但每次我遇到格式错误的 utf8 时,任何人都可以给我一个 React 函数来解密由 open ssl 提供的文本 谢谢

下面是我的 Reactjs 代码

import React, { useEffect, useState } from 'react';
import CryptoJS from 'crypto-js';

const DecryptText = () => {
  const [decryptedText, setDecryptedText] = useState('');
  const encryptedText = 'knztSH5Icp3imQ9UQ4vdaQ=='; // replace with the encrypted text from Laravel

  useEffect(() => {
    const key = CryptoJS.enc.Hex.parse("com.oneapp.manager");
    const iv = CryptoJS.enc.Hex.parse("com.oneapp.consumer");

    // Decode the Base64-encoded encryptedText
    const decodedEncryptedText = atob(encryptedText);

    // Convert the decoded string to a WordArray
    const decodedWordArray = CryptoJS.enc.Utf8.parse(decodedEncryptedText);

    // Decrypt the WordArray using the key and IV
    const decryptedWordArray = CryptoJS.AES.decrypt(decodedWordArray, key, {
      iv: iv,
      padding: CryptoJS.pad.Pkcs7,
      mode: CryptoJS.mode.CBC,
    });

    // Convert the decrypted WordArray to a string
    const decryptedText = decryptedWordArray.toString(CryptoJS.enc.Utf8);

    setDecryptedText(decryptedText);
  }, [encryptedText]);

  return (
    <div>
      <h1>Decrypted Text:</h1>
      <p>{decryptedText}</p>
    </div>
  );
};

export default DecryptText;
reactjs laravel encryption openssl
1个回答
0
投票

为了与 PHP 代码兼容,在 JavaScript 代码中:

  • 必须生成密钥材料的 SHA256 哈希值,
  • 哈希值必须是十六进制编码,
  • 前 32 个字节将用作密钥。

这同样适用于 IV,即使用前 16 个字节。

此外,密文将以

AES.decrypt()
Objetk 或 Base64 编码的形式传递给
CipherParams

const key = "com.oneapp.manager";
const keySha256Hex = CryptoJS.SHA256(key).toString();
const keyWA = CryptoJS.lib.WordArray.create(CryptoJS.enc.Utf8.parse(keySha256Hex).words.slice(0, 8));

const iv = "com.oneapp.consumer";
const ivSha256Hex = CryptoJS.SHA256(iv).toString();
const ivWA = CryptoJS.lib.WordArray.create(CryptoJS.enc.Utf8.parse(ivSha256Hex).words.slice(0, 8));

const ciphertextB64 = 'knztSH5Icp3imQ9UQ4vdaQ=='; 
const decrypted = CryptoJS.AES.decrypt(ciphertextB64, keyWA, {
    iv: ivWA,
    padding: CryptoJS.pad.Pkcs7,
    mode: CryptoJS.mode.CBC,
});

console.log(decrypted.toString(CryptoJS.enc.Utf8)); // 1412734
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js"></script>

© www.soinside.com 2019 - 2024. All rights reserved.