代换,S盒。扩散和混淆,这些概念构成了分组password学的基础。

假设明文和密文的分组长度都为n比特,则明文的每个分组都有2n个可能的取值;

代换:

为使加密运算可逆(即解密运算可行),明文的每个分组都应产生唯一的一个密文分组(多对一),这样

的变换是可逆的,称明文分组到密文分组的可逆变换为代换。

S盒:

一般地,对n比特的代换结构。密钥的大小是n*2n比特。如对64比特的分组。密钥大小应该是64*264比特,

难以处理。

实际中常将n分成较小的段。比如可选n==rn0,当中r,n0都是整正数。将设计n个变量的代换变为

设计r个较小的子代换,而每一个子代换仅仅有n0个输入变量。一般n0都不太大。称每一个子代换为代换盒。简称

S盒。

比如,在DES中将输入为48比特。输出为32比特的代换用8个S盒来实现,每一个S盒的输入端仅为6比特

。输出端仅为4比特。

扩展和混淆:

是设计password系统的两种基本方法,目的是抵抗对手对password系统的统计分析。

扩散就是将明文的统计特性散布到密文中去,实现方式是使得密文中每一位由明文中多位产生。在二元组password中

,可对数据反复运行某个置换。再对这一个置换作用于某个函数。就可以获得扩散。

扩散的目的是使明文和密文之间

的统计关系变得尽可能复杂;

混淆是使密文与密钥之间的统计关系尽可能复杂,以使对手无法得到密钥。

使用复杂的代换算法可得到预期的混淆

效果,而简单的线性代换函数得到的混淆效果不够理想。

扩散和混淆成功地实现了分组password的本质属性。因而成为设计现代分组password的基础。

分组加密步骤

 分组加密算法是对一定大小的明文或者密文做加密或者解密动作。在DES加密系统中。每次

 加密或者解密的分组大小均为64位。所以DES没有密文扩展问题。

对于大于64位的明文仅仅要按

 每位64位一组进行分割,而对于小于64位的明文仅仅要在后面补“0”就可以。

 DES所用加密或解密密钥也是64位大小,可是当中有8为是奇偶校验位,所以64位中真正起密钥

 作用的仅仅有56位。DES加密与解密所用的算法除了子密钥的顺序不同外,其它部分全然同样。

对于随意长度的明文,DES首先对其进行分组,使得每一组的长度为64位,然后分别对每一个

 64位的明文组进行加密。

  每一个64位长度的明文分组的加密步骤例如以下:

  1。初始置换:输入分组依照初始置换表重排序。进行初始置换。

  2,16轮循环:DES对经过初始置换的64位明文进行16轮类似的子加密过程。

每一轮的子

     加密过程要经过DES的f函数,其步骤例如以下:

    a,将64位从中间,划分为2部分,每个部分32位,左半部分记为L。右半部分

     记为R,以右半部分进行说明:

     a1,扩展置换:

     将32位的输入数据依据扩展置换表扩展成48位的输出数据。

a2,异或运算:

     将48位的明文数据与48位的子密钥进行异或运算(以下会说明子密钥产生过程)

     a3,S盒代换:

     S盒代换是非线性的,48位的输入数据S盒置换表置换成32位输出数据。

     a4,直接置换:

     S盒置换后的32位输出数据依据直接置换表进行直接置换。

     a5,经过直接置换的32位输出数据与本轮的L部分进行异或操作,结果作为

     下一轮子加密过程的R部分。本轮的R部分直接作为下一轮子加密过程的L部分。

     然后进入下一轮子加密过程,直到16轮所有完毕。

3,终结置换;依照终结置换表进行终结置换,64位输出就是密文。

在每一轮的子加密过程中,48位的明文数据要与48位的子密钥进行异或或运算,子密钥的

  产生步骤例如以下:

   a,循环左移:依据循环左移表对C和D进行循环左移,循环左移后的C和D部分作为

    下一轮子密钥的输入数据,直到16轮所有完毕。

   b,将C和D部分合并成为56位数据。

c,压缩型换位2:56的输入数据依据压缩型换位2表输出48位的子密钥,这48位的子密钥

    将与48位的明文数据进行异或操作。

初始置换:

 经过分组后的64位明文分组将依照初始置换表又一次排序次序,进行初始置换,置换方法例如以下:

 初始置换表从左到右,从上到下读取。如第一行第一列为58。意味着将原明文分组的第58位置换

 到第1位,初始置换表的下一个数为50,意味着将原明文的分组的第50位置换到第2位,依次类推。将

 原明文分组的64位所有置换完毕。

          置换表

        58 50 42 34 26 18 10 2

        60 52 44 36 28 20 12 4

        62 54 46 38 30 22 14 6

        64 56 48 40 32 24 16 8

        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

 16轮循环

 经过了初始置换的64位明文数据在中间生成2部分,每部分32位,左半部分L0和右半部分R0.然后

 ,L0和RO进入加密过程。

RO经过一系列的置换得到32位输出,再与L0进行异或运算。其结果成为

 下一轮的R1,R0则成为的L1。如此连续运作16轮。

 异或——XOR

 Ri = Li-1 XOR f(Ri-1,Ki)

 Li = Ri-1(i=1,2,3,4.......16)

 每一轮的循环中,右半部分须要经过一系列的子加密过程,这个子加密过程也叫做f函数,子加密

 过程包含

  a1,扩展置换

  a2,异或运算

  a3,S盒代换

  a4,直接置换

 扩展置换

  32位的右半部分明文数据首先要进行扩展置换,扩展置换将32位的输入数据扩展成48位

  的输出数据。其目的:1,产生了与密钥同长度的数据以进行异或运算;2,它提供了更长

  的结果,使得在以后的子加密过程中能进行压缩。3。它产生雪崩效应。这也是扩展置换、

  最基本的目的,使得输入的一位将影响两个替换,所以输出对输入的依赖性将传播的更快

  (雪崩效应),扩展置换的置换方法更初始置换同样,仅仅是置换表不同,扩展置换表例如以下

   扩展置换表

   32  1 2 3 4 5

   4 5 6 7 8 9

   8 9 10 11 12 13

   12 13 14 15 16 17

   16 17 18 19 20 21

   20 21 22 23 24 25

   24 25 26 27 28 29

   28 29 30 31 32 1

异或运算 同样为0,不同为1

S盒置换

  是算法中最重要的部分,由于其它的运算都是线性的。易于分析,仅仅有S盒是非线性的,它

  比其它不论什么一步都提供了更好的安全性。

  经过异或得到的48位输出数据要经过S盒置换。置换由8个盒完毕,记为S盒。

  每一个S盒都有6位输入,4位输出。

  每一个S盒是不同的,每一个S盒的置换方法例如以下表,用法:48位的输入分成8组。没组6位

  ,分别进入8个S盒,将每一个组的6位输入记为B0B1B2B3B4B5。那么表中的行号由B0,B5决定。

  而列号由B1 B2 B3 B4决定。

比如。第一个分组111000要进入第一个S盒S1。那么行号位10(B0B5)

  即第2行,列号位1100(B1B2B3B4)即第12列,第2行第12列相应的数据为3。所以这个S盒的4位

  输出就是3的二进制0011

  S[1])

  14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7

  0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8

  4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0

  15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13

  S[2]

  15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10

  3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5

  0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15

  13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9

  S[3]

  10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8

  13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1

  13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7

  1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12

  S[4]

  7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15

  13 8 11 5 6 15 0 3 4 7 2 12 1 10 14 9

  10 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4

  3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14

  S[5]

  2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9

  14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6

  4 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14

  11 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3

  S[6]

  12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11

  10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8

  9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6

  4 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13

  S[7]

  4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1

  13 0 11 7 4 9 1 10 14 3 5 12 2 15 8 6

  1 4 11 13 12 3 7 14 10 15 6 8 0 5 9 2

  6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12

  S[8]

  13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7

  1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2

  7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8

  2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11

 直接置换

  盒置换后的32位输出数据将进行直接置换,该置换把每一个输入位映射到输出位。随意一位、

  不能被映射两次,也不能略去。直接置换表的用法与初始置换同样。

   直接置换表  

  16 7 20 21

  29 12 28 17

  1 15 23 26

  5 18 31 10

  2 8 24 14

  32 27 3 9

  19 13 30 6

  22 11 4 25

 终结置换

  终结置换与初始置换相相应。他们都不影响DES的安全性。主要目的是为了更easy的将明文

  和密文数据以字节大小放入DES的f算法中,终结置换表和初始置换表的用法同样。

终结置换表

  40 8 48 16 56 24 64 32

  39 7 47 15 55 23 63 31

  38 6 46 14 54 22 62 30

  37 5 45 13 53 21 61 29

  36 4 44 12 52 20 60 28

  35 3 43 11 51 19 59 27

  34 2 42 10 50 18 58 26

  33 1 41 9  49 17 57 25



                                            子密钥

 C和D要经过16轮类似的操作产生16份子密钥,每一轮子密钥的产生都要经过循环左移和压缩型换位2.

 循环左移要求C部分和D部分要依据循环左移表进行左移,循环左移表给出了每一轮须要循环左移的

 位数,寻黄左移后的C和D部分作为下一轮子密钥的输入数据,直到16轮所有完毕。

 轮数 循环左移位数

 1  1

 2  1

 3  2

 4  2

 5  2

 6  2

 7  2

 8  2

 9  1

 10  2

 11  2

 12  2

 13  2

 14  2

 15  2

 16  1

 经过循环左移之后。C和D部分合并成为56位的数据。之后这56位数据要经过压缩型换位2

 生成终于的48位子密钥,这48位的子密钥将与48位的明文数据进行异或操作。

 压缩型换位2置换表

 14 17 11 24 1 5

 3 28 15 6 21 10

 23 19 12 4 26 8

 16 7 27 20 13 2

 41 52 31 37 47 55

 30 40 51 45 33 48

 44 49 39 56 34 53

 46 42 50 36 29 32



分组password算法的更多相关文章

  1. IP数据报格式 及分组转发算法

    ip数据报分首部和数据两部分组成: 首部分为固定部分和可变部分 版本——占 4 位,指 IP 协议的版本 目前的 IP 协议版本号为 4 (即 IPv4) 首部长度——占 4 位,可表示的最大数值 是 ...

  2. List对象分组排序算法

    场景: List里面的对象是订单的节点,比如我们快递的物流状态,这个是需要有序的,所以需要根据订单号进行分组排序. import java.util.ArrayList; import java.ut ...

  3. js分组排序算法, OrderBy

    由于项目中需要对数据进行分组排序,类似于sql中 order by column1,column2....  实现的关键是 分组排序,第一个column1,排序完成之后,对其分组,然后按照column ...

  4. 【java】将List中的实体按照某个字段进行分组的算法

    如何将List中存放的实体按照某个字段进行分组呢?来看看下面的例子,假如实体中有个字段叫批次号,我们将具有相同批次号的实体放在一起,那么怎么实现呢?看下面的代码: 可以定义个Map,Map的key用于 ...

  5. Java将List中的实体按照某个字段进行分组的算法

    public void test() { List<User> list = new ArrayList<>(); //User 实体 测试用 String id,name; ...

  6. 基于CIDR的IP分组转发算法

       话不多说,直接上运行截图         #include<iostream> #include<vector> using namespace std; struct ...

  7. 【原创】SM4password算法源代码接口具体解释

    [原创]SM4password算法源代码接口具体解释 近期几天想把cryptdb的加密算法换成国产的sm4加密算法.所以花了时间研究了一下sm4的源代码和基本原理,避免忘记,写下这篇博客以作记录. 先 ...

  8. 改进的SMS4算法的差分故障与暴力联合攻击

    改进的SMS4算法的差分故障与暴力联合攻击 (1.中国科学院研究生院,北京100049) 摘要SMS4是在国内正式使用并于2006年发布的第一个用于无线局域网的商用分组password算法.文中研究了 ...

  9. Linux Kernel(Android) 加密算法总结(一)(cipher、compress、digest)

    1. Linux内核支持哪些加密算法 ? 内核支持的加密算法非常多,包含: 对称加密算法.如AES,3DES. 对称password体制的发展趋势将以分组password为重点. 分组password ...

随机推荐

  1. linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】

    转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July  ...

  2. UVA 10803 Thunder Mountain

    纠结在这句话了If it is impossible to get from some town to some other town, print "Send Kurdy" in ...

  3. 理解python的super

    def super(cls, inst): mro = inst.__class__.mro() return mro[mro.index(cls) + 1] super做了这些事 摘自:https: ...

  4. Pom报错

    maven的pom报plugins错误的解决方法 maven的pom报plugins错误的解决方法. 引用 Failure to transfer org.apache.maven.plugins:m ...

  5. hdu 2112(字典树+最短路)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. Java屌炸天学习路线图

            第一阶段:Java基础篇 编号 课程 课程目录 打包下载地址 讲师 01 J2SE(40课时) http://www.java1234.com/zy001.html http://pa ...

  7. react 利用react-hammerjs插件实现滑动特效和点击特效

    react-hammerjs是一款由hammer.js的JS插件来实现在react中实现手势滑动的事件插件, 它有各种各样的手势支持效果,这里我们就使用下它最简单的3种效果来实现我们要的动画 分别是点 ...

  8. [UML] Use Case 是什么

    虽然每个人使用系统的场景有所差异,但是若用户的目标是相同的,则其场景会极为类似.那么这些类似的场景的集合就是类,这种类就称为Use Case.其实例就是场景

  9. ECNU 3462 最小 OR 路径 (贪心 + 并查集)

    题目链接  EOJ Monthly 2018.1 Problem F 先假设答案的每一位都是$1$,然后从高位开始,选出那些该位置上为$0$的所有边,并查集判断连通性. 如果$s$和$t$可以连通的话 ...

  10. linux下安装 tomcat

    1.首先配置jdk,上篇文章中有具体的介绍. 2.官网下载tomcat:https://tomcat.apache.org/download-80.cgi (下载 tar.gz 的版本 ) 3.上传压 ...