Go语言实现AES的CFB模式加密解密

AES介绍

AES加密又称为高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。

CFB加密模式介绍

CFB模式又称密文反馈模式(Cipher feedback):与ECB和CBC模式只能够加密块数据不同,CFB能够将块密文(Block Cipher)转换为流密文(Stream Cipher)。
原理是将数据进行加密的结果与明文进行异或得到密文,然后再将密文进行加密再与明文异或得到下一个密文,依次类推。

初始化向量介绍

初始化向量(IV,Initialization Vector)是许多工作模式中用于随机化加密的一块数据,因此可以由相同的明文,相同的密钥产生不同的密文,而无需重新产生密钥,避免了通常相当复杂的这一过程。
初始化向量与密钥相比有不同的安全性需求,因此IV通常无须保密,然而在大多数情况中,不应当在使用同一密钥的情况下两次使用同一个IV。
对于CBC和CFB,重用IV会导致泄露明文首个块的某些信息,亦包括两个不同消息中相同的前缀。对于OFB和CTR而言,重用IV会导致完全失去安全性。另外,在CBC模式中,IV在加密时必须是无法预测的;特别的,在许多实现中使用的产生IV的方法,例如SSL2.0使用的,即采用上一个消息的最后一块密文作为下一个消息的IV,是不安全的。

代码示例

package main

import (
	"crypto/aes"
	"crypto/cipher"
	"encoding/hex"
	"fmt"
)

//16,24,32位字符串的话,分别对应AES-128,AES-192,AES-256 加密方法
//key不能泄露
var keyStr = []byte("wobushipikaqiua.")

// 创建加密算法aes
func InitCipher() (cipher.Block, error) {
	c, err := aes.NewCipher([]byte(keyStr))
	if err != nil {
		fmt.Printf("Error: NewCipher(%d bytes) = %s", len(keyStr), err)
		return nil, err
	}
	return c, nil
}

//加密
func Encryption(commonIV []byte, plainStr string) (string, error) {
	c, err := InitCipher()
	if err != nil {
		fmt.Printf("Error: %s", err)
		return "", err
	}
	//加密字符串
	plainText := []byte(plainStr)
	cfb := cipher.NewCFBEncrypter(c, commonIV)
	cipherText := make([]byte, len(plainText))
	cfb.XORKeyStream(cipherText, plainText)
	//将[]byte转为16进制的字符串并返回
	//同:hex.EncodeToString(cipherText)
	return fmt.Sprintf("%x", cipherText), nil
}

//解密
func Decryption(commonIV []byte, cipherStr string) (string, error) {
	c, err := InitCipher()
	if err != nil {
		fmt.Printf("Error: %s", err)
		return "", err
	}
	//将十六进制的字符串解密为[]byte
	cipherText, _ := hex.DecodeString(cipherStr)
	// 解密字符串
	cfbdec := cipher.NewCFBDecrypter(c, commonIV)
	plaintextCopy := make([]byte, len(cipherText))
	cfbdec.XORKeyStream(plaintextCopy, cipherText)
	return fmt.Sprintf("%s", plaintextCopy), nil
}
func main() {
	//初始化向量
	var commonIV = []byte("2006010215040500")
	str := "测试加密"
	pwd, _ := Encryption(commonIV, str)
	fmt.Println(str + "=>加密后=>" + pwd)
	plainText, _ := Decryption(commonIV, pwd)
	fmt.Println(pwd + "=>解密后=>" + plainText)
}

运行后控制台输出

测试加密=>加密后=>d398aba7216ac9b770f83c35
d398aba7216ac9b770f83c35=>解密后=>测试加密
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 3.7中提供了AES-CFB模式加密解密算法。AES是一种对称加密算法,而CFB(Cipher Feedback)是一种分组密码模式。 要使用AES-CFB加密解密,我们首先需要安装pycryptodome库,这是一个强大且广泛使用的密码学库。可以通过以下命令安装该库: ``` pip install pycryptodomex ``` 下面是一个示例代码,演示了如何使用AES-CFB模式进行加密解密: ```python from Crypto.Cipher import AES from Crypto.Random import get_random_bytes # 随机生成16字节的密钥和初始化向量 key = get_random_bytes(16) iv = get_random_bytes(16) # 创建AES加密器和解密器 cipher = AES.new(key, AES.MODE_CFB, iv) decipher = AES.new(key, AES.MODE_CFB, iv) # 待加密的消息 message = "Hello, AES-CFB!" # 加密消息 ciphertext = cipher.encrypt(message.encode('utf-8')) # 解密密文 plaintext = decipher.decrypt(ciphertext).decode('utf-8') # 打印结果 print("密钥:", key) print("IV:", iv) print("密文:", ciphertext) print("明文:", plaintext) ``` 在这个例子中,我们首先使用`get_random_bytes()`函数生成了一个16字节的密钥和一个16字节的初始化向量。然后,我们分别使用密钥和初始化向量创建了一个AES加密器和解密器。然后,我们将待加密的消息转换为字节形式,并使用加密器对其进行加密。最后,我们使用解密器对密文进行解密,并将解密后的结果转换为字符串形式。 请注意,AES-CFB模式需要提供一个初始化向量(IV),它与密钥一起用于加密解密过程。IV的安全性非常重要,它应该是随机且不可预测的。每次加密消息时,都应该使用一个独特的IV。在这个示例中,我们使用`get_random_bytes()`函数生成了一个随机的IV。 希望这个示例对您有所帮助,让您了解如何在Python 3.7中使用AES-CFB模式进行加密解密

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值