加密算法学习总结---DES-CBC加密算法

DES-CBC机密算法

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。

一.核心原理原理XOR

DES的核心原理是基于XOR数学运算。我们知道异或运算的一个基本性质 A XOR B = C ;C XOR B =A。这个特性和加解密过程非常相似 A用秘钥B加密加密得到C ,C用秘钥B解密得到A。

二.DES的两重迭代

DES是基于数据块的加密。它将待加密数据以64bit为单位拆分为若干数据块。然后再进行两重迭代:
外层迭代是数据块之间的迭代,迭代的方式有ECB、CBC等,本文重点介绍CBC。
内层迭代是通过Feistel网络来实现。

2.1CBC迭代

这里写图片描述
基于CBC的数据块的加密和解密迭代过程如上图所示,每一个数据块的加密和解密过程都依赖上一个数据块。一旦有一个数据块出现错误将会出现“雪崩效应”。

2.2Feistel网络

这里写图片描述
如上图所示Feistel网络实现对于单个数据块的加密。Feistel迭代开始前将64bit数据块拆分为左右32比bit,然后进行如上图所示的迭代过程,总共迭代16次。每一次迭代的子密钥是不同的。每次迭代过程都是对右半部分数据块采用轮函数处理(加密)。所以这里涉及到两个问题:1.子密钥如何产生,2.轮函数如何实现

2.2.1子密钥的生成

这里写图片描述
子密钥的生成如上图所示,用户输入的是64bit的密钥(8个字符)首先做一次ip置换将64bit的密钥置换为56bit的密钥。56bit的密钥再进行一次PC-1置换后拆分为左右28bit的密钥。进行16轮迭代,产生16个子密钥。每次迭代将左右28bit密钥做左移1位的运算,然后再进行 PC-2的置换,组合再一起后得到ki。

2.2.1子轮函数的实现

轮函数的实现主要是进行了 ebox的置换处理和sbox的置换处理:
1. ebox 将32bit 的R block 通过扩展置换为48bit的R block,然后与当前迭代的子密钥Ki做XOR 运算,最后拆分为6*8的矩阵。
2. sbox 取 R block每一行的6个bit做运算,得到 sbox的坐标,取到sbox的值后做位移运算得到加密后的新的R block的行,迭代8此后得到最后的加密结果。

总体来说子密钥的生成的实现逻辑和轮函数的实现逻辑较为复杂具体可以参考我的代码实现。

三.代码实现:

Demo版的实现参考了pyDES库,把里面的实现做了一下逻辑抽离等重构操作。只实现了DES-CBC

from re import findall

"""
DES-CBC算法 的DEMO

coding by liuwei 2018.3.23

"""


class DES:
    # Permutation and translation tables for DES
    __pc1 = [
        56, 48, 40, 32, 24, 16, 8,
        0, 57, 49, 41, 33, 25, 17,
        9, 1, 58, 50, 42, 34, 26,
        18, 10, 2, 59, 51, 43, 35,
        62, 54, 46, 38, 30, 22, 14,
        6, 61, 53, 45, 37, 29, 21,
        13, 5, 60, 52, 44, 36, 28,
        20, 12, 4, 27, 19, 11, 3
    ]
    # number left rotations of pc1
    __left_rotations = [
        1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
    ]

    # permuted choice key (table 2)
    __pc2 = [
        13, 16, 10, 23, 0, 4,
        2, 27, 14, 5, 20, 9,
        22, 18, 11, 3, 25, 7,
        15, 6, 26, 19, 12, 1,
        40, 51, 30, 36, 46, 54,
        29, 39, 50, 44, 32, 47,
        43, 48, 38, 55, 33, 52,
        45, 41, 49, 35, 28, 31
    ]
    # initial permutation IP
    __ip = [57, 49, 41, 33, 25, 17, 9, 1,
            59, 51, 43, 35, 27, 19, 11, 3,
            61, 53, 45, 37, 29, 21, 13, 5,
            63, 55, 47, 39, 31, 23, 15, 7,
            56, 48, 40, 32, 24, 16, 8, 0,
            58, 50, 42, 34, 26, 18, 10, 2,
            60, 52, 44, 36, 28, 20, 12, 4,
            62, 54, 46, 38, 30, 22, 14, 6
            ]

    # Expansion table for turning 32 bit blocks into 48 bits
    __expansion_table = [
        31, 0, 1, 2, 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值