Golang Go语言中 Java 解密算法如何移植

发布于 1周前 作者 yibo5220 来自 Go语言

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


Golang Go语言中 Java 解密算法如何移植

更多关于Golang Go语言中 Java 解密算法如何移植的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

18 回复

遇到很多这种问题,偶尔可以搬到 go ,但是问题还是很多。最后用 java 封装成 api ,golang 去调用了。

更多关于Golang Go语言中 Java 解密算法如何移植的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这不就是个 AES-CBC 么,,,

大概就是 AES_CBC_128 加密嘛,这种模式要求数据长度是 16 倍数,不足就要通过 PKCS 的方式填充。

话说它这个代码可能有问题哈,如果重复用一个密钥加密,那么 cipher 实例应该只生成一次就行。

都是标准算法,对这些 api 熟悉的话,重写一个应该不难

go 用这两个包
import (
“crypto/aes”
“crypto/cipher”
)

有具体栗子吗,不太熟 golang 这一块的😭

crypto 这块儿各语言的包的使用方式差别很大,移植很费劲,我之前把一个 20 几行的 NodeJS 加密代码用 golang 重写,花了两天时间。

PKCS5Padding 转 PKCS7Padding

PKCS5Padding 貌似是 java 特有的, 其它语言都是 PKCS7Padding

不都是调包么,找个一样算法的包回来调用就行了。

不一定有 jdk 环境的,又不想安装,跑 docker 来运行又要加载镜像,换成 go 写最方便(无依赖)

PKCS5Padding 是 PKCS7Padding 子集 所以可以直接用 PKCS7Padding 算法

C++写好, go 去调

但是不上 BC 库的话, 好像没有 PKCS7Padding 额

GraalVM 的 Native Image 也没依赖,直接编译成一个可执行文件,可以直接运行。

https://www.graalvm.org/22.2/reference-manual/native-image/

,试了下,很好的东西,可惜生成端使用了 java8 的,用 java11 或者 java17 都不能解析出 java8 的(ObjectInputStream stream 头报错), 而且还需要 arm 版本(java8 不支持), 本来还满怀希望的😭

用这个库: https://github.com/webx-top/codec
一段代码搞定:codec.NewAES(“AES-128-CBC”).Encode(plaintext, paykey)

在将Java中的解密算法移植到Go语言时,主要需关注算法实现、数据格式以及密钥管理等方面的适配。以下是一些专业建议:

  1. 算法实现:首先,明确Java中使用的解密算法(如AES、RSA等)及其具体实现细节,包括加密模式(如CBC、ECB)、填充方式(如PKCS#7、PKCS#5)等。在Go中,使用cryptocrypto/x509等标准库,可以找到对应的算法实现。确保在Go中正确配置这些参数。

  2. 数据格式:Java和Go在处理字节数据时可能存在差异,特别是当涉及到字符串编码和二进制数据时。确保在数据传递和转换过程中,保持数据格式的一致性。

  3. 密钥管理:如果Java代码中使用了特定的密钥存储或密钥生成机制,需要在Go中实现相应的功能。Go的crypto/rand包可用于生成密钥,而encoding/pemencoding/base64包可用于密钥的编码和解码。

  4. 测试验证:在移植过程中,编写单元测试来验证解密算法的正确性至关重要。使用已知的加密数据和密钥,在Java和Go中分别进行解密,并比较结果。

  5. 性能优化:如果解密操作是性能瓶颈,考虑在Go中使用并发处理或硬件加速(如AES-NI指令集)来优化性能。

总之,将Java解密算法移植到Go需要细致的工作,包括算法实现、数据格式、密钥管理等多方面的适配和验证。

回到顶部