有以下 java 解密算法的代码,传进一个加密后的文件路径,解出键值对来
    public static Map<String, Object> decrypt(String path) throws Exception {
        String password = "test-decrypt";
        KeyGenerator generator = KeyGenerator.getInstance("AES");
        generator.init(128, new SecureRandom(password.getBytes(StandardCharsets.UTF_8)));
        SecretKey key = generator.generateKey();
        Cipher cipher = Cipher.getInstance(key.getAlgorithm() + "/CBC/PKCS5Padding");
        byte[] iv = new byte[16];
        cipher.init(2, key, new IvParameterSpec(iv));
        CipherInputStream cipherInputStream = new CipherInputStream(new BufferedInputStream(new FileInputStream(path)), cipher);
        ObjectInputStream inputStream = new ObjectInputStream(cipherInputStream);
        SealedObject sealedObject = (SealedObject)inputStream.readObject();
        return (HashMap)sealedObject.getObject(cipher);
    }
加密文件是通过 java 生成的,但解密想换成 go 来实现(无依赖不需要 jdk 环境), 有没有 golang 的高手试过移植代码
     1 
                    
                    runningman      2022-09-07 10:21:55 +08:00 
                    
                    遇到很多这种问题,偶尔可以搬到 go ,但是问题还是很多。最后用 java 封装成 api ,golang 去调用了。 
                 | 
            
     2 
                    
                    qzwmjv      2022-09-07 10:36:04 +08:00    这不就是个 AES-CBC 么,,, 
                 | 
            
     3 
                    
                    lysS      2022-09-07 10:37:28 +08:00 
                    
                    大概就是 AES_CBC_128 加密嘛,这种模式要求数据长度是 16 倍数,不足就要通过 PKCS 的方式填充。 
                话说它这个代码可能有问题哈,如果重复用一个密钥加密,那么 cipher 实例应该只生成一次就行。  | 
            
     4 
                    
                    virusdefender      2022-09-07 11:18:37 +08:00 
                    
                    都是标准算法,对这些 api 熟悉的话,重写一个应该不难 
                 | 
            
     5 
                    
                    xmai      2022-09-07 11:44:40 +08:00 
                    
                    go 用这两个包 
                import ( "crypto/aes" "crypto/cipher" )  | 
            
     7 
                    
                    ElmerZhang      2022-09-07 11:50:44 +08:00 
                    
                    crypto 这块儿各语言的包的使用方式差别很大,移植很费劲,我之前把一个 20 几行的 NodeJS 加密代码用 golang 重写,花了两天时间。 
                 | 
            
     8 
                    
                    xmai      2022-09-07 12:01:35 +08:00 
                    
                    
                 | 
            
     9 
                    
                    ccppgo      2022-09-07 16:17:10 +08:00 
                    
                    PKCS5Padding 转 PKCS7Padding 
                PKCS5Padding 貌似是 java 特有的, 其它语言都是 PKCS7Padding  | 
            
     10 
                    
                    xuanbg      2022-09-07 16:25:24 +08:00 
                    
                    不都是调包么,找个一样算法的包回来调用就行了。 
                 | 
            
     11 
                    
                    euvkzx   OP @xuanbg 不一定有 jdk 环境的,又不想安装,跑 docker 来运行又要加载镜像,换成 go 写最方便(无依赖) 
                 | 
            
     12 
                    
                    datoujiejie221      2022-09-07 19:32:57 +08:00 
                    
                    @ccppgo PKCS5Padding 是 PKCS7Padding 子集 所以可以直接用 PKCS7Padding 算法 
                 | 
            
     14 
                    
                    ccppgo      2022-09-08 10:13:20 +08:00 
                    
                    @datoujiejie221 但是不上 BC 库的话, 好像没有 PKCS7Padding 额 
                 | 
            
     15 
                    
                    whx      2022-09-09 14:46:17 +08:00 via iPhone 
                    
                    GraalVM 的 Native Image 也没依赖,直接编译成一个可执行文件,可以直接运行。 
                https://www.graalvm.org/22.2/reference-manual/native-image/  | 
            
     16 
                    
                    euvkzx   OP @whx ,试了下,很好的东西,可惜生成端使用了 java8 的,用 java11 或者 java17 都不能解析出 java8 的(ObjectInputStream stream 头报错), 而且还需要 arm 版本(java8 不支持), 本来还满怀希望的😭 
                 | 
            
     17 
                    
                    admpubcom      2022-10-22 17:52:52 +08:00 via iPhone 
                    
                    用这个库: https://github.com/webx-top/codec 
                一段代码搞定:codec.NewAES("AES-128-CBC").Encode(plaintext, paykey)  |