zoukankan      html  css  js  c++  java
  • DES加密

    des加密算法 ---Data Encryption Algorithm  称为数据加密算法 (数字加密标准)

     传统的密码加密都是由古代的循环移位思想而来
    加密原理:
     DES使用一个56位的密匙以及附加的八位奇偶校验位(每组的第八位为奇偶校验位)产生最大64位的分组大小,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 轮循环,使用异或,置换,代换,移位操作四种基本运算。
     DES算法的安全性
    一.安全性比较高的一种算法,目前只有一种方法可以破解该算法,那就是穷举法.
    二.采用64位密钥技术,实际只有56位有效,8位用来校验的.譬如,有这样的一台PC机器,它能每秒计算一百万次,那么256位空间它要穷举的时间为2285年.所以这种算法还是比较安全的一种算法.

    DES算法的入口参数有三个:
     Key, Data, Mode

    Key 为64bit密钥, Data为64bit数据,Mode为加密还是解密。

    加密过程:DES的流程基本是执行16轮下面的运算
     1 初始变换Initial Permutation
     2 右边32位f函数
     2.1 E置换
     2.2 与轮密钥XOR
     2.3 S盒替换
     2.4 P置换
     2.5 和左边32位XOR
     3 左右交换,最终变换final permutation
     需要特别注意的是,最后一轮是不需要做左右交换这一部的。

    具体细则如下:
    :处理密钥
    1-1、变换密钥 (查看ASCLL表,将8位的密钥转换为如下8进制表示的数)

    取得64位的密钥,每个第8位作为奇偶校验位。 

    1-2、变换密钥。 (第一次置换该64位数的位置)

    Permuted Choice 1 (PC-1) 
    57 49 41 33 25 17 9 
    1 58 50 42 34 26 18 
    10 2 59 51 43 35 27 
    19 11 3 60 52 44 36 
    63 55 47 39 31 23 15 
    7 62 54 46 38 30 22 
    14 6 61 53 45 37 29 
    21 13 5 28 20 12 4 
    1-2-1、舍弃64位密钥中的奇偶校验位,根据下表(PC-1)进行密钥变换得到56位的密钥,在 变换中,奇偶校验位以被舍弃。即把8位的密钥所转换的二进制码最后一位舍弃,得到56位按下表排列(第二次置换)

    57 49 41 33 25 17 9
    1 58 50 42 34 26 18
    10 2 59 51 43 35 27
    19 11 3 60 52 44 36
    63 55 47 39 31 23 15
    7 62 54 46 38 30 22
    14 6 61 53 45 37 29
    21 13 5 28 20 12 4
    1-2-2、将变换后的密钥分为两个部分,开始的28位称为C[0],最后的28位称为D[0]。 

    1-2-3、生成16个子密钥,初始I=1。 (循环左移,生成16个子密钥)

     计算16个子密钥,计算方法C[i][28] D[i][28]为对前一个C[i-1][28], D[i-1][28]做循环左移操作。16次的左移位数如下表:

     1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16   (第i次)
     1,  1,  2,  2,  2,  2,  2,  2,  1,   2,  2,   2,   2,   2,   2,  1    (左移位数)

    1-2-3-2、将C[I]D[I]作为一个整体按下表(PC-2)变换,得到48位的K[I] (置换子密钥得到48位的密钥)
     
    Permuted Choice 2 (PC-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
    1-2-3-3、从1-2-3-1处循环执行,直到K[16]被计算完成。最后得到16个48位的子密钥

    表的意思是第14位移到第1位,第17位移到第2位,以此类推。在此过程中,发现第9,18,22,25, 35,38,43,54位丢弃。

    结果:得到16个48位的子密钥

    :处理64位数据

    2-1、取得64位的数据,如果数据长度不足64位,应该将其扩展为64位(例如补零) 

    2-2、将64位数据按下表变换(IP) (第一次置换数据)
    Initial Permutation (IP)
    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
    2-3、将变换后的数据分为两部分,开始的32位称为L[0],最后的32位称为R[0]。(分为两部分,依次加密)

    2-4、用16个子密钥加密数据,初始I=1。

    2-4-1、将32位的R[I-1]按下表(E)扩展为48位的E[I-1] (扩展数据为48位)
    Expansion (E)
    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
    此时密钥和数据都是48位了,进行异或运算

    2-4-2、异或E[I-1]和K[I],即E[I-1] XOR K[I] 

    2-4-3、将异或后的结果分为8个6位长的部分,第1位到第6位称为B[1],第7位到第12位称为B[2],依此类推,第43位到第48位称为B[8]。  ---得到一个二维数组,八个元素B[8][6]

    2-4-4、按S表变换所有的B[J],初始J=1。所有在S表的值都被当作4位长度处理。 

    2-4-4-1、将B[J]的第1位和第6位组合为一个2位长度的变量M,M作为在S[J]中的行号。 

    2-4-4-2、将B[J]的第2位到第5位组合,作为一个4位长度的变量N,N作为在S[J]中的列号。 

    2-4-4-3、用S[J][M][N]来取代B[J]。 (将加密异或运算结果替换成S表中的0-15的数)
    Substitution Box 1 (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

    2-4-4-4、从2-4-4-1处循环执行,直到B[8]被替代完成。 

    结果:得到八个用0000-1111表示的数,共32位

    2-4-4-5、将B[1]到B[8]组合,按下表(P)变换,得到P。 (置换得到的32位数)
    Permutation P
    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 

    2-4-6、异或P和L[I-1]结果放在R[I],即R[I]=P XOR L[I-1]。 

    2-4-7、L[I]=R[I-1] (此处我们用的是L[0]与P运算的到结果放在R[1],将没有用到的R[0]放到L[1]进行下一轮)

    2-4-8、从2-4-1处开始循环执行,直到K[16]被变换完成。 

    2-4-5、组合变换后的R[16]L[16],按下表(IP-1)变换得到最后的结果。
    Final Permutation (IP**-1)
    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
    以上就是DES算法的描述。

    以上是Des的加密过程,解密过程同样,只需要把16个子密钥K[i][48]的顺序颠倒过来就行了。

  • 相关阅读:
    (Java) LeetCode 44. Wildcard Matching —— 通配符匹配
    (Java) LeetCode 30. Substring with Concatenation of All Words —— 与所有单词相关联的字串
    (Java) LeetCode 515. Find Largest Value in Each Tree Row —— 在每个树行中找最大值
    (Java) LeetCode 433. Minimum Genetic Mutation —— 最小基因变化
    (Java) LeetCode 413. Arithmetic Slices —— 等差数列划分
    (Java) LeetCode 289. Game of Life —— 生命游戏
    (Java) LeetCode 337. House Robber III —— 打家劫舍 III
    (Java) LeetCode 213. House Robber II —— 打家劫舍 II
    (Java) LeetCode 198. House Robber —— 打家劫舍
    (Java) LeetCode 152. Maximum Product Subarray —— 乘积最大子序列
  • 原文地址:https://www.cnblogs.com/juniorjava/p/7055700.html
Copyright © 2011-2022 走看看