You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现的AES/CBC/PKCS5Padding加解密代码迁移至Golang技术咨询

Go版本AES-CBC-PKCS5加解密实现(与Java版本完全兼容)

首先明确Java代码的核心逻辑,Go实现完全对齐以下规则:

  • 密钥处理:将输入密钥按UTF-8编码转字节,取前16位,不足16位补0,生成AES-128所需的16位密钥
  • 加密模式:AES/CBC/PKCS5Padding,IV值与处理后的16位密钥完全一致
  • Base64编码/解码:使用标准RFC4648规范,和Java Base64.getDecoder()/Base64.getEncoder()逻辑完全一致
package main

import (
	"bytes"
	"crypto/aes"
	"crypto/cipher"
	"encoding/base64"
	"fmt"
)

const (
	secretKey = "$sgettng@&Key%"
)

// getKeyBytes 对齐Java的getKeyBytes逻辑,生成16位AES密钥
func getKeyBytes(key string) []byte {
	keyBytes := []byte(key)
	res := make([]byte, 16)
	copy(res, keyBytes)
	return res
}

// PKCS5Padding PKCS5填充实现
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
	padding := blockSize - len(ciphertext)%blockSize
	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
	return append(ciphertext, padtext...)
}

// PKCS5UnPadding PKCS5解填充实现
func PKCS5UnPadding(origData []byte) []byte {
	length := len(origData)
	unpadding := int(origData[length-1])
	return origData[:(length - unpadding)]
}

// Encrypt 加密方法,对齐Java encrypt逻辑
func Encrypt(plainText string) (string, error) {
	plainBytes := []byte(plainText)
	keyBytes := getKeyBytes(secretKey)
	// IV和密钥相同,对齐Java逻辑
	iv := keyBytes

	block, err := aes.NewCipher(keyBytes)
	if err != nil {
		return "", err
	}
	blockSize := block.BlockSize()
	plainBytes = PKCS5Padding(plainBytes, blockSize)
	mode := cipher.NewCBCEncrypter(block, iv)
	cipherBytes := make([]byte, len(plainBytes))
	mode.CryptBlocks(cipherBytes, plainBytes)
	// 标准Base64编码,和Java Base64.getEncoder()一致
	return base64.StdEncoding.EncodeToString(cipherBytes), nil
}

// Decrypt 解密方法,对齐Java decrypt逻辑
func Decrypt(encryptedText string) (string, error) {
	// 标准Base64解码,完全对齐Java Base64.getDecoder().decode()逻辑
	cipherBytes, err := base64.StdEncoding.DecodeString(encryptedText)
	if err != nil {
		return "", err
	}
	keyBytes := getKeyBytes(secretKey)
	iv := keyBytes

	block, err := aes.NewCipher(keyBytes)
	if err != nil {
		return "", err
	}
	mode := cipher.NewCBCDecrypter(block, iv)
	plainBytes := make([]byte, len(cipherBytes))
	mode.CryptBlocks(plainBytes, cipherBytes)
	plainBytes = PKCS5UnPadding(plainBytes)
	return string(plainBytes), nil
}

func main() {
	// 测试逻辑对齐Java main方法
	encryptStr, err := Encrypt("Text")
	if err != nil {
		panic(err)
	}
	fmt.Println("Encrypted---->", encryptStr)
	decryptStr, err := Decrypt(encryptStr)
	if err != nil {
		panic(err)
	}
	fmt.Println(decryptStr)
}

兼容性说明

  • 本实现生成的加密结果可以直接用原Java代码解密,原Java代码生成的加密结果也可以直接用本实现解密,完全兼容
  • 其中base64.StdEncoding.DecodeString完全对应要求的Java byte[] cipheredBytes = Base64.getDecoder().decode((encryptedText));逻辑,两者处理结果完全一致

内容的提问来源于stack exchange,提问作者Sourav Kabiraj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:45:02