在Go语言的crypto
包中,加密算法如AES和RSA被广泛用于数据加密、解密、签名和验证等安全相关的任务。下面分别解释这两种加密算法在Go语言中的使用。
AES 加密算法
AES(Advanced Encryption Standard)是一种对称加密算法,使用相同的密钥进行加密和解密。AES支持多种长度的密钥,通常为128、192或256位。
使用AES加密数据:
- 生成密钥:通常使用安全的随机数生成器生成密钥。
- 创建加密器:使用
aes.NewCipher
函数和密钥创建一个cipher.Block
接口的实例。 - 选择模式:选择合适的加密模式(如CBC、CTR等)。
- 加密数据:根据选择的模式,对数据进行加密。
示例代码:
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"fmt"
"io"
)
func main() {
key := make([]byte, 32) // AES-256 需要 32 字节长的密钥
if _, err := io.ReadFull(rand.Reader, key); err != nil {
panic(err)
}
plaintext := []byte("Hello, AES!")
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
ciphertext := make([]byte, aes.BlockSize+len(plaintext))
iv := ciphertext[:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
panic(err)
}
mode := cipher.NewCBCEncrypter(block, iv)
mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext)
fmt.Printf("Ciphertext: %x\n", ciphertext)
}
使用AES解密数据:
解密过程与加密过程相反,使用相同的密钥和初始化向量(IV)。
示例代码:
// 解密过程省略了密钥和密文的获取部分
plaintext := make([]byte, len(ciphertext)-aes.BlockSize)
mode := cipher.NewCBCDecrypter(block, iv)
mode.CryptBlocks(plaintext, ciphertext[aes.BlockSize:])
fmt.Printf("Decrypted: %s\n", plaintext)
RSA 加密算法
RSA 是一种非对称加密算法,使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密。
生成RSA密钥对:
使用rsa.GenerateKey
函数生成RSA密钥对。
示例代码:
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"fmt"
"os"
)
func main() {
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
fmt.Println(err)
return
}
publicKey := &privateKey.PublicKey
// 导出公钥和私钥
pubASN1, err := x509.MarshalPKIXPublicKey(publicKey)
if err != nil {
fmt.Println(err)
return
}
pub := &pem.Block{
Type: "RSA PUBLIC KEY",
Bytes: pubASN1,
}
pem.Encode(os.Stdout, pub)
privASN1 := x509.MarshalPKCS1PrivateKey(privateKey)
priv := &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: privASN1,
}
pem.Encode(os.Stdout, priv)
}
使用RSA加密数据:
使用公钥对数据进行加密。
示例代码:
ciphertext, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, publicKey, plaintext, nil)
if err != nil {
fmt.Println(err)
}
使用RSA解密数据:
使用私钥对加密后的数据进行解密。
示例代码:
plaintext, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, privateKey, ciphertext, nil)
if err != nil {
fmt.Println(