分组密码模式: CBC模式(密码分组链接模式)

CBC模式是将前一个密文分组与当前明文分组的内容混合起来进行加密的,这样就可以避免ECB模式的弱点。

在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密,如下图所示:

如果将一个分组的加密过程分离出来,我们就可以很容易地比较出ECB模式和CBC模式的区别,ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR,如下图所示:

当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量,通常缩写为IV。

CBC模式优点:

1. 不容易主动攻击, 安全性好于ECB, 适合传输长度长的报文, 是SSL、IPSec的标准

CBC模式缺点:

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

对CBC模式的攻击,截图来源自图解密码技术一书:

CBC模式的加密:

#include <STRING.H>

#define IN
#define OUT

//假设加密分组为4字节一组

void Encrypt(IN char *lpszData, IN char *lpszKey, OUT char *lpszEnData)
{
    int i = 0;
    for (i = 0; i < 4; i++)
    {
        lpszEnData[i] = lpszData[i] ^ lpszKey[i];
    }
}

void Decrypt(IN char *lpszData, IN char *lpszKey, OUT char *lpszDeData)
{
    int i = 0;
    for (i = 0; i < 4; i++)
    {
        lpszDeData[i] = lpszData[i] ^ lpszKey[i];
    }
}

int main(int argc, char* argv[])
{
    char szData[] = "Hello World!";
    char szEnData[16] = {0};
    char szDeData[16] = {0};
    char *lpszKey = "1234";
    int i = 0;
    char szIV[] = "9999";

    printf("原始数据: %s\r\n", szData);

    while (true)
    {
        if (strlen(szData + i) == 0)
        {
            break;
        }

        //首先需要与前一个密文分组进行xor
        //由于自己的加密也是异或, 所以就不单独写与密文分组的xor函数了
        Encrypt(szData + i, szIV, szData + i);
        //更新密文分组
        Encrypt(szData + i, lpszKey, szIV);
        memcpy(szEnData + i, szIV, 4);
        i += 4;
    }

    printf("加密后数据: %s\r\n", szEnData);

    memcpy(szIV, "9999", 4);

    i = 0;
    char szPreEnData[8] = {0};

    while (true)
    {
        if (strlen(szEnData + i) == 0)
        {
            break;
        }

        memcpy(szPreEnData, szEnData + i, 4);
        //先解密
        Decrypt(szEnData + i, lpszKey, szEnData + i);
        //再与前一个密文分组进行xor
        //由于自己的加密也是异或, 所以就不单独写与密文分组的xor函数了
        Decrypt(szEnData + i, szIV, szIV);
        memcpy(szDeData + i, szIV, 4);
        memcpy(szIV, szPreEnData, 4);
        i += 4;
    }

    printf("解密后数据: %s\r\n", szDeData);

    return 0;
}

原始数据: Hello World!
加密后数据: @nfa|:]"U/
解密后数据: Hello World!

时间: 05-21

分组密码模式: CBC模式(密码分组链接模式)的相关文章

单用户模式修改root密码

单用户模式修改root密码 press any key (看到这个界面的时候键盘上的任意按键以进入GNU GRUB模式) edit CentOS edit kernel 设定从单用户模式启动 boot 在单用户模式中修改密码 单用户模式修改root密码

Linux 7个运行级别(0:关机,停机模式、1:单用户模式、2:多用户模式、3:完整的多用户文本模式、4:系统未使用,保留一般不用、5:图形化模式、6:重启模式)、重置root密码方法

init是Linux系统操作中不可缺少的程序之一.init进程,它是一个由内核启动的用户级进程.内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init.如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败. Linux 7个运行级别(0:关机,停机模式.1:单用户模式.2:多用户模式.3:完整的多用户文本模式.4:系统未使用,保留一般不用.5:图形化模式.6:重启模式),运行级就是操作系统当前正在运行的功能级别.

SQL反模式学习笔记15 分组

2014-10-14 15:49:19 目标:查询得到每组的max(或者min等其他聚合函数)值,并且得到这个行的其他字段 反模式:引用非分组列 单值规则:跟在Select之后的选择列表中的每一列,对于每个分组来说都必须返回且仅返回一直值. select ProductId,Max(DateReported) as Latest from Bugs  as b Join BugProducts  as bp on b.BugId = bp.BugId Group by ProductId; 在G

使用救援模式更改root密码

虽然单用户模式在没设grub密码的情况下也可以修改root密码,但是如果grub有密码就不能用了,且单用户模式几乎不提供任何服务.而救援模式可以改root密码,改配置等,做的事情更多.本文以VMware中CentOS为例说明救援模式改root密码. 首先,在当前虚拟机标签页标题右键单击,依次选择"电源"--"启动时进入BIOS(B)". 在PhoenixBIOS Setup Utility的Boot选项卡中使用方向键和"+""-&quo

[CentOS 7系列]特殊权限与链接模式

一.特殊权限 在linux系统中,有一些特殊的权限,它们适用于极少数特殊的场景.虽然适用的场景比较少,但不代表它们不重要.比如set_uid权限,这个权限的存在,才使得操作系统的用户才能自如的更改登录口令. 在linux操作系统中,特殊权限主要有以下几个: 1.set_uid 当普通用户执行带set_uid标识位的命令文件时,将临时使用所有者的权限执行该命令. [[email protected] ~]# ll /usr/bin/ls -rwxr-xr-x. 1 root root 117656

使用单用户模式破解Linux密码

使用单用户模式破解Linux密码 特别说明:在实际工作应用中,安装Linux操作系统必须设置装载口令,否则很容易被破解. 1.使用reboot指令重启Linux操作系统 2.在进入操作系统数秒时,单击Esc按键,进入如下界面 3.按字母小e进入如下编辑模式 4.选择第二个选项,然后再次单击字母小e 更改完成后,单击回车,如下图所示: 5.单击字母小b,重启操作系统,进入如下界面 在#号后面,输入passwd root(重置root管理员密码) 6.设置完成后,使用reboot指令重启操作系统,使

如和单用户模式破解root密码&amp;救援模式破解root密码

学了几天Linux,终于到了装逼时刻,看看如何破译别人的root密码,哈哈哈哈..... 单用户模式破解root密码 重置Centos 7 Root密码的方式 step1 - 在启动grub菜单,选择编辑选项启动 step2 - 按键盘e键,来进入编辑界面 Step3 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh Step4 现在按下 Control+x ,使用单用户模式启动 Step5  chroot /sysroot Step6 passed roo

RedHat系统下的网络配置,主机名的修改,进入单用户模式修改root密码和使用SSH远程连接工具

一.操作前准备 a.装有VirtualBox虚拟机和在虚拟机里已安装RedHat系统 b.在百度上搜索下载XSell软件后面会使用它远程连接服务器 二.RedHat系统下的网络配置 a.首先需要对新建的虚拟机进行相应的设置 如图: 这里介绍下为什么要选用桥接模式: VirtualBox中有4中网络连接方式:      a. NAT            网络地址转换模式(Network Address Translation)      b. Bridged Adapter    桥接模式   

单用户模式修改用户密码

一.CentOS7 使用单用户模式修改用户密码(前提是知道grub密码或者没有设置grub密码) (重启命令:reboot = shutdown -r now = init 6:关机命令:init 0 = poweroff) 1.开机或者重启到启动界面时-->使用方向键选择"CentOS Linux(3.10.0-514.e17.x86_64)7 (core) 2.按"e"进行编辑.找到以"linux16 .vmlinuz-3.10.0......"