DES算法的加密解密及其Ruby实现

目录

前言

DES算法中的表格

1 IP与IP-1

 2 PC1与PC2

 3 S盒、E盒、P盒

4 移位表

数据组

1

2

 #3 一个64位随机二进制生成器(Ruby)

DES算法加解密的Ruby实现

1 算法文件构成

2 DES_primo.rb

3 DES_main.rb


前言

关于DES算法的加解密流程网上的资料其实已经够多了,所以本文并不会再复述这些流程。而本文中实现DES算法的编程语言Ruby的语法与现行的主流语言语法存在较大差别,因而恐怕也很难让读者利用。所以相比于网上其他关于DES算法的文章,本文的侧重点在于数据:我会提供一组较为详尽的数据给想要调试算法的读者,帮助他们排除错误。

DES算法中的表格

1 IP与IP-1

 
 

 $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 ] #ip置换表 8*8

    $ipr=[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 ] #逆转ip置换表 8*8

 2 PC1与PC2

 
 

$pc1=[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] #pc1置换表 8*7

    $pc2=[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 ] #pc2置换表 8*6

 3 S盒、E盒、P盒

 
 

$eBox=[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] #E盒 6*8

    $sBox=[ 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,#des算法s盒

            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,

            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,10,5,14,9,

            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,

            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,

            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,

            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,

            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,

            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] #S盒 8*4*16

    $pBox=[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] #P盒 4*8 32位

4 移位表

$move=[1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1] #移位表 

 

数据组

1

密钥:0001001000111101101010110111011110011111011001011000000001100111

K 0 000011100011001001101100011011010010011100011101

K 1 011000011010010110010101101101101001011011100001

K 2 010101011000010010010011010110101010111101100111

K 3 011101111000000010110010001111101110110110011000

K 4 101111101000000010000110011010010111010101010011

K 5 001110100000001000011110111011111110000000101010

K 6 001011000001000000111100111001000101111101001110

K 7 100001100000100001111100100111001001001011111110

K 8 010100001100010111010011110010010110010101111100

K 9 011101011100000100000111011010011111101010001100

K10 001000111000000110000111111100000101010010111111

K11 001110010000000010110111100011110001101010101111

K12 101101010000000010111000100101100111101111110001

K13 100101100000001010110100001100111000101101110101

K14 100111100001101000010100110100111010110110010010

K15 011000010110110100000011100101011011001111001111

原文:0000000100100011010001010110011110001001101010111100110111101111

E(R1) 011110100001010101010101011110100001010101010101

E(R)^K 011101000010011100111001000101110011001001001000

S(E(R)^K) 00110001001011000010111001000110

P(S(E(R)^K)) 00010000001100100101001011101110

P(S(E(R)^K))^L 11011100001100101001111000010001

R1 11011100001100101001111000010001

L1 11110000101010101111000010101010

E(R2) 111011111000000110100101010011111100000010100011

E(R)^K 100011100010010000110000111110010101011001000010

S(E(R)^K) 11001110000111111110110100100010

P(S(E(R)^K)) 11010101110011101011010011011000

P(S(E(R)^K))^L 00100101011001000100010001110010

R2 00100101011001000100010001110010

L2 11011100001100101001111000010001

E(R3) 000100001010101100001000001000001000001110100100

E(R)^K 010001010010111110011011011110100010110011000011

S(E(R)^K) 10100111011110101001111001011111

P(S(E(R)^K)) 01111111111100110100101001111100

P(S(E(R)^K))^L 10100011110000011101010001101101

R3 10100011110000011101010001101101

L3 00100101011001000100010001110010

E(R4) 110100000111111000000011111010101000001101011011

E(R)^K 101001111111111010110001110101000110111011000011

S(E(R)^K) 01001001101010010000111100101111

P(S(E(R)^K)) 10011000001010101110110101101100

P(S(E(R)^K))^L 10111101010011101010100100011110

R4 10111101010011101010100100011110

L4 10100011110000011101010001101101

E(R5) 010111111010101001011101010101010010100011111101

E(R)^K 111000010010101011011011001111000101110110101110

S(E(R)^K) 00110111100110100001010010000010

P(S(E(R)^K)) 01100100010000100100001101011011

P(S(E(R)^K))^L 11000111100000111001011100110110

R5 11000111100000111001011100110110

L5 10111101010011101010100100011110

E(R6) 011000001111110000000111110010101110100110101101

E(R)^K 010110101111111000011001001001010000100110000111

S(E(R)^K) 11000010010100010100000011011000

P(S(E(R)^K)) 11001110100101011000000000000001

P(S(E(R)^K))^L 01110011110110110010100100011111

R6 01110011110110110010100100011111

L6 11000111100000111001011100110110

E(R7) 101110100111111011110110100101010010100011111110

E(R)^K 100101100110111011001010011100010111011110110000

S(E(R)^K) 10001011010101101110111000010000

P(S(E(R)^K)) 01010111111011010101000010001000

P(S(E(R)^K))^L 10010000011011101100011110111110

R7 10010000011011101100011110111110

L7 01110011110110110010100100011111

E(R8) 010010100000001101011101011000001111110111111101

E(R)^K 110011000000101100100001111111000110111100000011

S(E(R)^K) 10111111001100110011111110011111

P(S(E(R)^K)) 11111110111010100110101010111111

P(S(E(R)^K))^L 10001101001100010100001110100000

R8 10001101001100010100001110100000

L8 10010000011011101100011110111110

E(R9) 010001011010100110100010101000000111110100000001

E(R)^K 000101010110110001110001011010010001100001111101

S(E(R)^K) 01111101010010010000011001100110

P(S(E(R)^K)) 10000000001110111100011001111010

P(S(E(R)^K))^L 00010000010101010000000111000100

R9 00010000010101010000000111000100

L9 10001101001100010100001110100000

E(R10) 000010100000001010101010100000000011111000001000

E(R)^K 011111111100001110101101111010011100010010000100

S(E(R)^K) 10000010010111010011010111001000

P(S(E(R)^K)) 11101100100100010011000011001001

P(S(E(R)^K))^L 01100001101000000111001101101001

R10 01100001101000000111001101101001

L10 00010000010101010000000111000100

E(R11) 101100000011110100000000001110100110101101010010

E(R)^K 100100111011110010000111110010100011111111101101

S(E(R)^K) 11100101000101011001001111001000

P(S(E(R)^K)) 10101101101100001111001000010001

P(S(E(R)^K))^L 10111101111001011111001111010101

R11 10111101111001011111001111010101

L11 01100001101000000111001101101001

E(R12) 110111111011111100001011111110100111111010101011

E(R)^K 111001101011111110111100011101010110010000000100

S(E(R)^K) 10101111011110001000010000111000

P(S(E(R)^K)) 01001111100010010100011001011100

P(S(E(R)^K))^L 00101110001010010011010100110101

R12 00101110001010010011010100110101

L12 10111101111001011111001111010101

E(R13) 100101011100000101010010100110101010100110101010

E(R)^K 001000001100000111101010000011001101001001011011

S(E(R)^K) 00100011100110111011100101001110

P(S(E(R)^K)) 11111101010100100110001111100000

P(S(E(R)^K))^L 01000000101101111001000000110101

R13 01000000101101111001000000110101

L13 00101110001010010011010100110101

E(R14) 101000000001010110101111110010100000000110101010

E(R)^K 001101100001011100011011111110011000101011011111

S(E(R)^K) 11011101001010101110111001000010

P(S(E(R)^K)) 00010001111111101100000011011110

P(S(E(R)^K))^L 00111111110101111111010111101011

R14 00111111110101111111010111101011

L14 01000000101101111001000000110101

E(R15) 100111111111111010101111111110101011111101010110

E(R)^K 000000011110010010111011001010010001001011000100

S(E(R)^K) 11101010110101111010011010011000

P(S(E(R)^K)) 11001111111010011001001110001001

P(S(E(R)^K))^L 10001111010111100000001110111100

R15 10001111010111100000001110111100

L15 00111111110101111111010111101011

E(R16) 010001011110101011111100000000000111110111111001

E(R)^K 001001001000011111111111100101011100111000110110

S(E(R)^K) 11100110000111101100010100001101

P(S(E(R)^K)) 01001101110001001011101001111000

P(S(E(R)^K))^L 01110010000100110100111110010011

R16 01110010000100110100111110010011

L16 10001111010111100000001110111100

密文:1001110111111101101001101010011001110011010000100110010010000011

2

密钥:1110000110000000010011001100011110011111110001011101100100100000

K 0 000010101101101100111011101010010100011000000001

K 1 101111111100001011000001001100110001101000100000

K 2 000110110101001110011110000100000000100100110110

K 3 001111000001000111011101000001010010100010010100

K 4 000101110100100001101101011000010010000011010001

K 5 100010110110100110110100001000111000000000001111

K 6 100111000010111110101101000001100001010110000110

K 7 110100110011011000101001000011000000000111100101

K 8 011110001010100010101111011001000110000001100000

K 9 101100011010010000111010011000001010100001001010

K10 111001000000111010110110101001001001010000011010

K11 111101101011101000010100000011010001011001100010

K12 000011101011011001110010000111001100100001100000

K13 111011100101010001111110000000001100110001010100

K14 111011101100001101001000100010011010010010010000

K15 111101110001000111110011100000010011001000111001

原文:1011101100111011000101001110001010011101110100100010000111101101

E(R1) 110111110011111001010111110010100110100101010111

E(R)^K 110101011110010101101100011000110010111101010110

S(E(R)^K) 00111010010101111101000000111110

P(S(E(R)^K)) 11101111010011110001011000100010

P(S(E(R)^K))^L 01000111011110001000001011110001

R1 01000111011110001000001011110001

L1 10111001110010111001001100101011

E(R2) 101000001110101111110001010000000101011110100010

E(R)^K 000111110010100100110000011100110100110110000010

S(E(R)^K) 01001000010011111110010010000010

P(S(E(R)^K)) 10000001010011111001000011001001

P(S(E(R)^K))^L 00111000100001000000001111100010

R2 00111000100001000000001111100010

L2 01000111011110001000001011110001

E(R3) 000111110001010000001000000000000111111100000100

E(R)^K 000001000100011110010110000100000111011000110010

S(E(R)^K) 00001000100001010100001001010110

P(S(E(R)^K)) 10000010001111100001000100100000

P(S(E(R)^K))^L 11000101010001101001001111010001

R3 11000101010001101001001111010001

L3 00111000100001000000001111100010

E(R4) 111000001010101000001101010010100111111010100011

E(R)^K 110111001011101111010000010011110101011000110111

S(E(R)^K) 11100010011100010000000101010000

P(S(E(R)^K)) 11000110100100011010001000000100

P(S(E(R)^K))^L 11111110000101011010000111100110

R4 11111110000101011010000111100110

L4 11000101010001101001001111010001

E(R5) 011111111100000010101011110100000011111100001101

E(R)^K 011010001000100011000110101100010001111111011100

S(E(R)^K) 10010110101000110111011011001100

P(S(E(R)^K)) 11101000111101000000000110111111

P(S(E(R)^K))^L 00101101101100101001001001101110

R5 00101101101100101001001001101110

L5 11111110000101011010000111100110

E(R6) 000101011011110110100101010010100100001101011100

E(R)^K 100111101101010000010001011010011100001101010011

S(E(R)^K) 00100100000101000000010100010101

P(S(E(R)^K)) 00000110000000000011101000111000

P(S(E(R)^K))^L 11111000000101011001101111011110

R6 11111000000101011001101111011110

L6 00101101101100101001001001101110

E(R7) 011111110000000010101011110011110111111011111101

E(R)^K 111000110010111100000110110010010110101101111011

S(E(R)^K) 00111000111000111001010010100101

P(S(E(R)^K)) 10100001010010010000111100101111

P(S(E(R)^K))^L 10001100111110111001110101000001

R7 10001100111110111001110101000001

L7 11111000000101011001101111011110

E(R8) 110001011001011111110111110011111010101000000011

E(R)^K 000101101010000111011110110000111010101111100110

S(E(R)^K) 01110100100111111111110101110001

P(S(E(R)^K)) 10110111010101001011111111011010

P(S(E(R)^K))^L 01001111010000010010010000000100

R8 01001111010000010010010000000100

L8 10001100111110111001110101000001

E(R9) 001001011110101000000010100100001000000000001000

E(R)^K 010111010100001010101101111101001110000001101000

S(E(R)^K) 10110010001111010101100011011001

P(S(E(R)^K)) 11111110100101000001101001000111

P(S(E(R)^K))^L 01110010011011111000011100000110

R9 01110010011011111000011100000110

L9 01001111010000010010010000000100

E(R10) 001110100100001101011111110000001110100000001100

E(R)^K 100010111110011101100101101000000100000001000110

S(E(R)^K) 00011111111100001010101011010100

P(S(E(R)^K)) 01010111001110010100000110110111

P(S(E(R)^K))^L 00011000011110000110010110110011

R10 00011000011110000110010110110011

L10 01110010011011111000011100000110

E(R11) 100011110000001111110000001100001011110110100110

E(R)^K 011010110000110101000110100101000010100110111100

S(E(R)^K) 10010101111000111100000111010101

P(S(E(R)^K)) 10000011110101010110100100110111

P(S(E(R)^K))^L 11110001101110101110111000110001

R11 11110001101110101110111000110001

L11 00011000011110000110010110110011

E(R12) 111110100011110111110101011101011100000110100011

E(R)^K 000011001000011111100001011110001101011111000001

S(E(R)^K) 11110110000100111001100101100001

P(S(E(R)^K)) 11110101110100001010111000010010

P(S(E(R)^K))^L 11101101101010001100101110100001

R12 11101101101010001100101110100001

L12 11110001101110101110111000110001

E(R13) 111101011011110101010001011001010111110100000011

E(R)^K 111110110000101100100011011110011011010101100011

S(E(R)^K) 00000101001111111001101101010001

P(S(E(R)^K)) 10110111011100000111100001010100

P(S(E(R)^K))^L 01000110110010101001011001100101

R13 01000110110010101001011001100101

L13 11101101101010001100101110100001

E(R14) 101000001101011001010101010010101100001100001010

E(R)^K 010011101000001000101011010010100000111101011110

S(E(R)^K) 01101010011000010101100100110111

P(S(E(R)^K)) 11110010000011111010111000100100

P(S(E(R)^K))^L 00011111101001110110010110000101

R14 00011111101001110110010110000101

L14 01000110110010101001011001100101

E(R15) 100011111111110100001110101100001011110000001010

E(R)^K 011000010011111001000110001110010001100010011010

S(E(R)^K) 01010000101100110110011001000000

P(S(E(R)^K)) 10000100011101001000000110001110

P(S(E(R)^K))^L 11000010101111100001011111101011

R15 11000010101111100001011111101011

L15 00011111101001110110010110000101

E(R16) 111000000101010111111100000010101111111101010111

E(R)^K 000101110100010000001111100010111100110101101110

S(E(R)^K) 01111100000100110010101100000010

P(S(E(R)^K)) 10010100011010101010001010010010

P(S(E(R)^K))^L 10001011110011011100011100010111

R16 10001011110011011100011100010111

L16 11000010101111100001011111101011

密文:0101111111101111001111010111001000101001001000101001011011110110

 

 #3 一个64位随机二进制生成器(Ruby)

a=Array.new(64,3)

a.each do 

    case rand

    when 0...0.5

        a=0

    when 0.5..1

        a=1

    end

    print a

end

DES算法加解密的Ruby实现

由于我的环境是windows下,加解密不便使用经过编码的字符串,这里的函数输入输出的都是64位二进制。

1 算法文件构成

-DES_Primo.rb DES函数的类

-DES_main.rb 相当于main函数在的文件

2 DES_primo.rb

本文件中方法的“fromBinary”与“toBinary”实际并未用到,但是有规范输入输出的作用。

#----------------------------------------------

#des算法的类 #实在是看不懂Ruby为什么要给模块设置私有 

#----------------------------------------------

class DES

#----------------------------------------------

#全局变量范围

#----------------------------------------------

    $mode #运算模式

    $cipher="" #密钥

    $ncalculate_text="" #用户输入的raw data

    $block=[] #输入的数据组织成64位块的形式

    $k=Array.new(16) {Array.new 48} #循环密钥

    $calculate_text="" #结果

    $len=0 #块的数量

    $eBox=[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] #E盒 6*8

    $sBox=Array.new(8) {Array.new(4) {Array.new 16}} #S盒 8*4*16 它的置换算法很特别 #为了我的手,这只是个表面上的三维数组

    $sBox=[ 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,#des算法s盒

            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,

            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,10,5,14,9,

            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,

            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,

            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,

            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,

            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,

            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]

    $pBox=[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] #P盒 4*8 32位

    $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 ] #ip置换表 8*8

    $ipr=[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 ] #逆转ip置换表 8*8

    $pc1=[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] #pc1置换表 8*7

    $move=[1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1] #移位表

    $pc2=[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 ] #pc2置换表 8*6

#-----------------------------------------------

#方法范围

#-----------------------------------------------

    def toBinary(str) #将字符串转换成n*八位二进制字符串

        # str :输入的字符串

        re=""

        str.each_char do |i|

            x=i.ord.to_s(2) #转换成二进制字符串

            (1..8-x.length).each do

                re+='0' #补足0

            end

            re+=x #加上字符串,现在它的长度为8的倍数

        end

        return re

    end

    def fromBinary(code) #将二进制以8位为一组转换成字符串

        re=""

        (0...code.length/8).each do |m|

            re+=code[m*8+0...m*8+8].to_i(2).chr #ascii转字母

        end

        return re

    end 

    def substitute(arr,rect) #算法中所有压缩/转置操作

        # arr :待压缩的串

        # rect:转置/压缩的矩阵(其实就是个数组)

        re=""

        rect.each do |m|

            re+=arr[m-1]

        end

        return re

    end

    def toCipher(cipher) #将用户输入的密码转换为循环密钥

        # cipher :用户输入的密码

        if cipher.length>64

            cipher=cipher[0...64] #截取64位

        elsif cipher.length<64

            (0...64-cipher.length).each do

                cipher+="0"

            end

        end #密码规整为64位

        re=pc1_sub cipher #pc1压缩 压缩后为56位

        c0=re[0...28]

        d0=re[28...56] #分割出c0、d0(各28位)

        c=Array.new 17 

        d=Array.new 17 #分割后的迭代密钥

        c[0]=c0

        d[0]=d0

        (1..16).each do |m|

            n=$move[m-1] #对于第m轮密钥,其相比于上一轮要左移的位数n

            _x=c[m-1][0...n] #切割下来的数组

            c[m]=c[m-1][n...28]+_x #这是什么,这是左移

            _y=d[m-1][0...n]

            d[m]=d[m-1][n...28]+_y

        end #对cd左右移16轮,得到16轮密钥 #记住是十六轮,也就是c0d0不算的

        sk=Array.new(16)

        (1..16).each do |m|

            sk[m-1]=c[m]+d[m] #合并两个迭代过的部分

        end

        x=Array.new(16) {Array.new 48} #我随意取,也请读者将就看看

        (0...16).each do |m|

            (0...48).each do |n|

                x[m][n]=sk[m][$pc2[n]-1] 

            end 

        end#pc2压缩 压缩后为48位

        $k=x

    end

    M,X,Y=16*4,16,1 #在模仿亲爱的三维数组

    def SSubstitute(arr) #S盒置换

        # arr :某个xor运算过后的Rn

        re=""

        (0...arr.length/6).each do |m|

            x=(arr[m*6+0]+arr[m*6+5]).to_i 2 #取出第一位和第六位合成十进制

            y=arr[m*6+1..m*6+4].to_i 2

            _re=$sBox[m*M+x*X+y*Y].to_s 2

            (0...4-_re.length).each do

                re+='0'

            end #规范位数

            re+=_re  

        end

        return re

    end

    def getBinary64 #将用户的输入完整的转换为n个64位块

        bina=$ncalculate_text #输入转换为二进制串

        len=(bina.length/64).to_i  #取整

        oro_len=bina.length

        re64=Array.new(len) #这是返回的64位数组

        (0..len).each do |m|

            re64[m]=bina[m*64...m*64+64]

        end

        (oro_len-len*64...64).each do

            re64[len]+="0" 

        end #填充到64的倍数

        $block=re64

        if oro_len%64 != 0 then len+=1 end #获取真正的规范后的长度,要考虑刚好整除的情况

        $len64=len

    end

    def code #整个运算过程

        # 根据传入的块决定是加密($k)还是解密(倒转$k)

        re=""

        getBinary64

        (0...$len64).each do |m| #遍历所有输入的64位块

            ipmain=ip_sub $block[m] #对第n个块进行IP置换

            ipL=ipmain[0...32]

            ipR=ipmain[32...64] #切片 

            (0...16).each do |n| #16轮运算,也就是f

                ipR_e=e_sub ipR #Rn经过E盒扩展成48位 

                ipR_xor=DESxor(ipR_e,$k[yield n]) #扩展后的右半部分与Kn进行异或(解密时是K15-n) 

                ipR_s=SSubstitute ipR_xor #S盒置换 压缩到32位

                ipR_p=p_sub ipR_s #P盒置换

                ipR_p_xor=DESxor(ipR_p,ipL) #置换回32位后后右边与左边异或

                ipL=ipR

                ipR=ipR_p_xor #交换左右部分

            end

            ipR16=ipL

            ipL16=ipR #最后的交换

            _cipher=ipL16+ipR16 #与最后密文差一个ip-1的密文

            re+=ipr_sub _cipher #ip-1置换

        end

        return re #返回所有密文的二进制

    end

#----------------------------------------------

#二阶引用(也就是比较简单的派生方法)

#----------------------------------------------

    def ip_sub(arr) #ip转置

        # arr :被转置的64位数组

        return substitute(arr,$ip)

    end

    def ipr_sub(arr) #ip-1转置

        # arr :被转置的64位数组

        return substitute(arr,$ipr)

    end

    def e_sub(arr) #E盒替换

        # arr :被替换的Rn

        return substitute(arr,$eBox)

    end

    def pc1_sub(arr) #pc1置换

        # arr :被置换的初始key

        return substitute(arr,$pc1)

    end

    def DESxor(arr1,arr2) #两个数组间的异或

        # arr1、arr2:两个异或数组输入

        re=""

        (0...arr1.length).each do |m|

            re+=(arr1[m].to_i^arr2[m].to_i).to_s

        end

        return re

    end

    def p_sub(arr) #P盒置换

        # arr :被置换的Rn

        return substitute(arr,$pBox)

    end

    def ui

        puts "请输入你的密钥:"

        toCipher gets.chomp #密钥的输入 #顺便转换为16循环二进制串了

        choc="1"

        until choc=='y'

            puts "请输入待加密/解密的数据:"

            $ncalculate_text=gets.chomp #数据的输入

            getBinary64 #$ncalculate_text转换到$block

            puts "需要加密还是解密呢?(t/f)"

            case gets[0]

            when "t"

                puts code {|m| m}

            when "f"

                puts code {|m| 15-m}

            end

            puts "是否跳出?(y/n)"

            choc=gets[0]

        end

    end

end

3 DES_main.rb

$LOAD_PATH << '.'

require 'DES_Primo'

DES.new.ui

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值