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

加密解密 - 有后端的解码方法,我前端用crypto-js应该怎么配置参数?

景星光
2023-12-26

后端的解码方法是这样的,我在前端用crypto-js应该怎么设置参数?

// 解密模式/补码方式,固定值,不允许修改String CIPHER_MODEL = "/CBC/NoPadding";// 解密算法,固定值,不允许修改String keyAlgorithm = "AES";// 密钥,从医院获取String key = "M4pe91TNP39MvGmDNNgq7w==";// 待解密内容    String content = "a5KxFJpwuQlH5EOZeIBZteWKCflCykxfzj5ZIUtlOYI=";// 将密钥进行base64解密    byte[] keys = Base64.getDecoder().decode(key);    // 转base64字节码    byte[] contentBytes = Base64.getDecoder().decode(content);    //  按照 算法/模式/补码方式  构建Cipher对象Cipher cipher = Cipher.getInstance(keyAlgorithm + CIPHER_MODEL);// 生成密匙 SecretKeySpec keyspec = new SecretKeySpec(key, keyAlgorithm);// 构建偏移量,使用密钥作为偏移量 IvParameterSpec ivspec = new IvParameterSpec(key);// 用密钥和一组算法参数初始化此 Cipher// Cipher.ENCRYPT_MODE用于将 Cipher 初始化为解密模式的常量 cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);// 将密文进行解密,得到解密后数据byte[] result= cipher.doFinal(content);     // decodeContent 为最终解密后的内容     String decodeContent = new String(result, Charset.forName("utf-8")).trim();

下面是我写的,但我知道有些参数是不对的,有懂的吗?

import CryptoJS from 'crypto-js'import { Base64 } from 'js-base64';//加密function encryption(data,iv,key){    let keyOk=CryptoJS.enc.Utf8.parse(key)    let ivOk=CryptoJS.enc.Utf8.parse(iv)    let encryptedData=CryptoJS.AES.encrypt(data,keyOk,{        iv:ivOk,        mode:CryptoJS.mode.CBC,        padding:CryptoJS.pad.Pkcs7    }).toString()    return encryptedData;}//解密 function decryption(data,iv,key){    console.log(data,iv,key)    let keyOk=CryptoJS.enc.Utf8.parse(key)    let ivOk=CryptoJS.enc.Utf8.parse(iv)    let dataOk=data    let decryptedData=CryptoJS.AES.decrypt(dataOk,keyOk,{        iv:ivOk,        mode:CryptoJS.mode.CBC,        padding:CryptoJS.pad.Pkcs7    }).toString(CryptoJS.enc.Utf8)    return decryptedData}export {    encryption,    decryption};

共有1个答案

孟彦
2023-12-26

你的前端代码看起来已经很接近了,但是有几个关键的差异需要注意。

首先,你的后端代码是使用Java的JCE (Java Cryptography Extension) 和 Cipher 类进行加密和解密的。而在前端,你使用的是CryptoJS,这是一个JavaScript库,它对AES加密提供了一个纯JS实现。这两者在内部工作方式和一些细节上有很大的差异。

你的后端代码中,密钥和初始化向量(IV)都是Base64解码的,而在CryptoJS中,你不需要手动进行这个解码步骤,因为CryptoJS会自动处理。

其次,你在后端代码中直接将密钥作为偏移量,而在CryptoJS中,你需要创建一个专门用于CBC模式的密钥对象。

下面是一个修正后的版本:

import CryptoJS from 'crypto-js'// 密钥和初始化向量const key = "M4pe91TNP39MvGmDNNgq7w=="; // 这个密钥应该是16进制字符串,而不是Base64编码的字符串const iv = "a5KxFJpwuQlH5EOZeIBZteWKCflCykxfzj5ZIUtlOYI="; // 这个IV应该是16进制字符串,而不是Base64编码的字符串// 将密钥和IV转换为16进制字节数组const keyBytes = CryptoJS.enc.Base64.parse(key);const ivBytes = CryptoJS.enc.Base64.parse(iv);// 加密函数function encryption(data){    let encrypted = CryptoJS.AES.encrypt(data, keyBytes, {        iv: ivBytes,        mode: CryptoJS.mode.CBC,        padding: CryptoJS.pad.Pkcs7    });    return encrypted.toString();}// 解密函数function decryption(data){    let decrypted = CryptoJS.AES.decrypt(data, keyBytes, {        iv: ivBytes,        mode: CryptoJS.mode.CBC,        padding: CryptoJS.pad.Pkcs7    });    return decrypted.toString(CryptoJS.enc.Utf8);}

请注意,这里我们假设你的密钥和IV是Base64编码的字符串,这是因为你的后端代码是这样的。如果它们实际上是16进制字符串,那么你需要将它们转换为CryptoJS可以理解的格式。如果你的密钥和IV实际上是Base64编码的,那么你应该使用CryptoJS.enc.Base64.parse来解析它们。

 类似资料:
  • Hutool-crypto概述 加密分为三种: 对称加密(symmetric),例如:AES、DES等 非对称加密(asymmetric),例如:RSA、DSA等 摘要加密(digest),例如:MD5、SHA-1、SHA-256、HMAC等 hutool-crypto针对这三种加密类型分别封装,并提供常用的大部分加密算法。 对于非对称加密,实现了: RSA DSA 对于对称加密,实现了: AES

  • 问题内容: 我计划在我的网站上为我的用户存储外国帐户信息,也称为RapidShare用户名和密码等。我想确保信息的安全,但是我知道,如果我对他们的信息进行哈希处理,我将无法将其检索以备后用。 Base64可以解密,因此毫无意义地使用它。我的想法是对用户进行加扰,即使在解密之后,也要以这种方式传递base64前后,如果尝试解密,则会得到一些看上去很有趣的文本。是否有一个php函数接受可以对字符串进行

  • 问题内容: 我们正忙于为客户开发Java Web服务。有两种可能的选择: 将加密的用户名/密码存储在Web服务客户端上。从配置读取。客户端上的文件,解密并发送。 将加密的用户名/密码存储在Web服务器上。从配置读取。Web服务器上的文件,解密并在Web服务中使用。 Web服务使用用户名/密码来访问第三方应用程序。 客户端已经具有提供此功能的类,但是此方法涉及以明文方式发送用户名/密码(尽管在内联网

  • 本文向大家介绍使用js实现摩斯密码的加密和解密相关面试题,主要包含被问及使用js实现摩斯密码的加密和解密时的应答技巧和注意事项,需要的朋友参考一下 网络上看到的,很长

  • 1.手机翻转,或者折叠屏该怎么监听然后动态重新渲染echarts,需要加防抖或者节流吗? 2.横向条形图,左右两边的label怎么永远出现在可视范围内?比如148.00就已经飘出去了,看不全,还有左侧还有很多留白区域,不够美观 3.饼图中间的title的text和subtext能响应式的改变字体大小吗?像这种情况,字体完全超出了饼图范围