V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
youngs
V2EX  ›  程序员

快疯了! CryptoJS AES CBC 加密为啥可以吧 iv 指定为''?

  •  
  •   youngs · 2020-04-27 16:05:59 +08:00 · 3966 次点击
    这是一个创建于 1671 天前的主题,其中的信息可能已经有所发展或是发生改变。
    var data = word;
    var key = CryptoJS.enc.Utf8.parse('1111111111111111');
    var iv = CryptoJS.enc.Utf8.parse('');
    //加密
    var encrypted = CryptoJS.AES.encrypt(data, key, {iv: iv, mode: CryptoJS.mode.CBC });
    

    这么搞 Java 没办法解密啊。。。难倒 CryptoJS 有默认的 iv ?

    第 1 条附言  ·  2020-05-07 11:33:45 +08:00

    无奈的最终办法:JAVA调用JS

    java代码:

    public class AesJsUtil {
        public static String decrypt(String password, String key) {
            ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
            Resource aesJs = new ClassPathResource("js" + File.separator + "aes.js");
            try {
                engine.eval(new FileReader(aesJs.getFile()));
                Invocable invocable = (Invocable) engine;
                return (String) invocable.invokeFunction("decrypt", password, key);
            } catch (Exception e) {
                log.error("JS解密失败", e);
            }
        }
    }
    

    aes.js代码:

    function decrypt(encrypt, currentKey) {
        var key = CryptoJS.enc.Utf8.parse(currentKey);
        var iv = CryptoJS.enc.Utf8.parse('');
        var decrypted = CryptoJS.AES.decrypt(encrypt.toString(), key, { iv: iv, mode: CryptoJS.mode.CBC }).toString(CryptoJS.enc.Utf8);
        return decrypted.toString();
    }
    
    9 条回复    2020-07-02 22:06:45 +08:00
    rmb1222
        1
    rmb1222  
       2020-04-27 16:48:23 +08:00   ❤️ 1
    zxyroy
        2
    zxyroy  
       2020-04-27 17:32:06 +08:00
    随机生成的话下次要怎么解密?
    LeeSeoung
        3
    LeeSeoung  
       2020-04-27 17:34:31 +08:00
    iv 为空随机生成,解密的时候密文要跟 iv 一起提供。
    jiejiss
        4
    jiejiss  
       2020-04-27 17:41:36 +08:00
    @zxyroy #2 https://github.com/gwjjeff/cryptojs/blob/master/lib/AES.js#L126 iv 为空情况下(返回的密文的)前 16 字节就是随机生成的 iv

    复读了一下 #1
    zxyroy
        5
    zxyroy  
       2020-04-27 18:04:06 +08:00
    @jiejiss 我看了 110 行之后太过震惊,就没往下看 126 了。下次看完再回复
    yukiball
        6
    yukiball  
       2020-04-27 18:41:15 +08:00
    长知识了
    jiejiss
        7
    jiejiss  
       2020-07-01 23:12:29 +08:00
    你本可以直接 String iv = encrypted.substring(0, 16); 的,不需要调用 JS 解密
    youngs
        8
    youngs  
    OP
       2020-07-02 14:54:55 +08:00
    @jiejiss 试过,当时我记得不太行,会丢东西,所以换了方式
    jiejiss
        9
    jiejiss  
       2020-07-02 22:06:45 +08:00
    @youngs #8 有点奇怪哎,是不是你把 substring 剩下的从 index = 16 开始的密文丢进去解密了……我感觉可能尽管 iv 是 substring(0, 16),但解密还是得从 index = 0 开始解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2467 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:51 · PVG 23:51 · LAX 07:51 · JFK 10:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.