Golang中的AES加密和Java中的解密

在使用Go语言进行AES加密,然后在Java中进行解密的过程中,需要确保两种语言使用相同的AES算法和参数设置。以下是详细的步骤和示例代码:

Go语言中的AES加密

在Go语言中,可以使用标准库中的crypto/aescrypto/cipher包来实现AES加密。示例代码如下:

go
package main import ( "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/base64" "fmt" "io" ) func encrypt(data []byte, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } cipherText := make([]byte, aes.BlockSize+len(data)) iv := cipherText[:aes.BlockSize] if _, err := io.ReadFull(rand.Reader, iv); err != nil { return nil, err } mode := cipher.NewCBCEncrypter(block, iv) mode.CryptBlocks(cipherText[aes.BlockSize:], data) return cipherText, nil } func main() { plaintext := []byte("Hello, AES encryption!") key := []byte("1234567890123456") // 16字节的AES密钥 cipherText, err := encrypt(plaintext, key) if err != nil { fmt.Println("Error encrypting:", err) return } fmt.Println("Encrypted:", base64.StdEncoding.EncodeToString(cipherText)) }

Java中的AES解密

在Java中,使用javax.crypto包可以实现AES解密。示例代码如下:

java
import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; public class AESDecryptor { public static void main(String[] args) throws Exception { String base64CipherText = "nMhO17ItMh05ny2AzsDxQ6zU4BuVWf7rc9dDhBcHCj0="; // 替换为Go程序加密后的base64字符串 byte[] keyBytes = "1234567890123456".getBytes(); // 16字节的AES密钥 byte[] cipherText = Base64.getDecoder().decode(base64CipherText); SecretKey key = new SecretKeySpec(keyBytes, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // 使用与Go程序相同的IV(初始向量) byte[] iv = new byte[16]; // 这里假设使用的IV与Go程序中的随机生成的IV相同 IvParameterSpec ivSpec = new IvParameterSpec(iv); cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); byte[] decryptedBytes = cipher.doFinal(cipherText); String decryptedText = new String(decryptedBytes); System.out.println("Decrypted: " + decryptedText); } }

注意事项:

  1. 密钥和IV的一致性:确保Go语言中生成的AES密钥和Java中使用的密钥一致,并且使用相同的IV(初始向量)。

  2. 填充模式:Go语言示例中使用了CBC模式,Java中也需要使用相同的CBC模式和填充方式(如PKCS5Padding)。

  3. Base64编码:Go语言中使用了Base64编码输出密文,Java中需要解码这个Base64字符串作为输入。

通过这些步骤和示例代码,可以实现Go语言中的AES加密,并在Java中正确解密。