GO语言实现AES-CFB加密的操作方法

 更新时间:2024年10月29日 10:02:51   作者:且去填词  
本文介绍了如何用Go语言实现AES-CFB加密和解密,首先,定义一个属于encrypt包的文件,使用AES算法、CFB模式和Base64编码等功能,在加密函数中,接收明文和密钥,生成一个AES块密码和一个随机的初始化向量,实现明文的加密

这里为了使用方便,实现代码不作为一个函数而是作为一个包,这样在后面的代码中也可以进行复用。

包和导入

package encrypt
import (
	"crypto/aes"        // 提供 AES 加密算法实现
	"crypto/cipher"     // 提供加密算法接口和模式(如 CFB)
	"crypto/rand"       // 提供生成随机数功能
	"encoding/base64"   // 提供 Base64 编码和解码
	"fmt"               // 格式化 I/O
	"io"                // 基本 I/O 接口
)

package encrypt: 定义该文件属于 encrypt 包。
各种导入用于提供不同功能,如 AES 算法、CFB 模式、Base64 编码等。

Encrypt 函数

// Encrypt 对明文进行AES-CFB加密
func Encrypt(plaintext []byte, key string) (string, error) {
	block, err := aes.NewCipher([]byte(key))
	if err != nil {
		return "", err
	}
	iv := make([]byte, aes.BlockSize)
	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
		return "", err
	}
	stream := cipher.NewCFBEncrypter(block, iv)
	ciphertext := make([]byte, len(plaintext))
	stream.XORKeyStream(ciphertext, plaintext)
	// 合并 IV 和密文
	result := append(iv, ciphertext...)
	// 使用 Base64 编码返回
	return base64.StdEncoding.EncodeToString(result), nil
}
  • Encrypt 函数接收明文和用于 AES 加密的密钥。
  • aes.NewCipher([]byte(key)): 利用提供的密钥生成一个 AES 块密码。
  • iv(初始化向量)是 AES 块大小(16 字节)的随机数,确保同样的明文每次加密结果不同。
  • 使用 cipher.NewCFBEncrypter 创建 CFB 加密
  • stream.XORKeyStream(ciphertext, plaintext): 用流加密对明文进行加密,结果保存在 ciphertext 中。
  • 将 iv 和 ciphertext 合并为一个切片,然后使用 Base64 编码生成字符串

Decrypt 函数

// Decrypt 对密文进行AES-CFB解密
func Decrypt(ciphertextBase64 string, key string) ([]byte, error) {
	ciphertext, err := base64.StdEncoding.DecodeString(ciphertextBase64)
	if err != nil {
		return nil, err
	}
	block, err := aes.NewCipher([]byte(key))
	if err != nil {
		return nil, err
	}
	if len(ciphertext) < aes.BlockSize {
		return nil, fmt.Errorf("ciphertext too short")
	}
	iv := ciphertext[:aes.BlockSize]
	ciphertext = ciphertext[aes.BlockSize:]
	stream := cipher.NewCFBDecrypter(block, iv)
	plaintext := make([]byte, len(ciphertext))
	stream.XORKeyStream(plaintext, ciphertext)
	return plaintext, nil
}
  • Decrypt 函数接收 Base64 编码的密文和密钥。 将 Base64 密文解码成字节切片。 类似加密过程,生成 AES 块密码。
  • 验证密文长度,确保其大于 AES 块大小。 从解码后的密文中提取 iv,其余部分为实际密文。 使用cipher.NewCFBDecrypter 函数创建 CFB 解密流。 解密密文,得出明文。

注意事项

  • 使用 CFB 模式不需要明文填充。 密钥长度应为 16, 24 或 32 字节,以匹配 AES-128, AES-192 或AES-256。 随机 iv 很重要,每次加密都使用新的 iv 增强安全性。

到此这篇关于GO语言实现AES-CFB加密的文章就介绍到这了,更多相关GO语言 AES-CFB加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文详解在Go中如何使用Viper来管理配置

    一文详解在Go中如何使用Viper来管理配置

    Viper 是一个功能齐全的 Go 应用程序配置库,支持很多场景。在本文中,我们将深入探讨 Viper 的各种用法和使用场景,以帮助读者更好地了解和使用 Viper 来管理应用程序配置,感兴趣的同学可以参考阅读
    2023-05-05
  • Golang分布式锁详细介绍

    Golang分布式锁详细介绍

    分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源时,需要通过一些互斥手段来防止彼此之间的干扰以保证一致性,在这种情况下,就需要使用分布式锁了
    2022-10-10
  • Golang开发库的集合及作用说明

    Golang开发库的集合及作用说明

    这篇文章主要为大家介绍了Golang开发golang库的集合及简单的作用说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • Go语言中Map的神奇操作小结

    Go语言中Map的神奇操作小结

    Map是一个强大而又有趣的工具,它可以帮助我们高效地存储和操作键值对数据,本文主要介绍了Go语言中Map的各种操作,包括增加、查找、删除、遍历等,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • 夯实Golang基础之数据类型梳理汇总

    夯实Golang基础之数据类型梳理汇总

    这篇文章主要8为大家介绍了夯实Golang基础之数据类型梳理汇总,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2023-10-10
  • Go语言sync包与锁实现限制线程对变量的访问

    Go语言sync包与锁实现限制线程对变量的访问

    本文主要介绍了Go语言sync包与锁实现限制线程对变量的访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 详解Golang官方中的一致性哈希组件

    详解Golang官方中的一致性哈希组件

    这篇文章主要为大家详细介绍了Golang官方中的一致性哈希组件的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-04-04
  • GPT回答:go语言和C语言切片对比

    GPT回答:go语言和C语言切片对比

    这篇文章主要为大家介绍了GPT回答:go语言和C语言切片对比,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • go通过编码缩短字符串的长度实现方法步骤

    go通过编码缩短字符串的长度实现方法步骤

    这篇文章主要为大家介绍了go通过编码缩短字符串的长度实现方法步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go设计模式之备忘录模式讲解和代码示例

    Go设计模式之备忘录模式讲解和代码示例

    备忘录是一种行为设计模式, 允许生成对象状态的快照并在以后将其还原,本文就通过代码示例给大家讲讲Go备忘录模式,感兴趣的小伙伴跟着小编一起来看看吧
    2023-08-08

最新评论