Go语言提供了标准库中的crypto/aes包来支持AES加密和解密。下面是使用AES-128-CBC模式加密和解密的示例代码:
package main
import("crypto/aes""crypto/cipher""encoding/base64""fmt")funcmain(){
key :=[]byte("this is a 16 byte key")
iv :=[]byte("this is a 16 byte iv")
plaintext :=[]byte("hello world")// 加密
ciphertext, err :=encrypt(plaintext, key, iv)if err !=nil{panic(err)}
fmt.Printf("加密结果:%s\n", base64.StdEncoding.EncodeToString(ciphertext))// 解密
decrypted, err :=decrypt(ciphertext, key, iv)if err !=nil{panic(err)}
fmt.Printf("解密结果:%s\n", decrypted)}funcencrypt(plaintext []byte, key []byte, iv []byte)([]byte,error){
block, err := aes.NewCipher(key)if err !=nil{returnnil, err
}
ciphertext :=make([]byte,len(plaintext))
mode := cipher.NewCBCEncrypter(block, iv)
mode.CryptBlocks(ciphertext, plaintext)return ciphertext,nil}funcdecrypt(ciphertext []byte, key []byte, iv []byte)([]byte,error){
block, err := aes.NewCipher(key)if err !=nil{returnnil, err
}
plaintext :=make([]byte,len(ciphertext))
mode := cipher.NewCBCDecrypter(block, iv)
mode.CryptBlocks(plaintext, ciphertext)return plaintext,nil}
以上代码使用AES-128-CBC模式进行加密和解密,可以更换成其他AES模式,如AES-192-CBC或AES-256-CBC等,只需要更改密钥长度即可。注意,本示例代码中使用了base64编码对密文进行了格式化,如果您需要直接使用二进制密文,请忽略base64编码部分。
在AES加密和解密的过程中,需要使用到一些参数,以下是这些参数的作用解释:
1.Plaintext(明文):需要加密的原始数据。
2.Ciphertext(密文):加密后的数据。
3.Key(密钥):用于加密和解密的密钥,长度可以为16、24或32字节(即128位、192位或256位)。
4.IV(初始化向量):一段固定长度的随机数,用于增强AES加密的强度。IV的长度通常为16字节(即128位),它必须与密钥一起使用。
5.Block(块):AES加密和解密的基本单元,它的大小与密钥长度相关,例如使用128位密钥时,块的大小为128位(即16字节)。
6.Mode(模式):AES加密可以使用多种模式,如ECB、CBC、CFB、OFB等,每种模式都有其特定的加密规则和优缺点。
7.Padding(填充):由于AES加密的块大小通常为128位,而明文的长度可能不是块大小的整数倍,因此需要进行填充。常见的填充方式有PKCS#5和PKCS#7,它们可以保证明文长度为块大小的整数倍。
以上是AES加密和解密中一些重要的参数和概念,了解这些参数和概念可以帮助您更好地理解AES加密和解密的过程和实现。
版权归原作者 林欣快滚去学习 所有, 如有侵权,请联系我们删除。