直接回答:ECB 每块独立加密,相同的明文块会得到相同的密文块,所以加密图片时还能看出原图轮廓;CBC 把上一块的密文参与下一块的运算,同样的明文块结果也不同,更安全但需要初始向量。

DES加密算法中,ECB和CBC模式有什么区别?

ECB和CBC模式的区别

ECB模式

ECB(电子密本方式)其实非常简单,就是将数据按照8个字节一段进行DES加密或解密得到一段段的8个字节的密文或者明文,最后一段不足8个字节(一般补0或者F),按照需求补足8个字节进行计算(并行计算),之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。

优点:

  1. 简单;

  2. 有利于并行计算;

  3. 误差不会被传递;

缺点:

  1. 不能隐藏明文的模式;

  2. 可能对明文进行主动攻击;

CBC模式:

优点:

  1. 不容易主动攻击,安全性好于ECB,是SSL、IPSec的标准;

缺点:

  1. 不利于并行计算;
  2. 误差传递;
  3. 需要初始化向量IV;

CBC(密文分组链接方式)有点麻烦,它的实现机制使加密的各段数据之间有了联系。其实现的机理如下: 加密步骤如下:

  1. 首先将数据按照8个字节一组进行分组得到D1D2…Dn(若数据不是8的整数倍,用指定的PADDING数据补位)
  2. 第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)
  3. 第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2
  4. 之后的数据以此类推,得到Cn
  5. 按顺序连为C1C2C3…Cn即为加密结果。

AES五种加密模式(CBC、ECB、CTR、OCF、CFB)

1.电码本模式(Electronic Codebook Book (ECB)

这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。

2.密码分组链接模式(Cipher Block Chaining (CBC))

这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。

3.计算器模式(Counter (CTR))

​ 计算器模式不常见,在CTR模式中, 有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。

4.密码反馈模式(Cipher FeedBack (CFB))

这种模式较复杂

5.输出反馈模式(Output FeedBack (OFB))

这种模式较复杂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
   // crypto-js.min.js
let message="admin";//要加密的字符串
let key="abcd1234";//密钥(要求8位以上)
let ivstr= "3a1f315222c490121ae193c5";//偏移量(要求8位以上)
var result=encryptByDES(message,key);
document.write("加密结果:"+result);
var decrypt=decryptByDES(result,key);
document.write("<br>解密结果:"+decrypt);
// JS DES CBC模式 加密
function encryptByDES(message, key){
let ckey = CryptoJS.enc.Utf8.parse(key)
let encrypted = CryptoJS.DES.encrypt(message, ckey, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: CryptoJS.enc.Utf8.parse(ivstr)
  });
//return encrypted.toString(); //此方式返回base64格式密文
return encrypted.ciphertext.toString(); // 此方式返回hex格式的密文
}
// JS DES CBC模式 解密
function decryptByDES(message, key){
let ckey = CryptoJS.enc.Utf8.parse(key);
let ciphertext = CryptoJS.enc.Hex.parse(message);
let srcs = CryptoJS.enc.Base64.stringify(ciphertext);
let decrypt = CryptoJS.DES.decrypt(srcs, ckey, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: CryptoJS.enc.Utf8.parse(ivstr)
  });
return decrypt.toString(CryptoJS.enc.Utf8);
}


这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。

站内搜索

没有找到内容!