打印本文 打印本文 关闭窗口 关闭窗口
用vb实现DES加解密算法(三)--解密
作者:武汉SEO闵涛  文章来源:敏韬网  点击数5068  更新时间:2009/4/23 18:59:36  文章录入:mintao  责任编辑:mintao
sp;   Next
    C15(26) = C14(0)
    D15(26) = D14(0)
    C15(27) = C14(1)
    D15(27) = D14(1)
   
    ''''组合C15,D15成C_D
    For i = 0 To 27
        C_D(i) = C15(i)
        C_D(i + 28) = D15(i)
    Next
   
    ''''PC_2转换,生成K15
    For i = 0 To 47
        K15(i) = C_D(PC_2(i))
    Next
   
    ''''***************************************************K16
    ''''生成C16,D16
    For i = 0 To 26
        C16(i) = C15(i + Lsi(16))
        D16(i) = D15(i + Lsi(16))
    Next
    C16(27) = C15(0)
    D16(27) = D15(0)
   
    ''''组合C16,D16成C_D
    For i = 0 To 27
        C_D(i) = C16(i)
        C_D(i + 28) = D16(i)
    Next
   
    ''''PC_2转换,生成K16
    For i = 0 To 47
        K16(i) = C_D(PC_2(i))
    Next
   
    ''''**************************************************************************************
   
    ''''加密过程
''''将明文位数扩展为8的倍数
If (UBound(sCode) + 1) Mod 8 > 0 Then ReDim Preserve sCode(((UBound(sCode) + 1) \ 8 + 1) * 8 - 1)
''''定义返回密文长度
ReDim bReturn(UBound(sCode))

For j = 0 To UBound(sCode) Step 8
    CopyMemory tempCode(0), sCode(j), 8
    For i = 0 To 7
        BinCode(i * 8 + 0) = (tempCode(i) And &H80) \ &H80
        BinCode(i * 8 + 1) = (tempCode(i) And &H40) \ &H40
        BinCode(i * 8 + 2) = (tempCode(i) And &H20) \ &H20
        BinCode(i * 8 + 3) = (tempCode(i) And &H10) \ &H10
        BinCode(i * 8 + 4) = (tempCode(i) And &H8) \ &H8
        BinCode(i * 8 + 5) = (tempCode(i) And &H4) \ &H4
        BinCode(i * 8 + 6) = (tempCode(i) And &H2) \ &H2
        BinCode(i * 8 + 7) = (tempCode(i) And &H1) \ &H1
    Next
   
    ''''IP置换
    For i = 0 To 63
        CodeIP(i) = BinCode(IP(i))
    Next
   
    ''''分段
    For i = 0 To 31
        R0(i) = CodeIP(i)
        L0(i) = CodeIP(i + 32)
    Next
   
    ''''进行第一次迭代
    For i = 0 To 47
        CodeE(i) = R0(E(i))                 ''''经过E变换扩充,由32位变为48位
        CodeE(i) = CodeE(i) Xor K16(i)        ''''与K16按位作不进位加法运算
    Next
   
    ''''分8组
    For i = 0 To 5
        CodeS1(i) = CodeE(i)
        CodeS2(i) = CodeE(i + 6)
        CodeS3(i) = CodeE(i + 12)
        CodeS4(i) = CodeE(i + 18)
        CodeS5(i) = CodeE(i + 24)
        CodeS6(i) = CodeE(i + 30)
        CodeS7(i) = CodeE(i + 36)
        CodeS8(i) = CodeE(i + 42)
    Next
   
    ''''S盒运算,得到8个数
   
        S(0) = S1(CodeS1(5) + CodeS1(0) * 2, CodeS1(4) + CodeS1(3) * 2 + CodeS1(2) * 4 + CodeS1(1) * 8)
        S(1) = S2(CodeS2(5) + CodeS2(0) * 2, CodeS2(4) + CodeS2(3) * 2 + CodeS2(2) * 4 + CodeS2(1) * 8)
        S(2) = S3(CodeS3(5) + CodeS3(0) * 2, CodeS3(4) + CodeS3(3) * 2 + CodeS3(2) * 4 + CodeS3(1) * 8)
        S(3) = S4(CodeS4(5) + CodeS4(0) * 2, CodeS4(4) + CodeS4(3) * 2 + CodeS4(2) * 4 + CodeS4(1) * 8)
        S(4) = S5(CodeS5(5) + CodeS5(0) * 2, CodeS5(4) + CodeS5(3) * 2 + CodeS5(2) * 4 + CodeS5(1) * 8)
        S(5) = S6(CodeS6(5) + CodeS6(0) * 2, CodeS6(4) + CodeS6(3) * 2 + CodeS6(2) * 4 + CodeS6(1) * 8)
        S(6) = S7(CodeS7(5) + CodeS7(0) * 2, CodeS7(4) + CodeS7(3) * 2 + CodeS7(2) * 4 + CodeS7(1) * 8)
        S(7) = S8(CodeS8(5) + CodeS8(0) * 2, CodeS8(4) + CodeS8(3) * 2 + CodeS8(2) * 4 + CodeS8(1) * 8)
   
    ''''S盒运算32位结果
    For i = 0 To 7
        RetS(i * 4 + 0) = (S(i) And &H8) \ &H8
        RetS(i * 4 + 1) = (S(i) And &H4) \ &H4
        RetS(i * 4 + 2) = (S(i) And &H2) \ &H2
        RetS(i * 4 + 3) = (S(i) And &H1) \ &H1
    Next
   
   
    For i = 0 To 31
        ''''P变换
        CodeP(i) = RetS(P(i))
       
        ''''产生L1,R1
        R1(i) = L0(i) Xor CodeP(i)
        L1(i) = R0(i)
    Next
   
   
    ''''进行第二次迭代
    For i = 0 To 47
        CodeE(i) = R1(E(i))                 ''''经过E变换扩充,由32位变为48位
        CodeE(i) = CodeE(i) Xor K15(i)        ''''与K15按位作不进位加法运算
    Next
   
    ''''分8组
    For i = 0 To 5
        CodeS1(i) = CodeE(i)
        CodeS2(i) = CodeE(i + 6)
        CodeS3(i) = CodeE(i + 12)
        CodeS4(i) = CodeE(i + 18)
        CodeS5(i) = CodeE(i + 24)
        CodeS6(i) = CodeE(i + 30)
        CodeS7(i) = CodeE(i + 36)
        CodeS8(i) = CodeE(i + 42)
    Next
   
    ''''S盒运算,得到8个数
   
        S(0) = S1(CodeS1(5) + CodeS1(0) * 2, CodeS1(4) + CodeS1(3) * 2 + CodeS1(2) * 4 + CodeS1(1) * 8)
        S(1) = S2(CodeS2(5) + CodeS2(0) * 2, CodeS2(4) + CodeS2(3) * 2 + CodeS2(2) * 4 + CodeS2(1) * 8)
        S(2) = S3(CodeS3(5) + CodeS3(0) * 2, CodeS3(4) + CodeS3(3) * 2 + CodeS3(2) * 4 + CodeS3(1) * 8)
        S(3) = S4(CodeS4(5) + CodeS4(0) * 2, CodeS4(4) + CodeS4(3) * 2 + CodeS4(2) * 4 + CodeS4(1) * 8)
        S(4) = S5(CodeS5(5) + CodeS5(0) * 2, CodeS5(4) + CodeS5(3) * 2 + CodeS5(2) * 4 + CodeS5(1) * 8)
        S(5) = S6(CodeS6(5) + CodeS6(0) * 2, CodeS6(4) + CodeS6(3) * 2 + CodeS6(2) * 4 + CodeS6(1) * 8)
        S(6) = S7(CodeS7(5) + CodeS7(0) * 2, CodeS7(4) + CodeS7(3) * 2 + CodeS7(2) * 4 + CodeS7(1) * 8)
        S(7) = S8(CodeS8(5) + CodeS8(0) * 2, CodeS8(4) + CodeS8(3) * 2 + CodeS8(2) * 4 + CodeS8(1) * 8)
   
    ''''S盒运算32位结果
    For i = 0 To 7
        RetS(i * 4 + 0) = (S(i) And &H8) \ &H8
        RetS(i * 4 + 1) = (S(i) And &H4) \ &H4
        RetS(i * 4 + 2) = (S(i) And &H2) \ &H2
        RetS(i * 4 + 3) = (S(i) And &H1) \ &H1
    Next
   
   
    For i = 0 To 31
        ''''P变换
        CodeP(i) = RetS(P(i))
       
        ''''产生L2,R2
        R2(i) = L1(i) Xor CodeP(i)
        L2(i) = R1(i)
    Next
   
  

上一页  [1] [2] [3] [4] [5] [6] [7] [8]  下一页

打印本文 打印本文 关闭窗口 关闭窗口