CBC是一种加密模式,它将密文象链子一样串起来。
CBC是后面介绍的很多工作模式的基础,很多新的模式,特别是带认证的模式大部分使用了CBC这种链式结构。
参考文献
- NIST SP 800-38A
- CBC加解密
初始化向量IV,明文P,密文C
CBC加密: Cj = CIPHK(Pj ⊕ Cj-1) for j = 1 … n,记C0 = IV
CBC解密: Pj = CIPH-1K(Cj) ⊕ Cj-1 for j = 1 … n,记C0 = IV
每次加密都需要一个新的初始化向量IV,IV,无须保密,但应该是不可预知的。这样使得加密得到的第一个密文分组就是随机的。
CBC模式
- LibTomCrypt与CBC
LibTomCrypt中与CBC相关的信息如下:
typedef struct {
int cipher;
int blocklen;
unsigned char IV[MAXBLOCKSIZE]; //IV就是上一个分组的密文
symmetric_key key;
} symmetric_CBC;
相关函数如下
int cbc_start(int cipher, const unsigned char *IV, const unsigned char *key, int keylen, int num_rounds, symmetric_CBC *cbc);
int cbc_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CBC *cbc);
int cbc_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CBC *cbc);
int cbc_getiv(unsigned char *IV, unsigned long *len, symmetric_CBC *cbc);
int cbc_setiv(const unsigned char *IV, unsigned long len, symmetric_CBC *cbc);
int cbc_done(symmetric_CBC *cbc);
──────────────────────────────────────
int cbc_start(int cipher, const unsigned char *IV, const unsigned char *key, int keylen, int num_rounds, symmetric_CBC *cbc);
// [功能] 初始化
- IV // [输入] 初始化向量
- key // [输入] 密钥
- keylen // [输入] 密钥长度
- num_rounds // [输入] 轮数(建议设置为0以便让系统使用默认值)
- cbc // [输入/输出] CBC状态
──────────────────────────────────────
──────────────────────────────────────
int cbc_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CBC *cbc);
// [功能] CBC加密
- pt // [输入] 明文
- ct // [输出] 密文
- len // [输入] 明文密文长度
- cbc // [输入/输出] CBC状态
──────────────────────────────────────
──────────────────────────────────────
int cbc_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CBC *cbc);
// [功能] CBC解密
- ct // [输入] 密文
- pt // [输出] 明文
- len // [输入] 明文密文长度
- cbc // [输入/输出] CBC状态
──────────────────────────────────────
──────────────────────────────────────
int cbc_getiv(unsigned char *IV, unsigned long *len, symmetric_CBC *cbc)
// [功能] 获取IV值
- IV // [输出] IV值
- len // [输出] IV值长度
- cbc // [输入/输出] CBC状态
──────────────────────────────────────
──────────────────────────────────────
int cbc_setiv(const unsigned char *IV, unsigned long len, symmetric_CBC *cbc)
// [功能] 设置IV值
- IV // [输入] IV值
- len // [输入] IV值长度
- cbc // [输入/输出] CBC状态
──────────────────────────────────────
──────────────────────────────────────
int cbc_done(symmetric_CBC *cbc)
// [功能] 完成CBC
- cbc // [输入/输出] CBC状态
──────────────────────────────────────