我想解密由 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;
为了与 PHP 代码兼容,在 JavaScript 代码中:
这同样适用于 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>