Crypto-JS AES 加密 java后台怎么解密

代码诗人 发布于 2017/12/28 13:24
阅读 1K+
收藏 2

nodeJs运用Crypto-JS aes加密 ,java取到怎么解 ?java 用aes加密出来的与Crypto-JS 加密的串不一样?

加载中
0
vikon
vikon

主要看方式相同不. 看一下说明crypto-js默认用PKCS7Padding, java里面用的是不是PKCS5Padding? 还有大家用的iv是不是相同?
 

vikon
vikon
回复 @代码诗人 : var ct = CryptoJS.AES.encrypt(msg, password); var saltHex = ct.salt.toString(); // random salt var ctHex = ct.ciphertext.toString(); // actual ciphertext var ivHex = ct.iv.toString(
vikon
vikon
回复 @vikon : https://stackoverflow.com/questions/35472396/how-does-cryptojs-get-an-iv-when-none-is-specified
vikon
vikon
@代码诗人 看看这个.有说明, 还会根据传key的方式的不同
代码诗人
crypto-js 默认iv是什么,我看传个空
0
代码诗人

java 用的是

cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

但是nodeJs

/加密 先用aes加密 再用base64加密
function encrypts(massge){
   var bytes  = CryptoJS.AES.encrypt(massge,'123123','');
   var plaintext = encode(bytes+"");
   return plaintext;
}这么加密的 iv size是16  第三个参数传的空,是全用默认的吗
0
kakai
kakai

/*

01 算法/模式/填充                16字节加密后数据长度        不满16字节加密后长度

02 AES/CBC/NoPadding             16                          不支持

03 AES/CBC/PKCS5Padding          32                          16

04 AES/CBC/ISO10126Padding       32                          16

05 AES/CFB/NoPadding             16                          原始数据长度

06 AES/CFB/PKCS5Padding          32                          16

07 AES/CFB/ISO10126Padding       32                          16

08 AES/ECB/NoPadding             16                          不支持

09 AES/ECB/PKCS5Padding          32                          16

10 AES/ECB/ISO10126Padding       32                          16

11 AES/OFB/NoPadding             16                          原始数据长度

12 AES/OFB/PKCS5Padding          32                          16

13 AES/OFB/ISO10126Padding       32                          16

14 AES/PCBC/NoPadding            16                          不支持

15 AES/PCBC/PKCS5Padding         32                          16

16 AES/PCBC/ISO10126Padding      32                          16

 

 

 

CryptoJS supports the following padding schemes:

 

    Pkcs7 (the default)

    Iso97971

    AnsiX923

    Iso10126

    ZeroPadding

    NoPadding

*/

/**
             * 加密数据
             * @param {type} data 待加密的字符串
             * @param {type} keyStr 秘钥
             * @param {type} ivStr 向量
             * @returns {unresolved} 加密后的数据
             */
            var aesEncrypt = function(data, keyStr, ivStr) {
                var sendData = CryptoJS.enc.Utf8.parse(data);
                var key = CryptoJS.enc.Utf8.parse(keyStr);
                var iv  = CryptoJS.enc.Utf8.parse(ivStr);
                var encrypted = CryptoJS.AES.encrypt(sendData, key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Iso10126});
                //return CryptoJS.enc.Base64.stringify(encrypted.toString(CryptoJS.enc.Utf8));
                return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
            };
            /**
             * 
             * @param {type} data BASE64的数据
             * @param {type} key 解密秘钥
             * @param {type} iv 向量
             * @returns {undefined} 
             */
            var aesDecrypt = function(data, keyStr, ivStr) {
                var key = CryptoJS.enc.Utf8.parse(keyStr);
                var iv  = CryptoJS.enc.Utf8.parse(ivStr);
                //解密的是基于BASE64的数据,此处data是BASE64数据
                var decrypted = CryptoJS.AES.decrypt(data, key, {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Iso10126});
                return decrypted.toString(CryptoJS.enc.Utf8);
            };

 

java

/**
     * 加密
     *
     * @param content 需要加密的内容
     * @param key 加密密码
     * @param md5Key 是否对key进行md5加密
     * @param iv 加密向量
     * @return 加密后的字节数据
     */
    public static byte[] encrypt(byte[] content, byte[] key, boolean md5Key, byte[] iv) {
        try {
            if (md5Key) {
                MessageDigest md = MessageDigest.getInstance("MD5");
                key = md.digest(key);
            }
            SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/ISO10126Padding"); //"算法/模式/补码方式"
            IvParameterSpec ivps = new IvParameterSpec(iv);//使用CBC模式,需要一个向量iv,可增加加密算法的强度
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivps);
            return cipher.doFinal(content);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException ex) {
            logger.error(ex.getLocalizedMessage());
        }
        return null;
    }
 
     
    public static byte[] decrypt(byte[] content, byte[] key, boolean md5Key, byte[] iv) {
        try {
            if (md5Key) {
                MessageDigest md = MessageDigest.getInstance("MD5");
                key = md.digest(key);
            }
            SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/ISO10126Padding"); //"算法/模式/补码方式"
            IvParameterSpec ivps = new IvParameterSpec(iv);//使用CBC模式,需要一个向量iv,可增加加密算法的强度
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivps);
            return cipher.doFinal(content);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException ex) {
            logger.error(ex.getLocalizedMessage());
        }
        return null;
    }

 

java端的解密都是基于字节,所以收到js的base64后要转成正常的字符串,再转成字节

 

代码诗人
还是这个iv,考虑安全性不对外开放?
代码诗人
CryptoJS里的默认的这个便宜了iv是什么,我看nodeJs里调用的时候,并没有传这个参数
0
代码诗人

同一个字符串我用java-ase加密出的是7aOS/9E3CUY=

而CryptoJS加密出U2FsdGVkX180xNLaWEzE0eoSWdojJMpHmS1+yCEhZHM=

我怀疑是不是CryptoJS加入了默认的向量

代码诗人
回复 @vikon : 谢谢大师指路
vikon
vikon
CryptoJs用了随机salt来计算了iv, 然后拼到了加密后的文本里面, 所以可以通过加密后的文本来找出来. stackoverflow上有一个java后台的解密的.代码太长直接去看吧.https://stackoverflow.com/questions/41432896/cryptojs-aes-encryption-and-java-aes-decryption
返回顶部
顶部