当前位置: 技术文章>> 100道Go语言面试题之-请解释Go语言的crypto包中加密算法(如AES、RSA)的使用。

文章标题:100道Go语言面试题之-请解释Go语言的crypto包中加密算法(如AES、RSA)的使用。
  • 文章分类: 后端
  • 9996 阅读

在Go语言的crypto包中,加密算法如AES和RSA被广泛用于数据加密、解密、签名和验证等安全相关的任务。下面分别解释这两种加密算法在Go语言中的使用。

AES 加密算法

AES(Advanced Encryption Standard)是一种对称加密算法,使用相同的密钥进行加密和解密。AES支持多种长度的密钥,通常为128、192或256位。

使用AES加密数据

  1. 生成密钥:通常使用安全的随机数生成器生成密钥。
  2. 创建加密器:使用aes.NewCipher函数和密钥创建一个cipher.Block接口的实例。
  3. 选择模式:选择合适的加密模式(如CBC、CTR等)。
  4. 加密数据:根据选择的模式,对数据进行加密。

示例代码

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(
推荐文章