Golang中的AES加密和Java中的解密
在使用Go语言进行AES加密,然后在Java中进行解密的过程中,需要确保两种语言使用相同的AES算法和参数设置。以下是详细的步骤和示例代码:
Go语言中的AES加密
在Go语言中,可以使用标准库中的crypto/aes
和crypto/cipher
包来实现AES加密。示例代码如下:
gopackage 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解密。示例代码如下:
javaimport 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);
}
}
注意事项:
密钥和IV的一致性:确保Go语言中生成的AES密钥和Java中使用的密钥一致,并且使用相同的IV(初始向量)。
填充模式:Go语言示例中使用了CBC模式,Java中也需要使用相同的CBC模式和填充方式(如PKCS5Padding)。
Base64编码:Go语言中使用了Base64编码输出密文,Java中需要解码这个Base64字符串作为输入。
通过这些步骤和示例代码,可以实现Go语言中的AES加密,并在Java中正确解密。