对于较长的明文进行加密需要进行分块加密,但是直接加密(ecb)不容易隐藏模式,用OpenCV写了个程序论证了一下
ECB
优点就是简单,可以并行计算,不会迭代误差
缺点就是隐藏不了模式
CBC
需要初始化向量IV,来加密第一块C0.
有点就是比ECB好
缺点不利于并行计算、误差会迭代,还需要初始向量
加密算法为简单的位翻转
#define bitrev(b) (((b)<<7)&0x80) | \
(((b)<<5)&0x40) | \
(((b)<<3)&0x20) | \
(((b)<<1)&0x10) | \
(((b)>>1)&0x08) | \
(((b)>>3)&0x04) | \
(((b)>>5)&0x02) | \
(((b)>>7)&0x01)ECB加密,就是直接分块进行加密
for(int i=0;iwidth;i++)
for(int j=0;jheight;j++)
grey->imageData[j*grey->width+i]=bitrev(grey->imageData[j*grey->width+i]);
cvNamedWindow("ecb");
cvShowImage("ecb", grey);
CBC加密,与上一块密文异或后加密
for(int i=0;iwidth;i++)
for(int j=0;jheight;j++)
if(i!=0&&j!=0)
grey->imageData[j*grey->width+i]=bitrev(grey->imageData[j*grey->width+i]^grey->imageData[j*grey->width+i-1]);
else
grey->imageData[0]=grey->imageData[0]^IV;
cvNamedWindow("cbc");
cvShowImage("cbc", grey);
效果图
原图
ECB(很明显的模式)
CBC(存在部分图像边界)