AES加密又称为高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。
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=>解密后=>测试加密