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=>解密后=>测试加密

Guess you like

Origin blog.csdn.net/weixin_44058223/article/details/127528186