【问题标题】:Java to JS and JS to Java encryption using cryptojsJava 到 JS 和 JS 到 Java 加密使用 cryptojs
【发布时间】:2015-05-21 18:50:04
【问题描述】:

几周前我收到了这篇文章,效果很好: Compatible AES algorithm for Java and Javascript

现在,我需要做反向操作,但是一旦在 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);
    }
}

【问题讨论】:

标签: java encryption encoding aes cryptojs


【解决方案1】:

改变

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

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

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

请注意,toString() 采用可选的编码函数。使用你需要的那个。

【讨论】:

  • 我不再得到异常,但是一旦转换,字符串与js加密的不匹配,是json字符串。结果是一堆数字/字母
  • 我看不出 JSON 字符串可能来自哪里。没有异常不是告诉你解密成功了吗?
  • 函数 encryptString 在 JSON.stringify(obj) 之后被调用,所以我知道要加密的源是 JSON,我希望反向操作返回一个 JSON 字符串,但它不是案子。
  • 非常抱歉,这是正确的,我比较了错误的转换字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
相关资源
最近更新 更多