当前位置: 首页 > 知识库问答 >
问题:

laravel - vue使用cryptojs加密 lumen使用aes解密,但失败了,有代码,如何解决?

万俟超
2024-02-11
    function decrypt($encryptedData, $key,$iv) {        $decryptedData = openssl_decrypt(            base64_decode($encryptedData),            'AES-128-CBC',            $key,            OPENSSL_RAW_DATA,            $iv        );        if ($decryptedData === false) {            echo 'failed';        }        return $decryptedData;    }

vuejs方法

export function encryptionValue(value, key = 'E7D9B13077291073041EE0AD54EAD975', iv = '0000000000000000') {    value = value.toString()    key = CryptoJS.enc.Utf8.parse(key)    iv = CryptoJS.enc.Utf8.parse(iv)    const encrypted = CryptoJS.AES.encrypt(value, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });    return encrypted.toString()}

共有1个答案

柯凯旋
2024-02-11

根据提供的代码,问题可能出现在以下几个方面:

  1. 字符编码问题:在VueJS方法中,value 被转换为字符串,但在Lumen方法中,没有显式地进行这个操作。请确保在两个地方都使用了相同的字符编码。
  2. 加密算法和模式问题:VueJS使用的是AES,而Lumen使用的是'AES-128-CBC'。虽然两者都使用了AES,但是具体的模式可能会有一些差别。请确保在VueJS中也使用'AES-128-CBC'作为模式。
  3. 初始化向量(IV)的问题:请确保VueJS和Lumen都使用相同的初始化向量(IV)。在提供的代码中,VueJS和Lumen都使用了相同的IV('0000000000000000'),这是正确的。
  4. 密钥长度问题:请确保VueJS和Lumen都使用相同长度的密钥。在提供的代码中,密钥长度为256位,这是正确的。
  5. 错误处理:在Lumen的decrypt方法中,如果解密失败,会输出'failed'。请确保在调用这个方法时正确处理了错误。

综上所述,以下是VueJS和Lumen的修正代码:

VueJS方法:

export function encryptionValue(value, key = 'E7D9B13077291073041EE0AD54EAD975', iv = '0000000000000000') {    const keyHex = CryptoJS.enc.Utf8.parse(key);    const ivHex = CryptoJS.enc.Utf8.parse(iv);    const encrypted = CryptoJS.AES.encrypt(value, keyHex, {         iv: ivHex,         mode: CryptoJS.mode.CBC,         padding: CryptoJS.pad.Pkcs7     });    return encrypted.toString();}

Lumen方法:

function decrypt($encryptedData, $key, $iv) {    $decryptedData = openssl_decrypt(        base64_decode($encryptedData),        'aes-128-cbc', // 注意这里使用的是 'aes-128-cbc' 而不是 'AES-128-CBC'        $key,        OPENSSL_RAW_DATA,        $iv    );    if ($decryptedData === false) {        // 这里可以进一步处理错误,例如输出错误信息或者抛出异常等。        echo 'failed';    } else {        return $decryptedData;    }}

请注意,这些修改只是基于提供的代码进行的推测。如果仍然存在问题,可能需要进一步检查代码的其他部分,或者考虑使用专门的工具或库来进行加密和解密操作,以确保兼容性和安全性。

 类似资料:
  • 在我的jsfiddle中查看我失败的尝试或在这里查看: 知道为什么解密失败了吗?

  • 因此,这种特殊的异常非常常见,但我的问题与通常被问到的略有不同。 我有一个AES解密和加密函数,定义如下: 现在,如果我像这样执行单个解密: 字节数组输出很好。而如果我执行双重加密/解密: 我得到了著名的<code>javax.crypto。BadPaddingException:给定的最终块未正确填充异常。请注意,和只是整数(假设它们都是0)。目前,IVBytes只是一个大小为16的空字节数组,

  • 我使用JavaAPI生成128bit密钥。下面是我使用的算法: 我可以通过这些方法轻松地使用secretKey加密和解密消息。由于Java默认使用128bit AES加密,因此它使用SHA1生成原始密钥的哈希,并将哈希的前16字节用作AES中的密钥。然后以十六进制格式转储IV和密文。 但是,它返回一个空字符串。

  • 我之所以问这个问题,是因为两天来我读了很多关于crypto AES加密的帖子,就在我以为我得到了它的时候,我意识到我根本没有得到它。 这个帖子是最接近我的问题,我有完全相同的问题,但它没有得到回答: CryptoJS AES加密与JAVA AES解密值不匹配 我得到的是已经加密的字符串(我得到的代码只是为了看看他们是怎么做的),所以修改加密方式不是一个选项。这就是为什么所有类似的问题对我来说都不是

  • 注意:这只是为个人使用和学习,我不是试图滚动我自己的加密为公众使用。 我需要AES256加密一个字符串,但是我当前的尝试在十六进制解码时最终得到了一个类似server side的字符串。当十六进制解码时,它应该是一个有效的utf8 base64字符串,然后可以将其解码为原始字符串。这与这里提供的解决方案类似,但是salt并不是实际问题(尽管答案被接受),并且我无法在使用之前通过十六进制解码iv来抑

  • 我有一些问题,解密文本的CryptoJS已经用Java加密。解密应使用AES/CBC/PKCS5Padding完成。加密的字符串是base64编码的,我在尝试解密字符串之前对其进行解码。 这就是Java代码的样子: