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

122 篇文章 23 订阅
订阅专栏
53 篇文章 4 订阅
订阅专栏

目录

ECB和CBC模式的区别

ECB模式

CBC模式:

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

ECB (Electronic Codebook Book电码本模式)

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

C++源代码 


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即为加密结果。


原文链接:https://blog.csdn.net/honeygirl_/article/details/90716328

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

分组密码有五种工作体制:1.电码本模式(Electronic Codebook Book (ECB));2.密码分组链接模式(Cipher Block Chaining (CBC));3.计算器模式(Counter (CTR));4.密码反馈模式(Cipher FeedBack (CFB));5.输出反馈模式(Output FeedBack (OFB))。

以下逐一介绍一下:

ECB (Electronic Codebook Book电码本模式)

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

 

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

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

 

 初始化向量

    当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量(Initialization Vector),通常缩写为IV,一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。

我们来比较一下ECB模式与CBC模式的区别

 

 ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。

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

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

 

 

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

    这种模式较复杂。

 12232528-c5c4946255a849379be143aaca8d1ecf.png

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

    这种模式较复杂。

C++源代码 

/**
*@autho stardust
*@time 2013-10-10
*@param 实现AES五种加密模式的测试
*/
#include <iostream>
using namespace std;

//加密编码过程函数,16位1和0
int dataLen = 16;   //需要加密数据的长度
int encLen = 4;     //加密分段的长度
int encTable[4] = {1,0,1,0};  //置换表
int data[16] = {1,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0}; //明文
int ciphertext[16]; //密文

//切片加密函数
void encode(int arr[])
{
    for(int i=0;i<encLen;i++)
    {
        arr[i] = arr[i] ^ encTable[i];
    }
}

//电码本模式加密,4位分段
void ECB(int arr[])
{
    //数据明文切片
    int a[4][4];
    int dataCount = 0;  //位置变量
    for(int k=0;k<4;k++)
    {
        for(int t=0;t<4;t++)
        {
            a[k][t] = data[dataCount];
            dataCount++;
        }
    }
    dataCount = 0;//重置位置变量
    for(int i=0;i<dataLen;i=i+encLen)
    {
        int r = i/encLen;//行
        int l = 0;//列
        int encQue[4]; //编码片段
        for(int j=0;j<encLen;j++)
        {
            encQue[j] = a[r][l];
            l++;
        }
        encode(encQue); //切片加密
        //添加到密文表中
        for(int p=0;p<encLen;p++)
        {
            ciphertext[dataCount] = encQue[p];
            dataCount++;
        }
    }
    cout<<"ECB加密的密文为:"<<endl;
    for(int t1=0;t1<dataLen;t1++) //输出密文
    {
        if(t1!=0 && t1%4==0)
            cout<<endl;
        cout<<ciphertext[t1]<<" ";
    }
    cout<<endl;
    cout<<"---------------------------------------------"<<endl;
}

//CBC
//密码分组链接模式,4位分段
void CCB(int arr[])
{
    //数据明文切片
    int a[4][4];
    int dataCount = 0;  //位置变量
    for(int k=0;k<4;k++)
    {
        for(int t=0;t<4;t++)
        {
            a[k][t] = data[dataCount];
            dataCount++;
        }
    }
    dataCount = 0;//重置位置变量

    int init[4] = {1,1,0,0};  //初始异或运算输入
    //初始异或运算
    for(int i=0;i<dataLen;i=i+encLen)
    {
        int r = i/encLen;//行
        int l = 0;//列
        int encQue[4]; //编码片段
        //初始化异或运算
        for(int k=0;k<encLen;k++)
        {
            a[r][k] = a[r][k] ^ init[k];
        }
         //与Key加密的单切片
        for(int j=0;j<encLen;j++)
        {
            encQue[j] = a[r][j];
        }
        encode(encQue); //切片加密
        //添加到密文表中
        for(int p=0;p<encLen;p++)
        {
            ciphertext[dataCount] = encQue[p];
            dataCount++;
        }
        //变换初始输入
        for(int t=0;t<encLen;t++)
        {
            init[t] = encQue[t];
        }
    }


    cout<<"CCB加密的密文为:"<<endl;
    for(int t1=0;t1<dataLen;t1++) //输出密文
    {
        if(t1!=0 && t1%4==0)
            cout<<endl;
        cout<<ciphertext[t1]<<" ";
    }
    cout<<endl;
    cout<<"---------------------------------------------"<<endl;
}

//CTR
//计算器模式,4位分段
void CTR(int arr[])
{
    //数据明文切片
    int a[4][4];
    int dataCount = 0;  //位置变量
    for(int k=0;k<4;k++)
    {
        for(int t=0;t<4;t++)
        {
            a[k][t] = data[dataCount];
            dataCount++;
        }
    }
    dataCount = 0;//重置位置变量

    int init[4][4] = {{1,0,0,0},{0,0,0,1},{0,0,1,0},{0,1,0,0}};  //算子表
    int l = 0; //明文切片表列
    //初始异或运算
    for(int i=0;i<dataLen;i=i+encLen)
    {
        int r = i/encLen;//行
        int encQue[4]; //编码片段
        //将算子切片
        for(int t=0;t<encLen;t++)
        {
            encQue[t] = init[r][t];
        }
        encode(encQue); //算子与key加密
        //最后的异或运算
        for(int k=0;k<encLen;k++)
        {
            encQue[k] = encQue[k] ^ a[l][k];
        }
        l++;

        //添加到密文表中
        for(int p=0;p<encLen;p++)
        {
            ciphertext[dataCount] = encQue[p];
            dataCount++;
        }
    }


    cout<<"CTR加密的密文为:"<<endl;
    for(int t1=0;t1<dataLen;t1++) //输出密文
    {
        if(t1!=0 && t1%4==0)
            cout<<endl;
        cout<<ciphertext[t1]<<" ";
    }
    cout<<endl;
    cout<<"---------------------------------------------"<<endl;
}

//CFB
//密码反馈模式,4位分段
void CFB(int arr[])
{
    //数据明文切片,切成2 * 8 片
    int a[8][2];
    int dataCount = 0;  //位置变量
    for(int k=0;k<8;k++)
    {
        for(int t=0;t<2;t++)
        {
            a[k][t] = data[dataCount];
            dataCount++;
        }
    }
    dataCount = 0;  //恢复初始化设置
    int lv[4] = {1,0,1,1};  //初始设置的位移变量
    int encQue[2]; //K的高两位
    int k[4]; //K

    for(int i=0;i<2 * encLen;i++) //外层加密循环
    {
        //产生K
        for(int vk=0;vk<encLen;vk++)
        {
            k[vk] = lv[vk];
        }
        encode(k);
        for(int k2=0;k2<2;k2++)
        {
            encQue[k2] = k[k2];
        }
        //K与数据明文异或产生密文
        for(int j=0;j<2;j++)
        {
            ciphertext[dataCount] = a[dataCount/2][j] ^ encQue[j];
            dataCount++;
        }
        //lv左移变换
        lv[0] = lv[2];
        lv[1] = lv[3];
        lv[2] = ciphertext[dataCount-2];
        lv[3] = ciphertext[dataCount-1];
    }

    cout<<"CFB加密的密文为:"<<endl;
    for(int t1=0;t1<dataLen;t1++) //输出密文
    {
        if(t1!=0 && t1%4==0)
            cout<<endl;
        cout<<ciphertext[t1]<<" ";
    }
    cout<<endl;
    cout<<"---------------------------------------------"<<endl;
}

//OFB
//输出反馈模式,4位分段
void OFB(int arr[])
{
    //数据明文切片,切成2 * 8 片
    int a[8][2];
    int dataCount = 0;  //位置变量
    for(int k=0;k<8;k++)
    {
        for(int t=0;t<2;t++)
        {
            a[k][t] = data[dataCount];
            dataCount++;
        }
    }
    dataCount = 0;  //恢复初始化设置
    int lv[4] = {1,0,1,1};  //初始设置的位移变量
    int encQue[2]; //K的高两位
    int k[4]; //K

    for(int i=0;i<2 * encLen;i++) //外层加密循环
    {
        //产生K
        for(int vk=0;vk<encLen;vk++)
        {
            k[vk] = lv[vk];
        }
        encode(k);
        for(int k2=0;k2<2;k2++)
        {
            encQue[k2] = k[k2];
        }
        //K与数据明文异或产生密文
        for(int j=0;j<2;j++)
        {
            ciphertext[dataCount] = a[dataCount/2][j] ^ encQue[j];
            dataCount++;
        }
        //lv左移变换
        lv[0] = lv[2];
        lv[1] = lv[3];
        lv[2] = encQue[0];
        lv[3] = encQue[1];
    }

    cout<<"CFB加密的密文为:"<<endl;
    for(int t1=0;t1<dataLen;t1++) //输出密文
    {
        if(t1!=0 && t1%4==0)
            cout<<endl;
        cout<<ciphertext[t1]<<" ";
    }
    cout<<endl;
    cout<<"---------------------------------------------"<<endl;
}


void printData()
{
    cout<<"以下示范AES五种加密模式的测试结果:"<<endl;
    cout<<"---------------------------------------------"<<endl;
    cout<<"明文为:"<<endl;
    for(int t1=0;t1<dataLen;t1++) //输出密文
    {
        if(t1!=0 && t1%4==0)
            cout<<endl;
        cout<<data[t1]<<" ";
    }
    cout<<endl;
    cout<<"---------------------------------------------"<<endl;
}
int main()
{
    printData();
    ECB(data);
    CCB(data);
    CTR(data);
    CFB(data);
    OFB(data);
    return 0;
}

原文: AES五种加密模式(CBC、ECB、CTR、OCF、CFB) - 月之星狼 - 博客园

四 对CBC模式的攻击

假设主动攻击者的目的是通过修改密文来操纵解密后的明文。如果攻击者能够对初始化向量中的任意比特进行反转(将1变成0,将0变成1),则明文分组中相应的比特也会被反转。这是因为在CBC模式的解密过程中,第一个明文分组会和初始化向量进行XOR运算。见下图。

 

 但是想对密文分组也进行同样的攻击就非常困难了。例如,如果攻击者将密文分组1中的某个比特进行反转,则明文分组2中相应比特也会被反转,然而这一比特的变化却对解密后的明文分组1中的多个比特造成了影响,也就是说,只让明文分1中所期望的特定比特发生变化是很困难的。

五 填充提示攻击

填充提示攻击是一种利用分组密码中填充部分来进行攻击的方法。在分组密码中,当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。在填充提示攻击中,攻击者会反复发送一段密文,每次发送时都对填充数据进行少许改变。由于接收者(服务器)在无法正确解密时会返回一个错误消息,攻击者通过这一错误消息就可以获得一部分与明文相关的信息。这一攻击并不仅限于CBC模式,而是适用所有需要进行分组填充的模式。

2014年对SSL3.0 造成了重大影响POODLE攻击实际上就是一种填充示攻击。

六 对初始化向量(IV)进行攻击

初始化向量(IV)必须使用不可预测的随机数。然而在SSL/TLS的TLS1.0版本协议中,IV并没有使用不可预测的随机数,而是使用上一次CBC模式加密时的最后一个分组。为了防御攻击者对此进行攻击,TLS1.1以上的版本中改为了必须显示传送IV。

七 CBC模式应用

确保互联网安全的通信协议之一SSL/TLS,就是使用CBC模式来确保通信机密性的,如使用CBC模式三重DES的3DES_EDE_CBC以及CBC模式256比特AES的AES_256_CBC等。

安全基础学习-SM4加密算法
小夭的博客
08-16 2272
SM4 是一种对称加密算法,意味着加密和解密使用相同的密钥。它是一个 128 位(16 字节)分组密码,意味着它将明文分成 128 位的块,然后对每个块进行加密。SM4 使用了 128 位的密钥进行加密和解密。SM4 算法的主要特点是:分组长度:128 位。密钥长度:128 位。加密模式:支持多种模式,如ECB(电子密码本)、CBC加密分组链接)、CTR(计数器模式)等。
QT AES CBC加密和解密
03-18
QT AES CBC加密和解密
CBC 模式ECB 模式解读
布袋和尚
07-19 1万+
CBC模式的全称CipherBlockChaining模式(密文分组链接模式),之所以叫这个名字,是因为密文分组像链条一样互相连接在一起。在CBC模式,首先将明文分组和一个密文分组进行XOR运算,然后再进行。CBC模式的加解密过程如下比较一下ECB模式CBC模式区别ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。...............
AES算法的CBCECB两种工作模式
weixin_61430914的博客
07-20 3949
AES加密算法是一种传统的对称加密算法(即用一个密钥进行加密和解密),其比较常见的工作模式ECBCBC。注意:AES的密钥长度为128/192/256位。填充模式有:NoPadding/PKCS5Padding/PKCS7Padding/.....等。
CBCECB
abc814251901的专栏
04-01 1475
这一篇文章要解决数据加密——数据补位的问题、DES算法的两种模式ECBCBC问题以及更加安全的算法——3DES算法。  一、 数据补位 DES数据加解密就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,按照需求补足8个字节(通常补00或者FF,根据实际要求不同)进行计算,之后按照顺序将计算所得的数据连在一起即可。 这里有个问题就是为什么要进行
AES算法的ECBCBC两种工作模式
2301_77661292的博客
07-18 1264
加密解密方法都分别通过Cipher.getInstance("AES/ECB/PKCS5Padding")方法传入参数分别为算法/工作模式/填充模式,创建了各自的密码对象Cipher实例,接着根据算法名称及秘钥创建了SecretKey实例,然后初始化秘钥,通过init()方法分别设置加密和解密模式加密模式为cipher.ENCRYPT_MODE,解密模式为cipher.DECRYPT_MODE)。在解密时需要将数组的iv参数提取出来,与秘钥结合在一起对密文进行解密。
ECBCBC 两种操作模式分别完成
12-02
ECBCBC 两种操作模式分别完成
DES密码实现.rar_CBC 模式_DES 加密_ECB 模式
09-23
根据提供的压缩包文件名“密码学实验四”,我们可以推测这是一个教学性质的实验,可能要求学生实现DES加密CBCECB模式,并观察每一轮加密的结果。在实验,学生可能需要编写代码,模拟DES加密过程,对比两种模式...
C语言实现的DES加密程序,支持ECBCBC加密模式.zip
最新发布
06-13
DES(Data Encryption Standard)是一种广泛使用的对称加密算法,它基于块加密,使用56位的密钥对64位的数据块进行加密。C语言实现的DES加密程序可以帮助开发者理解和应用这种经典加密技术。该程序提供了两种加密...
国密SM4的5种加密模式(ECB CBC CFB OFB CTR XTS)源码及其参考文档.rar
11-13
包含内容:SM4国密加密算法C语言实现 包括 Spec,C代码,测试用例和分组密码有五种工作体制: 1.电码本模式(Electronic Codebook Book (ECB)); 2.密码分组链接模式(Cipher Block Chaining (CBC)); 3.计算器模式(Counter (CTR)); 4.密码反馈模式(Cipher FeedBack (CFB)); 5.输出反馈模式(Output FeedBack (OFB))
AES的C#实现(用ECBCBC模式分别完成加密解密)
12-17
用C#编写,用ECBCBC模式分别实现了加解密,是我们的信息安全的课程实验,解密部分是解密老师给的一个文档,出于隐私保密,我修改了其的一部分东西,所以解密后是乱码。大家可以改为一段正常的话。
ECBCBC 两种操作模式分别完成DES算法
02-20
编写 C 程序实现 DES 加、解密: (1) 编程实现 基于自己的名字来构造一 DES 密钥; (2) 应用 (1) 获得的密钥将一副灰度 图 (BMP 格式 ) 进行加、解 密; (3) 应用 ECBCBC 两种操作模式分别完成
【分组加密算法】-加解密模式CBC模式ECB模式解读
一切有为法,如梦亦如幻,如露亦如电,应作如是观。
08-29 1万+
模式(密文分组链接模式),之所以叫这个名字,是因为密文分组像链条一样互相连接在一起。在CBC模式,首先将明文分组和一个密文分组进行异或(XOR)运算,然后再进行加密。在这种方法,每个密文块都依赖与它前边的所有明文块。...
【对称加密算法】AES算法的CBCECB模式
m0_63216218的博客
07-18 8108
密钥的加密和解密!
AES加密CBCECB
m0_72167535的博客
02-10 5002
AES加密CBCECB
对称加密算法之分组加密的六种工作模式ECBCBC、PCBC、CFB、OFB、CTR)
热门推荐
张维鹏的博客
10-07 1万+
加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption)。对称加密又分为分组加密和序列密码。 (1)分组加密,也叫块加密(block cyphers),一次加密明文的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。具有代表性的块加密算法有...
des 加密cbc模式
05-24
DES是一种对称加密算法,而CBC是一种工作模式,可以在DES算法基础上提供更高的安全性。DES-CBC加密模式是将明文分块后,使用DES算法进行加密,再将密文与上一个密文块进行异或运算,然后再进行加密,这样可以避免了ECB模式下相同明文块生成相同的密文块的问题。具体过程如下: 1. 将明文分块,每个明文块为64位。 2. 初始向量IV(Initialization Vector)用于第一个明文块的加密,之后每个密文块会与前一个密文块进行异或运算。 3. 将IV与第一个明文块进行异或运算,得到结果后使用DES算法进行加密。 4. 将加密结果与第二个明文块进行异或运算,得到结果后使用DES算法进行加密。 5. 重复以上步骤,直到加密完所有的明文块。 6. 将所有加密后的密文块组合起来,得到最终的密文。 解密时,也是按照相反的过程进行操作,将密文块与前一个密文块进行异或运算,再进行解密,最终得到明文块。需要注意的是,解密时也需要使用相同的IV值。
写文章

热门文章

  • 【mySQL】mysql数据库分页查询讨论专题 204215
  • 【网络】连接服务器失败(错误原因:Connection refused)| error 111: (111) Connection refused 原因分析 202759
  • 【shell】shell字符串分割|文件分割|剪切|截取 103113
  • 【Git】Git配置|配置Username和email 93257
  • 【MYSQL】同时查询两个表并将结果合并到一起 70705

分类专栏

  • 总目录 8篇
  • shell脚本 34篇
  • RDMA 87篇
  • linux 165篇
  • C/C++ 206篇
  • 数据库 43篇
  • 网络编程 125篇
  • python|java 54篇
  • 扩展知识 122篇
  • 存储|ceph|DAOS 130篇
  • 数据结构|算法|设计模式 53篇
  • 人工智能|大数据 13篇
  • 管理|文档 41篇
  • 前端 22篇
  • 测试 70篇
  • 物联网 40篇

最新评论

  • 【shell】shell 数组处理

    bandaoyu: 输出数组: function get_disk_and_its_ranks_tgts() { local -n tgt_array="$1" # 使用第一个参数作为目标数组的引用 # 临时数组 local tmp_array=(1 2 3 4) # 将 tmp_array 的内容赋值给 tgt_array tgt_array=("${tmp_array[@]}") } # 调用函数并定义目标数组 declare -a TGTarray get_disk_and_its_ranks_tgts TGTarray # 输出结果 echo "TGTarray的内容:" for item in "${TGTarray[@]}"; do echo "$item" done

  • 【Shell】Shell时间相关|统计Shell脚本执行时间|sleep

    bandaoyu: #!/bin/bash # 记录开始时间 startTime=$(date +%s) # 这里是您的脚本逻辑 # ... # 记录结束时间 endTime=$(date +%s) # 计算总耗时 elapsed=$(( endTime - startTime )) # 将秒数转换为时分秒格式 hours=$(( elapsed / 3600 )) minutes=$(( (elapsed % 3600) / 60 )) seconds=$(( elapsed % 60 )) # 输出结果 printf "Total time: %02d:%02d:%02d (HH:MM:SS)\n" $hours $minutes $seconds

  • 【shell】远程执行shell|多节点并行执行|远程登录执行

    bandaoyu: (sshpass -p "$PASSWD" ssh $SSH_OPTS root@$host "COLUMNS=200 top -b -n 1 |grep -E '%MEM|daos_engine'|column -t" #远程执行top默认的终端宽度小,会导致列被截断显示为 daos_en+ 这种形式。设置 COLUMNS 来调整终端的宽度

  • 【Linux】资源查看top显示信息说明|top、iftop、iotop、htop、atop工具

    bandaoyu: (sshpass -p "$PASSWD" ssh $SSH_OPTS root@$host "COLUMNS=200 top -b -n 1 |grep -E '%MEM|daos_engine'|column -t" #远程执行top默认的终端宽度小,会导致列被截断显示为 daos_en+ 这种形式。设置 COLUMNS 来调整终端的宽度

  • 【调试】linux top查看线程/进程/僵尸进程

    bandaoyu: (sshpass -p "$PASSWD" ssh $SSH_OPTS root@$host "COLUMNS=200 top -b -n 1 |grep -E '%MEM|daos_engine'|column -t" #远程执行top默认的终端宽度小,会导致列被截断显示为 daos_en+ 这种形式。设置 COLUMNS 来调整终端的宽度

最新文章

  • 【RDMA】mlxlink检查和调试连接状态及相关问题--驱动工具
  • 【RDMA】mlxconfig修改和查询网卡(固件)配置--驱动工具
  • 【RDMA】固件工具 Firmware Tools (MFT)和用法
2024年19篇
2023年27篇
2022年113篇
2021年276篇
2020年297篇
2019年155篇
2018年70篇
2017年30篇
2016年9篇
2015年14篇
2014年8篇
2013年4篇
2012年97篇
2011年38篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

天下网标王济宁关键词网站优化奎文网站优化推广如何进行网站sem优化万州科技网站优化婚恋网站如何优化北海整站网站优化深圳企业网站推广优化网站优化是怎么做到网站优化软件收费低网站建设优化推广贵州信阳网站搜索优化新都网站优化有什么用汉阳网站优化软件推荐闵行区推广网站服务厂家优化价格长沙网站优化价格电影站网站优化网站排名优化哪家正规藁城网站优化数量崇明区公司网站优化哪家好福建网站优化建设免费优化网站推荐开平服务好的网站优化有哪些晴隆网站优化与推广徐汇区官方网站优化定制方案望牛墩网站优化费用南阳搜狗seo网站优化多少钱url网站的优化建议英文网站排名优化网站优化多久有排名浦东网站优化怎么样香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化