(1)CBC模式的原理
这种模式是先将明文切分成若干小段,然后每一小段与初始块(IV向量)或者上一段的密文段进行异或运算后,再与密钥进行加密,第一个数据块进行加密之前需要用初始化向量IV进行异或操作。
(此图和以上原理参考于网络)
(2)漏洞复现
鄙人在实际开发API服务中用到了cbc模式的加密算法,但测试过程中却发现了此算法有安全漏洞,而且比较容易复现!下面是用于复现的测试代码:
cbc.go(填充模式PKCS5和PKCS7都适用)
package cbc
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
)
func encryptCBC(text []byte, aesKey, aesIV string) (encryptData string, err error) {
fmt.Println("encryptCBC-Key:", aesKey)
block, err := aes.NewCipher([]byte(aesKey))
if err != nil {
fmt.Println("encryptCBC NewCipher ERR:", err.Error())
return "", err
}
blockSize := block.BlockSize()
originData := pad(text, blockSize)
fmt.Println("encryptCBC-IV:", aesIV)
blockMode := cipher.NewCBCEncrypter(block, []byte(aesIV))
encrypt := make([]byte, len(originData))
blockMode.CryptBlocks(encrypt, originData)
encryptData = base64.StdEncoding.EncodeToString(encrypt)
return
}
fu