当前位置: 首页 > 面试题库 >

使用cryptojs的Java到JS和JS到Java加密

空枫涟
2023-03-14
问题内容

现在,我需要执行相反的操作,但是一旦在Java中,我就会收到此异常:

javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)

这是我在JavaScript中执行的“反向”操作:

var rkEncryptionKey = CryptoJS.enc.Base64.parse('u/Gu5posvwDsXUnV5Zaq4g==');
var rkEncryptionIv = CryptoJS.enc.Base64.parse('5D9r9ZVzEYYgha93/aUK2w==');

function encryptString(stringToEncrypt) {
    var utf8Stringified = CryptoJS.enc.Utf8.parse(stringToEncrypt);
    var encrypted = CryptoJS.AES.encrypt(utf8Stringified.toString(), rkEncryptionKey, {mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: rkEncryptionIv});
    return CryptoJS.enc.Base64.parse(encrypted.toString()).toString();
}

我虽然就这些了?

[编辑]

加密的字符串如下:
{"company_name":"asdfasdfasd","customer_name":"asdfasdfasdfasdf","phone_number":"asdfasdfasdfasdf","email":"asdfasdfasdfasdfads"}

从Java到Java进行加密/解密时,从Java到javascript也可以,但是从javascript到Java,则不起作用。

Java代码

public String toJson(final String encrypted) {
    try {
        SecretKey key = new SecretKeySpec(Base64.decodeBase64("u/Gu5posvwDsXUnV5Zaq4g=="), "AES");
        AlgorithmParameterSpec iv = new IvParameterSpec(Base64.decodeBase64("5D9r9ZVzEYYgha93/aUK2w=="));
        byte[] decodeBase64 = Base64.decodeBase64(encrypted);

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key, iv);

        return new String(cipher.doFinal(decodeBase64), "UTF-8");
    } catch (Exception e) {
        throw new RuntimeException("This should not happen in production.", e);
    }
}

问题答案:

更改

return CryptoJS.enc.Base64.parse(encrypted.toString()).toString();

return encrypted.ciphertext.toString(CryptoJS.enc.Base64);

encrypted对象通常字符串化为OpenSSL格式,其中也可能包含盐。如果您只对实际密文感兴趣,则需要对ciphertext属性进行字符串化。

注意,这toString()需要一个可选的编码功能。使用您需要的那个。



 类似资料:
  • crypto-js中的WordArray到底是什么? CryptoJS中的加密算法CryptoJS.AES.encrypt中有一个参数key,需要是WordArray类型 这WordArray具体是什么类型? 我把key定义为:const key =CryptoJS.enc.Utf8.parse('LSXRMYY037165336');会出来下面的结果,这结果里为什么有个数组words? 他和有什

  • 我正在尝试使用Javascript和CryptoJS复制Java应用程序中使用的加密。我不太确定应该如何复制SecretKeySpec,因为CryptoJS似乎需要一个字符串作为密钥。 下面是我需要在JS中复制的Java加密代码: 到目前为止,我的JS代码: 此外,密码的最终输出是一个加密的字节数组。CryptoJS的最终输出似乎是一个带有密文的对象。有没有办法以字节数组的形式获取输出? 我现在唯

  • 客户端: 服务器端:

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

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

  • 我正在尝试使用带有spring boot的java嵌入式camunda,通过DMN中的JS实现一些复杂的业务验证逻辑。为了避免使用不推荐的Nashorn并添加ES6支持,我在project graal js engine中添加了。它似乎运行得很好,但我不知道如何将自定义函数添加到js脚本引擎的上下文中。假设我有索引。js在我的资源文件夹中,有导出的函数,我如何注册这样的扩展,以便能够在camund