首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用加密JS实现Java到JS和JS到Java加密

使用加密JS实现Java到JS和JS到Java加密
EN

Stack Overflow用户
提问于 2015-05-21 18:50:04
回答 1查看 13.5K关注 0票数 8

几周前,我在这个岗位上工作得很好:Compatible AES algorithm for Java and Javascript

现在,我需要执行反向操作,但是一旦进入java,我就得到了这个异常:

代码语言:javascript
复制
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中所做的“反向”操作:

代码语言: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代码

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-21 18:58:37

变化

代码语言:javascript
复制
return CryptoJS.enc.Base64.parse(encrypted.toString()).toString();

代码语言:javascript
复制
return encrypted.ciphertext.toString(CryptoJS.enc.Base64);

encrypted对象通常被压缩成OpenSSL格式,该格式也可能包含salt。如果您只对实际的密文感兴趣,那么需要压缩ciphertext属性。

注意,toString()接受一个可选的编码函数。用你需要的那个。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30382014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档