手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>VB>列表

用vb实现DES加解密算法(三)(1)

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

Next
C13(26) = C12(0)
D13(26) = D12(0)
C13(27) = C12(1)
D13(27) = D12(1)

'组合C13,D13成C_D
For i = 0 To 27
C_D(i) = C13(i)
C_D(i 28) = D13(i)
Next

'PC_2转换,生成K13
For i = 0 To 47
K13(i) = C_D(PC_2(i))
Next

'***************************************************K14
'生成C14,D14
For i = 0 To 25
C14(i) = C13(i Lsi(14))
D14(i) = D13(i Lsi(14))
Next
C14(26) = C13(0)
D14(26) = D13(0)
C14(27) = C13(1)
D14(27) = D13(1)

'组合C14,D14成C_D
For i = 0 To 27
C_D(i) = C14(i)
C_D(i 28) = D14(i)
Next

'PC_2转换,生成K14
For i = 0 To 47
K14(i) = C_D(PC_2(i))
Next

'***************************************************K15
'生成C15,D15
For i = 0 To 25
C15(i) = C14(i Lsi(15))
D15(i) = D14(i Lsi(15))
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位

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!