javascript 为什么我在crypto-js上得到畸形的UTF-8数据错误?

jjhzyzn0  于 2023-04-10  发布在  Java
关注(0)|答案(9)|浏览(475)

我尝试使用crypto-js加密和解密这个字符串:

const str = `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI1ZDg5MjMxMjc5OTkxYjJhNGMwMjdjMGIiLCJoc2giOiIkMmEkMTMkWk53Y0cubjdRZFIybDA3S1RHd2RoLlN0QksudW5GSFVGLkZnZ0tQTGlUV2pOVEFqVy9SMm0iLCJncmFudCI6ImFjY2VzcyIsImlhdCI6MTU2OTI2ODUwMiwiZXhwIjoxNjAwODI2MTAyfQ.PQcCoF9d25bBqr1U4IhJbylpnKTYiad3NjCh_LvMfLE~3~null~undefined~434ce0149ce42606d8746bd9`;

但我得到了一个错误:

Error: Malformed UTF-8 data

我做错了什么?我该怎么弥补?
完整代码also on stackbliz

import crypto from 'crypto-js';

const str = `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI1ZDg5MjMxMjc5OTkxYjJhNGMwMjdjMGIiLCJoc2giOiIkMmEkMTMkWk53Y0cubjdRZFIybDA3S1RHd2RoLlN0QksudW5GSFVGLkZnZ0tQTGlUV2pOVEFqVy9SMm0iLCJncmFudCI6ImFjY2VzcyIsImlhdCI6MTU2OTI2ODUwMiwiZXhwIjoxNjAwODI2MTAyfQ.PQcCoF9d25bBqr1U4IhJbylpnKTYiad3NjCh_LvMfLE~9~null~undefined~434ce0149ce42606d8746bd9`;

const cryptoInfo = crypto.AES.encrypt(str, 'secret').toString();

console.log({ cryptoInfo });
const info2 = crypto.AES.decrypt(str, 'secret').toString(crypto.enc.Utf8);

console.log({ info2 });
ix0qys7i

ix0qys7i1#

不知道为什么,但是你必须用对象 Package 你的字符串,并使用JSON.stringify才能使它工作。
这里:

import crypto from 'crypto-js';

    const str = `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI1ZDg5MjMxMjc5OTkxYjJhNGMwMjdjMGIiLCJoc2giOiIkMmEkMTMkWk53Y0cubjdRZFIybDA3S1RHd2RoLlN0QksudW5GSFVGLkZnZ0tQTGlUV2pOVEFqVy9SMm0iLCJncmFudCI6ImFjY2VzcyIsImlhdCI6MTU2OTI2ODUwMiwiZXhwIjoxNjAwODI2MTAyfQ.PQcCoF9d25bBqr1U4IhJbylpnKTYiad3NjCh_LvMfLE~9~null~undefined~434ce0149ce42606d8746bd9`;

    const cryptoInfo = crypto.AES.encrypt(JSON.stringify({ str }), 'secret').toString();

    console.log({ cryptoInfo });
    const info2 = crypto.AES.decrypt(cryptoInfo, 'secret').toString(crypto.enc.Utf8);

    console.log({ info2 });

    const info3 = JSON.parse(info2);

    console.log({ str: info3.str });
axzmvihb

axzmvihb2#

我加密了一个名字并将其作为URL参数传递。我感到惊讶的是,解密代码不起作用,这是因为加密参数中生成的“+”字符。然后使用“encodeURIComponent”和“decodeURIComponent”它起作用了。

<script>
jQuery("#myBtn").click(function(){
    var clientname= jQuery("#myInput").val();
    var encrypted  = CryptoJS.AES.encrypt(clientname, "secret key 123");
    //my URL to call with encrypted client name
    jQuery("#output").append('<small id="myurl">https://www.xxxxx.com/?id='+encodeURIComponent(encrypted)+"</small>");
});
</script>  


var urlParams = new URLSearchParams(window.location.search);
var crypted_param = decodeURIComponent(urlParams.get('id'));
if(crypted_param && crypted_param != null && crypted_param != "" && crypted_param != "null"){   
    var decrypted = CryptoJS.AES.decrypt(crypted_param, "secret key 123");
    jQuery('#output1').val(decrypted.toString(CryptoJS.enc.Utf8));
}
v8wbuo2f

v8wbuo2f3#

您忘记将加密文本作为参数传递给decrypt函数。

**在decrypt函数中,您正在传递原始字符串,即'str'**这导致了上面代码中的问题,这里是正确的代码。

import crypto from "crypto-js";

const str = `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI1ZDg5MjMxMjc5OTkxYjJhNGMwMjdjMGIiLCJoc2giOiIkMmEkMTMkWk53Y0cubjdRZFIybDA3S1RHd2RoLlN0QksudW5GSFVGLkZnZ0tQTGlUV2pOVEFqVy9SMm0iLCJncmFudCI6ImFjY2VzcyIsImlhdCI6MTU2OTI2ODUwMiwiZXhwIjoxNjAwODI2MTAyfQ.PQcCoF9d25bBqr1U4IhJbylpnKTYiad3NjCh_LvMfLE~9~null~undefined~434ce0149ce42606d8746bd9`;

const cryptoInfo = crypto.AES.encrypt(JSON.stringify(str), "secret");

console.log({cryptoInfo});

const info2 = crypto.AES.decrypt(cryptoInfo.toString(), 'secret').toString(crypto.enc.Utf8);

console.log({ info2 });
fruv7luv

fruv7luv4#

尽管有以上建议,但请检查您的加密密钥密钥,解密时加密密钥应与您加密时使用的加密密钥匹配。

frebpwbc

frebpwbc5#

export function encryptTheValue(word, key = 'yourkey') {
  const encJson = CryptoJS.AES.encrypt(JSON.stringify(word), key).toString();
  const encData = CryptoJS.enc.Base64.stringify(
    CryptoJS.enc.Utf8.parse(encJson)
  );
  return encData;
}

export function decryptTheValue(word, key = 'yourkey') {
  const decData = CryptoJS.enc.Base64.parse(word).toString(CryptoJS.enc.Utf8);
  const bytes = CryptoJS.AES.decrypt(decData, key).toString(CryptoJS.enc.Utf8);
  return JSON.parse(bytes);
}

解决方案源码github

iqih9akk

iqih9akk6#

试试这个工作示例。https://stackblitz.com/edit/node-ugh35d?file=package.json,test_crypto.js
在终端运行npm start,如果npm i没有完成,请执行。

tquggr8v

tquggr8v7#

我遇到了同样的问题,似乎加密值是base64,需要先转换为utf-8。示例:

const utf8 = CryptoJS.enc.Base64.parse(value);
const decrypted = CryptoJS.DES.decrypt({ ciphertext: utf8 }, keyWords, { iv: ivWords });

我找到了解决方案Here

z8dt9xmd

z8dt9xmd8#

也许这有点好笑。。但这是我的前辈如何解决这个问题给我
我们有2个不同的门户网站,假设XYZ门户网站和ABC门户网站(我在XYZ门户网站面临这个问题)ABC是我们登录的门户网站。
所以在本地我已经打开了xyz门户和ABC门户..问题解决了..(之前我只打开xyz门户,所以我面临的问题):D

6gpjuf90

6gpjuf909#

我已经解决了清理本地存储的问题。

相关问题