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完全对应要求的Javabyte[] cipheredBytes = Base64.getDecoder().decode((encryptedText));逻辑,两者处理结果完全一致
内容的提问来源于stack exchange,提问作者Sourav Kabiraj
相关产品推荐
相关产品推荐

