The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
euvkzx

Java 解密算法如何移植到 golang

  •  
  •   euvkzx · Sep 7, 2022 · 3268 views
    This topic created in 1520 days ago, the information mentioned may be changed or developed.

    有以下 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 的高手试过移植代码

    17 replies  •  2022-10-22 17:52:52 +08:00
    runningman
    runningman
    Sep 7, 2022
    1
    遇到很多这种问题,偶尔可以搬到 go ,但是问题还是很多。最后用 java 封装成 api ,golang 去调用了。
    qzwmjv
    qzwmjv
    Sep 7, 2022❤️1
    2
    这不就是个 AES-CBC 么,,,
    lysS
    lysS
    Sep 7, 2022
    3
    大概就是 AES_CBC_128 加密嘛,这种模式要求数据长度是 16 倍数,不足就要通过 PKCS 的方式填充。

    话说它这个代码可能有问题哈,如果重复用一个密钥加密,那么 cipher 实例应该只生成一次就行。
    virusdefender
    virusdefender
    Sep 7, 2022
    4
    都是标准算法,对这些 api 熟悉的话,重写一个应该不难
    xmai
    xmai
    Sep 7, 2022
    5
    go 用这两个包
    import (
    "crypto/aes"
    "crypto/cipher"
    )
    euvkzx
    euvkzx
    OP
    Sep 7, 2022
    6
    @xmai 有具体栗子吗,不太熟 golang 这一块的😭
    ElmerZhang
    ElmerZhang
    Sep 7, 2022
    7
    crypto 这块儿各语言的包的使用方式差别很大,移植很费劲,我之前把一个 20 几行的 NodeJS 加密代码用 golang 重写,花了两天时间。
    ccppgo
    ccppgo
    Sep 7, 2022
    9
    PKCS5Padding 转 PKCS7Padding

    PKCS5Padding 貌似是 java 特有的, 其它语言都是 PKCS7Padding
    xuanbg
    xuanbg
    Sep 7, 2022
    10
    不都是调包么,找个一样算法的包回来调用就行了。
    euvkzx
    euvkzx
    OP
    Sep 7, 2022
    11
    @xuanbg 不一定有 jdk 环境的,又不想安装,跑 docker 来运行又要加载镜像,换成 go 写最方便(无依赖)
    datoujiejie221
    datoujiejie221
    Sep 7, 2022
    12
    @ccppgo PKCS5Padding 是 PKCS7Padding 子集 所以可以直接用 PKCS7Padding 算法
    bthulu
    bthulu
    Sep 8, 2022
    13
    @euvkzx C++写好, go 去调
    ccppgo
    ccppgo
    Sep 8, 2022
    14
    @datoujiejie221 但是不上 BC 库的话, 好像没有 PKCS7Padding 额
    seagrass
    seagrass
    Sep 9, 2022 via iPhone
    15
    GraalVM 的 Native Image 也没依赖,直接编译成一个可执行文件,可以直接运行。

    https://www.graalvm.org/22.2/reference-manual/native-image/
    euvkzx
    euvkzx
    OP
    Sep 13, 2022
    16
    @whx ,试了下,很好的东西,可惜生成端使用了 java8 的,用 java11 或者 java17 都不能解析出 java8 的(ObjectInputStream stream 头报错), 而且还需要 arm 版本(java8 不支持), 本来还满怀希望的😭
    admpubcom
    admpubcom
    Oct 22, 2022 via iPhone
    17
    用这个库: https://github.com/webx-top/codec
    一段代码搞定:codec.NewAES("AES-128-CBC").Encode(plaintext, paykey)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3088 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 04:43 · PVG 12:43 · LAX 20:43 · JFK 23:43
    ♥ Do have faith in what you're doing.